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 相关文章推荐
BBS(php &amp; mysql)完整版(二)
Oct 09 PHP
PHP输出时间差函数代码
Jan 28 PHP
基于curl数据采集之单页面并行采集函数get_htmls的使用
Apr 28 PHP
PHP把网页保存为word文件的三种方法
Apr 01 PHP
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
Jun 12 PHP
微信公众平台网页授权获取用户基本信息中授权回调域名设置的变动
Oct 21 PHP
PHP SPL标准库之SplFixedArray使用实例
May 12 PHP
PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
Jan 09 PHP
php+ajax简单实现全选删除的方法
Dec 06 PHP
Yii框架弹出窗口组件CJuiDialog用法分析
Jan 07 PHP
PHP生成图片验证码功能示例
Jan 12 PHP
PHP抽象类与接口的区别详解
Mar 21 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
destoon调用企业会员公司形象图片的实现方法
2014/08/21 PHP
php实现微信扫码支付
2017/03/26 PHP
PHP程序员必须知道的两种日志实例分析
2020/05/14 PHP
基于php解决json_encode中文UNICODE转码问题
2020/11/10 PHP
裁剪字符串trim()自定义改进版
2013/04/10 Javascript
jquery ajax实现下拉框三级无刷新联动,且保存保持选中值状态
2013/10/29 Javascript
原生javascript实现图片按钮切换
2015/01/12 Javascript
js简单时间比较的方法
2016/08/02 Javascript
JS判断指定dom元素是否在屏幕内的方法实例
2017/01/23 Javascript
JavaScript运动框架 链式运动到完美运动(五)
2017/05/18 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
浅谈关于JS下大批量异步任务按顺序执行解决方案一点思考
2019/01/08 Javascript
JS实现音乐导航特效
2020/01/06 Javascript
vue实现图片上传到后台
2020/06/29 Javascript
[00:35]2016完美“圣”典风云人物:冷冷宣传片
2016/12/08 DOTA
Python3 适合初学者学习的银行账户登录系统实例
2017/08/08 Python
python简单商城购物车实例代码
2018/03/15 Python
总结Python图形用户界面和游戏开发知识点
2019/05/22 Python
用Python做一个久坐提醒小助手的示例代码
2020/02/10 Python
pandas DataFrame 数据选取,修改,切片的实现
2020/04/24 Python
Python selenium爬取微信公众号文章代码详解
2020/08/12 Python
python mongo 向数据中的数组类型新增数据操作
2020/12/05 Python
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
Sneaker Studio乌克兰:购买运动鞋
2018/03/26 全球购物
高中毕业生自我鉴定例文
2013/12/29 职场文书
文明学生标兵事迹
2014/01/21 职场文书
小学国庆节活动方案
2014/02/11 职场文书
幼儿园家长寄语
2014/04/02 职场文书
2014年重阳节敬老活动方案
2014/09/16 职场文书
2014年监理个人工作总结
2014/12/11 职场文书
2015年度党风廉政建设工作情况汇报
2015/01/02 职场文书
2019个人半年工作总结
2019/06/21 职场文书
如何计划开一家便利店?
2019/07/31 职场文书
2019大学生社会实践报告汇总
2019/08/16 职场文书
导游词之西江千户苗寨
2019/12/24 职场文书
Java Shutdown Hook场景使用及源码分析
2021/06/15 Java/Android