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 相关文章推荐
使用Linux五年积累的一些经验技巧
Jun 20 PHP
浅析php面向对象public private protected 访问修饰符
Jun 30 PHP
Yii查询生成器(Query Builder)用法实例教程
Sep 04 PHP
PHP实现Soap通讯的方法
Nov 03 PHP
PHP中把对象数组转换成普通数组的方法
Jul 10 PHP
yii2中使用Active Record模式的方法
Jan 09 PHP
zend framework中使用memcache的方法
Mar 04 PHP
PHP大神的十大优良习惯
Sep 14 PHP
php获取服务器操作系统相关信息的方法
Oct 08 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
Mar 26 PHP
PHP 99乘法表的几种实现代码
Oct 13 PHP
php array_map()函数实例用法
Mar 03 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&amp;mysql(二)
2006/10/09 PHP
php表单敏感字符过滤类
2014/12/08 PHP
PHP自定义序列化接口Serializable用法分析
2017/12/29 PHP
javascript dom 操作详解 js加强
2009/07/13 Javascript
图片延迟加载的实现代码(模仿懒惰)
2013/03/29 Javascript
jquery之超简单的div显示和隐藏特效demo(分享)
2013/07/09 Javascript
jQuery中[attribute=value]选择器用法实例
2014/12/31 Javascript
使用js画图之画切线
2015/01/12 Javascript
javascript数组去重的六种方法汇总
2015/08/16 Javascript
详解javascript获取url信息的常见方法
2016/12/19 Javascript
JavaScript实现简单的隐藏式侧边栏功能示例
2018/08/31 Javascript
深入理解NodeJS 多进程和集群
2018/10/17 NodeJs
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
python 正则式 概述及常用字符
2009/05/07 Python
python删除特定文件的方法
2015/07/30 Python
python目录与文件名操作例子
2016/08/28 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
python实现linux下抓包并存库功能
2018/07/18 Python
对python3新增的byte类型详解
2018/12/04 Python
django的分页器Paginator 从django中导入类
2019/07/25 Python
python新手学习使用库
2020/06/11 Python
Python pip install之SSL异常处理操作
2020/09/03 Python
python把一个字符串切开的实例方法
2020/09/27 Python
用CSS3实现无限循环的无缝滚动的示例代码
2017/11/01 HTML / CSS
详解HTML5 LocalStorage 本地存储
2016/12/23 HTML / CSS
AmazeUI图片轮播效果的示例代码
2020/08/20 HTML / CSS
求职简历中个人的自我评价
2013/12/01 职场文书
公务员职业生涯规划书范文  
2014/01/19 职场文书
酒店端午节活动方案
2014/08/26 职场文书
购房委托书
2014/10/15 职场文书
倡议书作文
2015/01/19 职场文书
2015年社区纪检工作总结
2015/04/21 职场文书
报案材料怎么写
2015/05/25 职场文书
2015年支教教师工作总结
2015/07/22 职场文书
Mysql 如何批量插入数据
2021/04/06 MySQL
Python机器学习算法之决策树算法的实现与优缺点
2021/05/13 Python