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 strcmp使用说明
Apr 22 PHP
七款最流行的PHP本地服务器分享
Feb 19 PHP
基于PHP输出缓存(output_buffering)的深入理解
Jun 13 PHP
PHP中使用CURL模拟登录并获取数据实例
Jul 01 PHP
php curl登陆qq后获取用户信息时证书错误
Feb 03 PHP
PHP使用strtotime计算两个给定日期之间天数的方法
Mar 18 PHP
php带抄送和密件抄送的邮件发送方法
Mar 20 PHP
php array_map使用自定义的函数处理数组中的每个值
Oct 26 PHP
PHP面向对象程序设计方法实例详解
Dec 24 PHP
PHP解决中文乱码
Apr 28 PHP
phpstorm 正则匹配删除空行、注释行(替换注释行为空行)
Jan 21 PHP
yii2.0框架使用 beforeAction 防非法登陆的方法分析
Sep 11 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
来自phpguru得Php Cache类源码
2010/04/15 PHP
PHP中foreach循环中使用引用要注意的地方
2011/01/02 PHP
通过PHP的内置函数,通过DES算法对数据加密和解密
2012/06/21 PHP
PHP设计模式之代理模式的深入解析
2013/06/13 PHP
Laravel4中的Validator验证扩展用法详解
2016/07/26 PHP
完美解决在ThinkPHP控制器中命名空间的问题
2017/05/05 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
js函数的引用, 关于内存的开销
2012/09/17 Javascript
js时间日期和毫秒的相互转换
2013/02/22 Javascript
jQuery页面加载初始化常用的三种方法
2014/06/04 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
2015/02/27 Javascript
Java File类的常用方法总结
2015/03/18 Javascript
原生js实现移动开发轮播图、相册滑动特效
2015/04/17 Javascript
基于jquery实现select选择框内容左右移动添加删除代码分享
2015/08/25 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
2016/11/23 Javascript
浅谈jquery页面初始化的4种方式
2016/11/27 Javascript
利用Jasmine对Angular进行单元测试的方法详解
2017/06/12 Javascript
详解使用angularjs的ng-options时如何设置默认值(初始值)
2017/07/18 Javascript
vue2.0 移动端实现下拉刷新和上拉加载更多的示例
2018/04/23 Javascript
jQuery实现移动端图片上传预览组件的方法分析
2020/05/01 jQuery
python监控linux内存并写入mongodb(推荐)
2017/09/11 Python
Python内置模块hashlib、hmac与uuid用法分析
2018/02/12 Python
python3使用SMTP发送简单文本邮件
2018/06/19 Python
零基础使用Python读写处理Excel表格的方法
2019/05/02 Python
pandas中的ExcelWriter和ExcelFile的实现方法
2020/04/24 Python
Roxy美国官网:澳大利亚冲浪、滑雪健身品牌
2016/07/30 全球购物
湖南卫视在线视频媒体平台:芒果TV
2019/10/30 全球购物
高三自我鉴定怎么写
2013/10/19 职场文书
难忘的一课教学反思
2014/04/30 职场文书
社团活动总结模板
2014/06/30 职场文书
装修活动策划方案
2014/08/27 职场文书
单位作风建设自查报告
2014/10/23 职场文书
建国大业电影观后感
2015/06/01 职场文书
使用Canvas绘制一个游戏人物属性图
2022/03/25 Javascript