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语法(4)
Oct 09 PHP
sql注入与转义的php函数代码
Jun 17 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
Oct 01 PHP
PHP生成指定长度随机数最简洁的方法
Jul 14 PHP
typecho插件编写教程(三):保存配置
May 28 PHP
Symfony2实现从数据库获取数据的方法小结
Mar 18 PHP
php实现简单加入购物车功能
Mar 07 PHP
php readfile下载大文件失败的解决方法
May 22 PHP
PHP开发中解决并发问题的几种实现方法分析
Nov 13 PHP
php记录搜索引擎爬行记录的实现代码
Mar 02 PHP
php 获取xml接口数据的处理方法
May 31 PHP
PHP封装的数据库模型Model类完整示例【基于PDO】
Mar 14 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常用函数的使用汇总
2013/06/08 PHP
Codeigniter(CI)框架分页函数及相关知识
2014/11/03 PHP
php中session定期自动清理的方法
2015/11/12 PHP
对字符串进行HTML编码和解码的JavaScript函数
2010/02/01 Javascript
JQuery的一些小应用收集
2010/03/27 Javascript
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
2011/02/23 Javascript
Jquery插件easyUi表单验证提交(示例代码)
2013/12/30 Javascript
iframe里的页面禁止右键事件的方法
2014/06/10 Javascript
JavaScript三元运算符的多种使用技巧
2015/04/16 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
关于List.ToArray()方法的效率测试
2016/09/30 Javascript
原生js实现旋转木马轮播图效果
2017/02/27 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
layer弹出子iframe层父子页面传值的实现方法
2018/11/22 Javascript
node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)
2019/04/10 Javascript
用webpack4开发小程序的实现方法
2019/06/04 Javascript
JS把字符串格式的时间转换成几秒前、几分钟前、几小时前、几天前等格式
2019/07/10 Javascript
Vue循环遍历选项赋值到对应控件的实现方法
2020/06/22 Javascript
基于vue hash模式微信分享#号的解决
2020/09/07 Javascript
使用BeautifulSoup爬虫程序获取百度搜索结果的标题和url示例
2014/01/19 Python
python实现按行切分文本文件的方法
2016/04/18 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
python 切换root 执行命令的方法
2019/01/19 Python
python解释器安装教程的方法步骤
2020/07/02 Python
Python SQLAlchemy库的使用方法
2020/10/13 Python
Python LMDB库的使用示例
2021/02/14 Python
微软台湾官方网站:Microsoft台湾
2018/08/15 全球购物
开学典礼感言
2014/02/16 职场文书
五水共治一句话承诺
2014/05/30 职场文书
自荐信格式范文
2015/03/04 职场文书
经费申请报告
2015/05/15 职场文书
2015年学生资助工作总结
2015/05/25 职场文书
2019年个人工作总结范文
2019/03/25 职场文书
详解PHP服务器如何在有限的资源里最大提升并发能力
2021/05/25 PHP
python 进阶学习之python装饰器小结
2021/09/04 Python
IDEA 2022 Translation 未知错误 翻译文档失败
2022/04/24 Java/Android