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 相关文章推荐
搜索引擎技术核心揭密
Oct 09 PHP
在任意字符集下正常显示网页的方法一
Apr 01 PHP
攻克CakePHP系列三 表单数据增删改
Oct 22 PHP
php+js iframe实现上传头像界面无跳转
Apr 29 PHP
php和editplus正则表达式去除空白行
Apr 17 PHP
PHP Hash算法:Times33算法代码实例
May 13 PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
Oct 11 PHP
PHP实现的redis主从数据库状态检测功能示例
Jul 20 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
php 广告点击统计代码(php+mysql)
Feb 21 PHP
PHP分享图片的生成方法
Apr 25 PHP
PHP 数组操作详解【遍历、指针、函数等】
May 13 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/12/30 PHP
php导出中文内容excel文件类实例
2015/07/06 PHP
PHP函数checkdnsrr用法详解(Windows平台用法)
2016/03/21 PHP
php版微信公众平台入门教程之开发者认证的方法
2016/09/26 PHP
js 新浪的一个图片播放图片轮换效果代码
2008/07/15 Javascript
javascript 复杂的嵌套环境中输出单引号和双引号
2009/05/26 Javascript
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
复制js对象方法(详解)
2013/07/08 Javascript
js控制表单奇偶行样式的简单方法
2013/07/31 Javascript
js加载之使用DOM方法动态加载Javascript文件
2013/11/08 Javascript
javascript图片滑动效果实现
2021/01/28 Javascript
jQuery实现鼠标跟随提示层效果代码(可显示文本,Div,Table,Html等)
2016/04/18 Javascript
JavaScript中object和Object的区别(详解)
2017/02/27 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图和饼图的组合图效果示例【附demo源码下载】
2017/03/09 Javascript
一次围绕setTimeout的前端面试经验分享
2017/06/15 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
2017/12/06 Javascript
Nodejs中使用puppeteer控制浏览器中视频播放功能
2019/08/26 NodeJs
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
2020/05/14 Javascript
详解Vue之事件处理
2020/07/10 Javascript
微信小程序上传帖子的实例代码(含有文字图片的微信验证)
2020/07/11 Javascript
python 读写、创建 文件的方法(必看)
2016/09/12 Python
Pycharm设置界面全黑的方法
2018/05/23 Python
通过Python模块filecmp 对文件比较的实现方法
2018/06/29 Python
Python中staticmethod和classmethod的作用与区别
2018/10/11 Python
通过实例解析python创建进程常用方法
2020/06/19 Python
Pycharm 设置默认解释器路径和编码格式的操作
2021/02/05 Python
css3气泡 css3关键帧动画创建的动态通知气泡
2013/02/26 HTML / CSS
canvas实现俄罗斯方块的方法示例
2018/12/13 HTML / CSS
越南母婴用品购物网站:Kids Plaza
2020/04/09 全球购物
《厄运打不垮的信念》教学反思
2014/04/13 职场文书
学校食品安全责任书
2015/01/29 职场文书
沂蒙六姐妹观后感
2015/06/08 职场文书
法人代表证明书范本
2015/06/18 职场文书
幼儿园语言教学反思
2016/02/23 职场文书
一文弄懂MySQL中redo log与binlog的区别
2022/02/15 MySQL
Win11 PC上的Outlook搜索错误怎么办?
2022/07/15 数码科技