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 strtr() 函数使用说明
Nov 21 PHP
php str_pad() 将字符串填充成指定长度的字符串
Feb 23 PHP
php empty函数判断mysql表单是否为空
Apr 12 PHP
php安全配置 如何配置使其更安全
Dec 16 PHP
PHP常用的文件操作函数经典收藏
Apr 02 PHP
PHP实现HTML生成PDF文件的方法
Nov 07 PHP
php列出mysql表所有行和列的方法
Mar 13 PHP
php生成不重复随机数、数组的4种方法分享
Mar 30 PHP
php简单操作mysql数据库的类
Apr 16 PHP
PHP中each与list用法分析
Jan 08 PHP
Yii2 GridView实现列表页直接修改数据的方法
May 16 PHP
php实现的简单中文验证码功能示例
Jan 03 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实例分享之html转为rtf格式
2014/06/02 PHP
destoon文章模块调用企业会员资料的方法
2014/08/22 PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
2016/05/13 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
2019/04/02 PHP
解决php扩展安装不生效问题
2019/10/25 PHP
js版本A*寻路算法
2006/12/22 Javascript
用jQuery技术实现Tab页界面之二
2009/09/21 Javascript
始终在屏幕中间显示Div的代码(css+js)
2011/03/10 Javascript
TreeView 用法(有代码)(asp.net)
2011/07/15 Javascript
node.js中的fs.closeSync方法使用说明
2014/12/17 Javascript
jQuery中hide()方法用法实例
2014/12/24 Javascript
nodejs实现遍历文件夹并统计文件大小
2015/05/28 NodeJs
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
深入理解javascript函数参数与闭包
2016/12/12 Javascript
jQuery Validate验证表单时多个name相同的元素只验证第一个的解决方法
2016/12/24 Javascript
JavaScript实现shuffle数组洗牌操作示例
2019/01/03 Javascript
vue中的面包屑导航组件实例代码
2019/07/01 Javascript
小程序实现横向滑动日历效果
2019/10/21 Javascript
jquery实现弹窗(系统提示框)效果
2019/12/10 jQuery
Python文件的读写和异常代码示例
2017/10/31 Python
python2.7安装图文教程
2018/03/13 Python
运行django项目指定IP和端口的方法
2018/05/14 Python
idea创建springMVC框架和配置小文件的教程图解
2018/09/18 Python
Python3从零开始搭建一个语音对话机器人的实现
2019/08/23 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
2019/09/23 Python
Cotton On美国网站:澳洲时装连锁品牌
2016/10/25 全球购物
英国音乐设备和乐器商店:Gear4music
2017/10/16 全球购物
时尚设计师手表:The Watch Cabin
2018/10/06 全球购物
网友共享的几个面试题关于Java和Unix等方面的
2016/09/08 面试题
线程问题:wait()方法是定义在哪个类里面
2015/07/07 面试题
财务方面个人工作的自我评价
2013/12/28 职场文书
幼儿园中秋节活动方案
2014/02/06 职场文书
公证书标准格式
2014/04/10 职场文书
任长霞观后感
2015/06/16 职场文书
英语导游欢迎词
2015/09/30 职场文书
Java实现简单小画板
2022/06/10 Java/Android