PHP+Redis开发的书签案例实战详解


Posted in PHP onJuly 09, 2019

本文实例讲述了PHP+Redis开发的书签案例。分享给大家供大家参考,具体如下:

redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set 有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

场景

在项目开发过程中,相信大家都遇到过这样的场景——一个书籍表,一个书籍标签表,然后一本书可以有多个标签,这个场景就和CSDN发布文章时的文章标签差不多。

问题:如果我要查询多个标签共同的书籍,那么必须将表关联查询,这样影响效率。我们可以使用redis来帮忙。

案例思路

在添加书籍的时候,需要添加书籍和标签,将书籍保存到MySQL中,将标签保存到redis的set集合中,将每个标签看成一个set集合,然后每个标签保存的是书籍的id信息。如果需要查询多个标签共同的书籍,只需要将多个集合进行交集操作。

结果图

PHP+Redis开发的书签案例实战详解

项目结构图

PHP+Redis开发的书签案例实战详解

index.html文件

在这个页面是用来添加书籍的。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
  <title>Document</title>
</head>
<body>
  <form action="add.php" method="post">
    <p>请输入书名:<input type="text" name="title" /></p>
    <p>请输入标签:<input type="text" name="tags" /></p>
    <p><input type="submit" value="提交" /></p>
  </form>
</body>
</html>

add.php文件

这个文件主要处理添加书籍。

首先生成生成自增长的id,用来给书籍的id使用,然后将标签信息添加到redis中,最后使用pdo将书籍信息添加到数据库中。

<?php
$redis = new Redis();
$redis->connect('localhost',6379);
//生成自增长的id
$bid = $redis->incr('bid');
//将标签信息添加到redis中
$tags = explode(',',trim($_POST['tags'],','));
foreach($tags as $t){
  $redis->sAdd($t,$bid);
}
//使用pdo将书籍信息添加到数据库中
$dsn = 'mysql:host=localhost;dbname=test';
$pdo = new PDO($dsn,'root','1234');
$pdo->query('set names utf8');
$sql = 'insert into book values(?,?)';
$st = $pdo->prepare($sql);
$line = $st->execute([$bid,$_POST['title']]);
if($line != 0){
  echo '添加书籍成功';
}

search.php文件

这个文件主要处理搜索界面,也就是上面效果图的界面。首先创建一个redis对象并进行连接,然后获取地址栏的标签,然后将标签转换为数组,计算出用户输入标签的数量,因为每个标签都对应redis中的集合,所以给这几个集合取交集就可以了。

<?php
$redis = new Redis();
$redis->connect('localhost',6379);
$tags = explode(',',trim($_GET['tags'],','));
$len = count($tags);
if($len == 1){
  var_dump($redis->sMembers($tags[0]));
}else if($len == 2){
  var_dump($redis->sInter($tags[0],$tags[1]));
}else if($len == 3){
  var_dump($redis->sInter($tags[0],$tags[1],$tags[2]));
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
WINDOWS服务器安装多套PHP的另类解决方案
Oct 09 PHP
php随机输出名人名言的代码
Oct 07 PHP
php更新mysql后获取影响的行数发生异常解决方法
Mar 28 PHP
使用PHP实现蜘蛛访问日志统计
Jul 05 PHP
php实现事件监听与触发的方法
Nov 21 PHP
PHP中substr()与explode()函数用法分析
Nov 24 PHP
修改PHP脚本使WordPress拦截垃圾评论的方法示例
Dec 10 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
Jul 20 PHP
PHP判断表达式中括号是否匹配的简单实例
Oct 22 PHP
php中通用的excel导出方法实例
Dec 30 PHP
PHP如何搭建百度Ueditor富文本编辑器
Sep 21 PHP
基于PHP实现用户在线状态检测
Nov 10 PHP
使用composer命令加载vendor中的第三方类库 的方法
Jul 09 #PHP
Laravel+Intervention实现上传图片功能示例
Jul 09 #PHP
Laravel框架实现多个视图共享相同数据的方法详解
Jul 09 #PHP
Laravel5.1框架注册中间件的三种场景详解
Jul 09 #PHP
PHP使用 Pear 进行安装和卸载包的方法详解
Jul 08 #PHP
PHP 7.4中使用预加载的方法详解
Jul 08 #PHP
php apache开启跨域模式过程详解
Jul 08 #PHP
You might like
php版淘宝网查询商品接口代码示例
2014/06/17 PHP
Apache服务器下防止图片盗链的办法
2015/07/06 PHP
javascript showModalDialog 多层模态窗口实现页面提交及刷新的代码
2009/11/28 Javascript
从面试题学习Javascript 面向对象(创建对象)
2012/03/30 Javascript
JS简单实现登陆验证附效果图
2013/11/19 Javascript
JS显示日历和天气的方法
2016/03/01 Javascript
详解Angular2中的编程对象Observable
2016/09/17 Javascript
JS遍历对象属性的方法示例
2017/01/10 Javascript
vue.js 上传图片实例代码
2017/06/22 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
2018/02/23 Javascript
详解Require.js与Sea.js的区别
2018/08/05 Javascript
基于webpack4+vue-cli3项目实现换肤功能
2019/07/17 Javascript
javascript面向对象三大特征之继承实例详解
2019/07/24 Javascript
element中el-container容器与div布局区分详解
2020/05/13 Javascript
[02:44]DOTA2英雄基础教程 魅惑魔女
2014/01/07 DOTA
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
2018/06/04 Python
win8下python3.4安装和环境配置图文教程
2018/07/31 Python
老生常谈python中的重载
2018/11/11 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
2018/11/16 Python
pycharm 实现显示project 选项卡的方法
2019/01/17 Python
Python和Go语言的区别总结
2019/02/20 Python
详解Python odoo中嵌入html简单的分页功能
2019/05/29 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
2019/06/05 Python
使用TensorFlow实现简单线性回归模型
2019/07/19 Python
Python unittest生成测试报告过程解析
2020/09/08 Python
浅谈基于HTML5的在线视频播放方案
2016/02/18 HTML / CSS
美国在线宠物用品商店:Entirely Pets
2017/01/01 全球购物
英国最出名高街品牌:Forever Unique
2018/02/24 全球购物
体育活动总结范文
2014/05/04 职场文书
2014年秋季新学期寄语
2014/08/02 职场文书
2015年库房工作总结
2015/04/30 职场文书
导游词之山东红叶谷
2019/10/31 职场文书
Flask使用SQLAlchemy实现持久化数据
2021/07/16 Python
详解Golang如何优雅的终止一个服务
2022/03/21 Golang
golang生成vcf通讯录格式文件详情
2022/03/25 Golang
Java Spring Boot 正确读取配置文件中的属性的值
2022/04/20 Java/Android