项目中应用Redis+Php的场景


Posted in PHP onMay 22, 2016

前言

一些案例中有的同学说为什么不可以用string类型,string类型完全可以实现呀

我建议你看下我的专栏文章《Redis高级用法》,里面介绍了用hash类型的好处

商品维度计数

对商品喜欢数,评论数,鉴定数,浏览数进行计数
说起电商,肯定离不开商品,而附带商品有各种计数(喜欢数,评论数,鉴定数,浏览数,etc)
Redis的命令都是原子性的,你可以轻松地利用INCR,DECR等命令来计数。

采用Redis 的类型: Hash. 如果你对redis数据类型不太熟悉,可以参考
http://redis.io/topics/data-types-intro

为product定义个key product:,为每种数值定义hashkey, 譬如喜欢数like_num

$redis->hSet('product:123', 'like_num ', 5); // 添加 id为123的商品 like_num 为5
 
$redis->hIncrBy('product:123', 'like_num ', 1); // 添加 id为123的商品like_num +1

$redis->hGetAll('product:123'); // 获取id为123的商品相关信息
                  array('like_num '=> 1)

用户维度计数

对用户动态数、关注数、粉丝数、喜欢商品数、发帖数等计数
用户维度计数同商品维度计数都采用 Hash. 为User定义个key 为 user:
为每种数值定义hashkey, 譬如关注数follow

$redis->hSet('user:100000', 'follow ', 5); // 添加uid为10000的用户follow 为5
 
$redis->hIncrBy('user:100000', 'follow ', 1); // 更新uid为10000的用户follow +1

$redis->hGetAll('user:100000'); // 获取uid为10000的用户
                  array('like_num '=> 1)

                                
存储社交关系

譬如将用?舻暮糜?粉丝/关注,可以存在一个sorted set中,score可以是timestamp
默认集合按照score递增排序
这样求两个人的共同好友的操作,可能就只需要用求交集命令即可

$redis->zAdd('user:1000:follow', 1463557212, '1001'); 

                #uid为1000用户关注uid为1001 , score值设定时间戳1463557212

$redis->zAdd('user:1000:follow', 1463557333, '1002'); 

$redis->zAdd('user:2000:follow', 1463577568, '1001'); 

$redis->zAdd('user:2000:follow', 1463896964, '1003');
 
                #uid为2000用户关注1001和1003用户 , score值设定时间戳

$redis->zInter('com_fllow:1000:2000', array('user:1000:follow', 'user:2000:follow')); 

    #对集合'user:1000:follow'和'user:2000:follow'取交集'com_fllow:1000:2000'
    #获得共同关注的uid 

$redis->zRange('com_fllow:1000:2000',0,-1); // 获取全部集合元素
    #array('10001','10002')

用作缓存代替memcached

应用于商品列表,评论列表,@提示列表

相对memcached 简单的key-value存储来说,redis众多的数据结构(list,set,sorted set,hash,
etc)

可以更方便cache各种业务数据,性能也不亚于memcached。
NOTE: RPUSH pagewviews.user: EXPIRE pagewviews.user: 60 //注意要update timeout

反spam系统

应用系统评论、发布商品、论坛发贴的spam控制

作为一个电商网站被各种spam攻击是少不免(垃圾评论、发布垃圾商品、广告、刷自家商品排名等)

针对这些spam制定一系列anti-spam规则,其中有些规则可以利用redis做实时分析

譬如:1分钟评论不得超过2次、5分钟评论少于5次等(更多机制/规则需要结合drools )
常规sorted set将最近一天用户操作记录起来
(为什么不全部记录?节省memory,全部操作会记录到log,后续利用hadoop进行更全面分析统计)

#获取5秒内操作记录
$res = $redis->zRangeByScore('user:1000:comment', time() - 5, time());
#判断5秒内不能评论
if (!$res) {
  $redis->zAdd('user:1000:comment', time(), '评论内容');
} else {
  echo '5秒之内不能评论';
}

#5秒内评论不得超过2次
if($redis->zRangeByScore('user:1000:comment',time()-5 ,time())==1)
echo '5秒之内不能评论2次';

#5秒内评论不得少于2次

if(count($redis->zRangeByScore('user:1000:comment',time()-5 ,time()))<2)
echo '5秒之内不能评论2次';

用户Timeline/Feeds

应用于关注的人、主题、品牌及专栏

redis在这边主要当作cache使用

$redis->zAdd('user:2000:feed:topic', time(), '13');
//score 为timestamp uid为2000的用户关注tid为13的topic

$redis->expire('user:2000:feed:topic',24*60*60);
#关注有效期为24小时
# ttl 30天之内按秒数计算 30天之外以timestamp为准

最新列表&排行榜

用于记录用户刚刚喜欢的商品最新列表or排行榜 等业务场景

商品最新列表-sorted set结构呈现

$redis->zAdd('user:1000:product:like', time(), '3002');
    $redis->zAdd('user:1000:product:like', time(), '3001');
    $redis->zAdd('user:1000:product:like', time(), '3004');
    $redis->zAdd('user:1000:product:like', time(), '3003');
    
    $redis->zRange('user:1000:product:like', 0, -1,true); 
    #默认喜欢时间升序序排列
    #
      Array(
        [3002] => 1463565179
        [3001] => 1463565189
        [3004] => 1463565199
        [3003] => 1463565209
      )
    
    $redis->zRevRange('user:1000:product:like', 0, -1,true); 
    #以喜欢时间降序排列
    #
      Array
      (
        [3003] => 1463565424
        [3004] => 1463565414
        [3001] => 1463565404
        [3002] => 1463565394
      )

排行榜-list数据结构呈现

$redis->lPush('user:1000:product:like', '3002');
    $redis->lPush('user:1000:product:like', '3001');
    $redis->lPush('user:1000:product:like', '3004');
    $redis->lPush('user:1000:product:like', '3003');
    
    $redis->lRange('user:1000:product:like', 0, -1);
    
    Array
    (
      [0] => 3003
      [1] => 3004
      [2] => 3001
      [3] => 3002
    )

消息通知

采用Hash结构对消息通知业务场景计数

$redis->hSet('user:1000:message:notice', 'system', 1);
#设置1条未读系统消息

$redis->hIncrBy('user:1000:message:notice', 'system', 1);
#未读系统消息+1

$redis->hSet('user:1000:message:notice', 'comment', 1);
#设置1条未读评论

$redis->hIncrBy('user:1000:message:notice', 'comment', 1);
#未读评论+1

$redis->hGetAll('user:1000:message:notice');
#查看所有消息通知数量

Array
(
  [system] => 2
  [comment] => 2
)

将Redis用作消息队列

采用Redis的List数据结构实现分布式的消息队列

PHP 相关文章推荐
php 魔术方法使用说明
Oct 20 PHP
PHP 工厂模式使用方法
May 18 PHP
php中{}大括号是什么意思
Dec 01 PHP
CI(CodeIgniter)框架介绍
Jun 09 PHP
分享一则PHP定义函数代码
Feb 26 PHP
PHP查找数值数组中不重复最大和最小的10个数的方法
Apr 20 PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
Jul 29 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
Oct 01 PHP
thinkphp跨库操作的简单代码实例
Sep 22 PHP
PHP缩略图生成和图片水印制作
Jan 07 PHP
PHP性能分析工具xhprof的安装使用与注意事项
Dec 19 PHP
PHP实现求连续子数组最大和问题2种解决方法
Dec 26 PHP
Yii2.0 模态弹出框+ajax提交表单
May 22 #PHP
php文件上传后端处理小技巧
May 22 #PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
May 22 #PHP
PHP+MySql+jQuery实现的&quot;顶&quot;和&quot;踩&quot;投票功能
May 21 #PHP
制作个性化的WordPress登陆界面的实例教程
May 21 #PHP
详解WordPress中添加友情链接的方法
May 21 #PHP
PHP框架Laravel插件Pagination实现自定义分页
Apr 22 #PHP
You might like
星际争霸中的对战模式介绍
2020/03/04 星际争霸
php下尝试使用GraphicsMagick的缩略图功能
2011/01/01 PHP
PHP面向对象——访问修饰符介绍
2012/11/08 PHP
PHP开发中csrf攻击的简单演示和防范
2017/05/07 PHP
Laravel 类和接口注入相关的代码
2019/10/15 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
在IE6下发生Internet Explorer cannot open the Internet site错误
2010/06/21 Javascript
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
js获取和设置属性的方法
2014/02/20 Javascript
js实现横向伸展开的二级导航菜单代码
2015/08/28 Javascript
深入浅析javascript立即执行函数
2015/10/23 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
2015/12/04 Javascript
微信小程序 WXDropDownMenu组件详解及实例代码
2016/10/24 Javascript
Bootstrap 实现查询的完美方法
2016/10/26 Javascript
ionic中的$ionicPlatform.ready事件中的通用设置
2017/06/11 Javascript
JS实现按钮颜色切换效果
2020/09/05 Javascript
微信小程序模板template简单用法示例
2018/12/04 Javascript
JavaScript使用ul中li标签实现删除效果
2019/04/15 Javascript
解决前后端分离 vue+springboot 跨域 session+cookie失效问题
2019/05/13 Javascript
用Vue.js在浏览器中实现裁剪图像功能
2019/06/18 Javascript
JavaScript队列结构Queue实现过程解析
2020/03/07 Javascript
Element el-button 按钮组件的使用详解
2021/02/01 Javascript
[52:57]2014 DOTA2国际邀请赛中国区预选赛 LGD-CDEC VS HGT
2014/05/21 DOTA
python3解析库lxml的安装与基本使用
2018/06/27 Python
Python文件读写常见用法总结
2019/02/22 Python
使用Keras训练好的.h5模型来测试一个实例
2020/07/06 Python
分享30个新鲜的CSS3打造的精美绚丽效果(附演示下载)
2012/12/28 HTML / CSS
新西兰领先的鞋类和靴子网上商城:Merchant 1948
2017/09/08 全球购物
安全生产汇报材料
2014/02/17 职场文书
信息技术毕业生自荐信范文
2014/03/13 职场文书
客户答谢会活动方案
2014/08/31 职场文书
擅自离岗检讨书
2014/09/12 职场文书
《猴王出世》教学反思
2016/02/23 职场文书
浅谈Python中对象是如何被调用的
2022/04/06 Python
对讲机知识
2022/04/07 无线电