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安全配置
Oct 09 PHP
用定制的PHP应用程序来获取Web服务器的状态信息
Oct 09 PHP
php 时间计算问题小结
Jan 04 PHP
PHP 文件类型判断代码
Mar 13 PHP
frename PHP 灵活文件命名函数 frename
Sep 09 PHP
PHP5中使用DOM控制XML实现代码
May 07 PHP
PHP中使用循环实现的金字塔图形
Nov 08 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
Aug 17 PHP
PHP正则表达式过滤html标签属性(DEMO)
May 04 PHP
php 截取中英文混合字符串的方法
May 31 PHP
浅谈php调用python文件
Mar 29 PHP
PHP7 错误处理机制修改
Mar 09 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/11/18 PHP
PHPExcel读取EXCEL中的图片并保存到本地的方法
2015/02/14 PHP
PHP字典树(Trie树)定义与实现方法示例
2017/10/09 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
JS定义回车事件(实现代码)
2013/07/08 Javascript
CSS+jQuery实现的一个放大缩小动画效果
2013/09/24 Javascript
javascript文件中引用依赖的js文件的方法
2014/03/17 Javascript
解决js下referer兼容各大浏览器的方法
2014/11/03 Javascript
js实现的捐赠管理完整实例
2015/01/20 Javascript
JavaScript代码判断点击第几个按钮
2015/12/13 Javascript
jQuery绑定事件监听bind和移除事件监听unbind用法实例详解
2016/01/19 Javascript
js编写选项卡效果
2017/05/23 Javascript
VUE axios上传图片到七牛的实例代码
2017/07/28 Javascript
js制作简单的音乐播放器的示例代码
2017/08/28 Javascript
聊聊Vue.js的template编译的问题
2017/10/09 Javascript
vue引入新版 vue-awesome-swiper插件填坑问题
2018/01/25 Javascript
vue+Element实现搜索关键字高亮功能
2019/05/28 Javascript
Jquery如何使用animation动画效果改变背景色的代码
2020/07/20 jQuery
JavaScript经典案例之简易计算器
2020/08/24 Javascript
js实现日历
2020/11/07 Javascript
Python实现自定义顺序、排列写入数据到Excel的方法
2018/04/23 Python
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
对python requests的content和text方法的区别详解
2018/10/11 Python
详解HTML5 data-* 自定义属性
2018/01/24 HTML / CSS
银行柜员应聘推荐信范文
2013/11/24 职场文书
英文自荐信格式
2013/11/28 职场文书
心理健康教育心得体会
2013/12/29 职场文书
新学期开学寄语
2014/01/18 职场文书
测控技术自荐信
2014/06/05 职场文书
党的群众路线教育实践活动个人自我剖析材料
2014/10/07 职场文书
农民工工资保障承诺书
2015/05/04 职场文书
复兴之路展览观后感
2015/06/02 职场文书
张丽莉观后感
2015/06/16 职场文书
幼儿园安全管理制度
2015/08/05 职场文书
退休劳动合同怎么写?
2019/10/25 职场文书
Redis唯一ID生成器的实现
2022/07/07 Redis