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 相关文章推荐
PHP程序开发范例学习之表单 获取文本框的值
Aug 08 PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
Apr 09 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
Oct 31 PHP
PHP数据集构建JSON格式及新数组的方法
Nov 07 PHP
CI框架在CLI下执行占用内存过大问题的解决方法
Jun 17 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
Aug 21 PHP
CodeIgniter读写分离实现方法详解
Jan 20 PHP
在php的yii2框架中整合hbase库的方法
Sep 20 PHP
PHP标准库(PHP SPL)详解
Mar 16 PHP
php定期拉取数据对比方法实例
Sep 22 PHP
使用laravel根据用户类型来显示或隐藏字段
Oct 17 PHP
thinkphp 框架数据库切换实现方法分析
May 18 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 简单日历实现代码
2009/10/28 PHP
PHP __autoload函数(自动载入类文件)的使用方法
2012/02/04 PHP
yii2.0实现pathinfo的形式访问的配置方法
2016/04/06 PHP
PHP获取链表中倒数第K个节点的方法
2018/01/18 PHP
Laravel 在views中加载公共页面的实现代码
2019/10/22 PHP
Js 中debug方式
2010/02/07 Javascript
jquery控制display属性为none或block
2014/03/31 Javascript
使用console进行性能测试
2015/04/27 Javascript
Css3制作变形与动画效果
2015/07/24 Javascript
纯javascript实现分页(两种方法)
2015/08/26 Javascript
基于jQuery下拉选择框插件支持单选多选功能代码
2016/06/07 Javascript
微信小程序 免费SSL证书https、TLS版本问题的解决办法
2016/12/14 Javascript
jQuery简单实现MD5加密的方法
2017/03/03 Javascript
教你快速搭建Node.Js服务器的方法教程
2017/03/30 Javascript
详解Vue路由History mode模式中页面无法渲染的原因及解决
2017/09/28 Javascript
vue2.0 循环遍历加载不同图片的方法
2018/03/06 Javascript
angular6的table组件开发的实现示例
2018/12/26 Javascript
jQuery中getJSON跨域原理的深入讲解
2020/09/02 jQuery
ant design vue中日期选择框混合时间选择器的用法说明
2020/10/27 Javascript
[03:40]DOTA2抗疫特别篇《英雄年代》
2020/02/28 DOTA
Python获取文件所在目录和文件名的方法
2017/01/12 Python
基于DataFrame改变列类型的方法
2018/07/25 Python
python将txt文件读入为np.array的方法
2018/10/30 Python
使用Python自动化破解自定义字体混淆信息的方法实例
2019/02/13 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
2020/04/18 Python
CSS3 text-shadow实现文字阴影效果
2016/02/24 HTML / CSS
德国传统玻璃制造商:Cristalica
2018/04/23 全球购物
String和StringBuffer的区别
2015/08/13 面试题
人事档案接收函
2014/01/12 职场文书
中学生差生评语
2014/01/30 职场文书
办公室班子四风问题对照检查材料
2014/10/04 职场文书
大学生档案自我鉴定(2篇)
2014/10/14 职场文书
红白喜事主持词
2015/07/06 职场文书
创业计划书之外语培训班
2019/11/02 职场文书
HTML页面滚动时部分内容位置固定不滚动的实现
2021/04/14 HTML / CSS
详解MongoDB的条件查询和排序
2021/06/23 MongoDB