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写的serv-u的web申请账号的程序
Oct 09 PHP
PHP获得用户使用的代理服务器ip即真实ip
Dec 31 PHP
AJAX for PHP简单表数据查询实例
Jan 02 PHP
PHP URL地址获取函数代码(端口等) 推荐
May 15 PHP
php笔记之:AOP的应用
Apr 24 PHP
PHP数据库链接类(PDO+Access)实例分享
Dec 05 PHP
php实现邮件发送并带有附件
Jan 24 PHP
php中http与https跨域共享session的解决方法
Dec 20 PHP
PHP文件操作方法汇总
Jul 01 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
Dec 23 PHP
在WordPress中使用wp_count_posts函数来统计文章数量
Jan 05 PHP
PHP文件系统管理(实例讲解)
Sep 19 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计算两个文件相对路径的方法
2015/03/14 PHP
两种php去除二维数组的重复项方法
2015/11/04 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
php模板引擎技术简单实现
2016/03/15 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
2016/03/17 PHP
php图像生成函数之间的区别分析
2012/12/06 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
2014/09/10 Javascript
js实现二级菜单渐隐显示
2015/11/03 Javascript
javascript特殊文本输入框网页特效
2016/09/13 Javascript
Dropzone.js实现文件拖拽上传功能(附源码下载)
2016/11/22 Javascript
JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)
2017/03/30 Javascript
纯原生js实现贪吃蛇游戏
2020/04/16 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
2017/12/25 jQuery
React Router v4 入坑指南(小结)
2018/04/08 Javascript
微信小程序自定义底部导航带跳转功能
2018/11/27 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
vue-cli随机生成port源码的方法
2019/09/02 Javascript
vue+element使用动态加载路由方式实现三级菜单页面显示的操作
2020/08/04 Javascript
基于JavaScript实现简单抽奖功能代码实例
2020/10/20 Javascript
Javascript数组及类数组相关原理详解
2020/10/29 Javascript
Django查询数据库的性能优化示例代码
2017/09/24 Python
Python面向对象实现一个对象调用另一个对象操作示例
2019/04/08 Python
Python实现微信中找回好友、群聊用户撤回的消息功能示例
2019/08/23 Python
python3 selenium自动化 下拉框定位的例子
2019/08/23 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
2020/10/18 Python
python中threading和queue库实现多线程编程
2021/02/06 Python
html5 postMessage前端跨域并前端监听的方法示例
2018/11/01 HTML / CSS
简述进程的启动、终止的方式以及如何进行进程的查看
2013/07/12 面试题
银行实习人员自我鉴定
2013/09/22 职场文书
医院总经理职责
2013/12/26 职场文书
2014年六一儿童节演讲稿
2014/05/23 职场文书
团委工作总结2015
2015/04/02 职场文书
创业计划书之游泳馆
2019/09/16 职场文书
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技
python数字图像处理:图像的绘制
2022/06/28 Python
Springboot集成kafka高级应用实战分享
2022/08/14 Java/Android