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 相关文章推荐
一个高ai的分页函数和一个url函数
Oct 09 PHP
完美解决dedecms中的[html][/html]和[code][/code]问题
Mar 20 PHP
php 购物车的例子
May 04 PHP
php下网站防IP攻击代码,超级实用
Oct 24 PHP
PHP禁止页面缓存的代码
Oct 23 PHP
PHP函数学习之PHP函数点评
Jul 05 PHP
PHP setTime 设置当前时间的代码
Aug 27 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
Mar 18 PHP
PHP/HTML混写的四种方式总结
Feb 27 PHP
Mac系统完美安装PHP7详细教程
Jun 06 PHP
详解Laravel5.6 Passport实现Api接口认证
Jul 27 PHP
PHP设计模式(五)适配器模式Adapter实例详解【结构型】
May 02 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 中执行系统外部命令
2006/10/09 PHP
php读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法
2013/08/10 PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
2015/12/19 PHP
PHP 常用时间函数资料整理
2016/10/22 PHP
PHP内置函数生成随机数实例
2019/01/18 PHP
PHP实现递归的三种方法
2020/07/04 PHP
js如何判断用户是在PC端和还是移动端访问
2014/04/24 Javascript
JS判断字符串包含的方法
2015/05/05 Javascript
详解JavaScript操作HTML DOM的基本方式
2015/10/21 Javascript
js实现背景图自适应窗口大小
2017/01/10 Javascript
原生js实现中奖信息无间隙滚动效果
2017/01/18 Javascript
微信小程序 Toast自定义实例详解
2017/01/20 Javascript
js实现无缝滚动图(可控制当前滚动的方向)
2017/02/22 Javascript
字太多用...代替的方法(两种)
2017/03/15 Javascript
js控制文本框禁止输入特殊字符详解
2017/04/07 Javascript
Vue2.0利用vue-resource上传文件到七牛的实例代码
2017/07/28 Javascript
基于node.js之调试器详解
2017/08/22 Javascript
使用Dropzone.js上传的示例代码
2017/10/10 Javascript
js实现手机web图片左右滑动效果
2017/12/29 Javascript
2种在vue项目中使用百度地图的简单方法
2018/09/28 Javascript
详解解决小程序中webview页面多层history返回问题
2019/08/20 Javascript
浅谈Node新版本13.2.0正式支持ES Modules特性
2019/11/25 Javascript
python 动态获取当前运行的类名和函数名的方法
2014/04/15 Python
python基础入门学习笔记(Python环境搭建)
2016/01/13 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
2017/11/15 Python
运行tensorflow python程序,限制对GPU和CPU的占用操作
2020/02/06 Python
python安装dlib库报错问题及解决方法
2020/03/16 Python
pandas数据处理之绘图的实现
2020/06/15 Python
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
CSS3 文字动画效果
2020/11/12 HTML / CSS
匡威德国官网:Converse德国
2019/01/26 全球购物
this关键字的含义
2015/04/08 面试题
给老师的检讨书
2014/02/11 职场文书
监察局领导班子四风问题整改措施思想汇报
2014/10/05 职场文书
详解Vue的sync修饰符
2021/05/15 Vue.js
Python 数据科学 Matplotlib图库详解
2021/07/07 Python