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中取得image按钮传递的name值
Oct 09 PHP
解决phpmyadmin中文乱码问题。。。
Jan 18 PHP
基于Windows下Apache PHP5.3.1安装教程
Jan 08 PHP
php 学习资料零碎东西
Dec 04 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
Mar 01 PHP
PHP类的封装与继承详解
Sep 29 PHP
详解PHP的Yii框架中自带的前端资源包的使用
Mar 31 PHP
Yii数据模型中rules类验证器用法分析
Jul 15 PHP
CI框架常用经典操作类总结(路由,伪静态,分页,session,验证码等)
Nov 21 PHP
PHP面相对象中的重载与重写
Feb 13 PHP
php关联数组与索引数组及其显示方法
Mar 12 PHP
PHP dirname(__FILE__)原理及用法解析
Oct 28 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/05/04 PHP
PHP面向对象教程之自定义类
2014/06/10 PHP
PHP中__FILE__、dirname与basename用法实例分析
2014/12/01 PHP
php实现PDO中捕获SQL语句错误的方法
2017/02/16 PHP
阿里云PHP SMS短信服务验证码发送方法
2017/07/11 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
PHP设计模式之PHP迭代器模式讲解
2019/03/22 PHP
javascript 多种搜索引擎集成的页面实现代码
2010/01/02 Javascript
javascript将相对路径转绝对路径示例
2014/03/14 Javascript
JS数字抽奖游戏实现方法
2015/05/04 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
快速移动鼠标触发问题及解决方法(ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave)
2016/08/29 Javascript
AngularJs Modules详解及示例代码
2016/09/01 Javascript
详解JavaScript常量定义
2017/01/03 Javascript
bootstrap组件之按钮式下拉菜单小结
2017/01/19 Javascript
详解angularjs结合pagination插件实现分页功能
2017/02/10 Javascript
Javascript中引用类型传递的知识点小结
2017/03/06 Javascript
解决vue.js在编写过程中出现空格不规范报错的问题
2017/09/20 Javascript
从vue源码看props的用法
2019/01/09 Javascript
JS扁平化输出数组的2种方法解析
2019/09/17 Javascript
js实现3D旋转效果
2020/08/18 Javascript
vue浏览器返回监听的具体步骤
2021/02/03 Vue.js
python根据出生日期返回年龄的方法
2015/03/26 Python
python pandas实现excel转为html格式的方法
2018/10/23 Python
创建Django项目图文实例详解
2019/06/06 Python
python 常用日期处理-- datetime 模块的使用
2020/09/02 Python
HTML5 Canvas实现图片缩放、翻转、颜色渐变的代码示例
2016/02/28 HTML / CSS
世界领先的以旅馆为主的在线预订平台:Hostelworld
2016/10/09 全球购物
6号汽车旅馆预订:Motel 6
2018/02/11 全球购物
保安员岗位职责
2013/11/17 职场文书
《值日生》教学反思
2014/02/17 职场文书
医学专业毕业生求职信
2014/06/20 职场文书
欢迎新生标语
2014/10/06 职场文书
爸爸的三轮车观后感
2015/06/16 职场文书
2016优秀青年志愿者事迹材料
2016/02/25 职场文书