前言

一些案例中有的同学说为什么不可以用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数据结构实现分布式的消息队列

Redis在Php项目中的实际应用场景的更多相关文章

  1. Redis在实际项目中的一应用场景

    1.在游戏的等级排名,可以将用户信息放入到redis的有序集合中,然后取得相应的排名,不用自己写代码去排序. 2.利用rediss的数据特性的自增,自减属性,可以将项目中的一些列入阅读数,点赞数放入到 ...

  2. redis在java项目中的使用

    在上一篇文章中已经讲了redis的spring配置,这篇将会描述redis在java项目中的使用. redis存储形式都是key-value(键值对),按照存储的内容分为两种,一种是存简单数据,即数字 ...

  3. Redis在新项目中的使用场景

    Redis在新项目中的使用场景 数据类型 使用场景 string 比如说,我想知道什么时候封锁一个Ip地址,Incrby命令(使用这个命令记录被访问的次数) Hash 存储用户的信息[id,name, ...

  4. redis缓存在项目中的使用

    关于redis为什么能作为缓存这个问题我们就不说了,直接来说一下redis缓存到底如何在项目中使用吧: 1.redis缓存如何在项目中配置? 1.1redis缓存单机版和集群版配置?(redis的客户 ...

  5. Redis在SSM项目中的简单使用

    一.基于SSM的Redis环境配置 前提是你的开发电脑安装和配置好了redis,如果没安装请看Window配置Redis环境和简单使用 1.1.pom文件中引入redis客户端jar包(pom.xml ...

  6. Redis在Laravel项目中的应用实例详解

    https://mp.weixin.qq.com/s/axIgNPZLJDh9VFGVk7oYYA 在初步了解Redis在Laravel中的应用 那么我们试想这样的一个应用场景 一个文章或者帖子的浏览 ...

  7. REDIS 在电商中的实际应用场景(转)

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

  8. 【新手总结】在.Net项目中使用Redis作为缓存服务

    最近由于项目需要,在系统缓存服务部分上了redis,终于有机会在实际开发中玩一下,之前都是自己随便看看写写,很零碎也没沉淀下来什么,这次算是一个系统学习和实践过程的总结. 和Redis有关的基础知识 ...

  9. 在.Net项目中使用Redis作为缓存服务

    转自:http://www.cnblogs.com/hohoa/p/5771255.html 最近由于项目需要,在系统缓存服务部分上了redis,终于有机会在实际开发中玩一下,之前都是自己随便看看写写 ...

随机推荐

  1. 如何去除本地文件与svn服务器的关联

    1.每个目录逐个去删除.svn文件夹 .svn属于隐藏文件夹,可通过操纵Windows文件资源管理器使隐藏文件可视,删除该文件,即可. 2.首先建立一个新文件,文件命名为remove-svn-fold ...

  2. ExpandableListView的完美实现,JSON数据源,右边自定义图片

    转载请标明出处: http://www.cnblogs.com/dingxiansen/p/8194669.html 本文出自:丁先森-博客园 最近在项目中要使用ExpandableListView来 ...

  3. Django中Q查询及Q()对象

    问题 一般我们在Django程序中查询数据库操作都是在QuerySet里进行进行,例如下面代码: >>> q1 = Entry.objects.filter(headline__st ...

  4. SegmentFault错误汇总

    在三个月的工作中,经常碰到SegmentFault的错误,有时候是因为计算集群问题导致,更多的时候是程序本身的问题,我计划将之后碰到的SegmentFault整合起来,一来方便日后查看,二来如果能帮助 ...

  5. winform socket编程之TCPListener

    运行结果: 服务端代码 using System; using System.Collections.Generic; using System.ComponentModel; using Syste ...

  6. 用Vue自己造个组件轮子,以及实践背后带来的思考

    前言 首先,向大家说声抱歉.由于之前的井底之蛙,误认为Vue.js还远没有覆盖到二三线城市的互联网小厂里.现在我错了,从我司的前端技术选型之路便可见端倪.以太原为例,已经有不少公司陆续开始采用Vue. ...

  7. Error: Your project contains C++ files but it is not using a supported native build system

    我在编写有关JNI的代码的时候回报这个错误,我在网上搜了相关的资料后,找到了一篇文章解决了这个问题,点击这里查看这篇文章,我在照着这篇文章尝试的时候,总有一些错误,现在我把自己详细的解决流程贴出来,供 ...

  8. 001_JS基础_JavaScript简介

    1.1 历史 JS的发展历史: http://www.w3school.com.cn/js/pro_js_history.asp 1.2 JavaScript简介 以下摘自维基百科对javascrip ...

  9. 运维架构服务监控Open-Falcon

    一. 介绍 监控系统是整个运维环节,乃至整个产品生命周期中最重要的一环,事前及时预警发现故障,事后提供翔实的数据用于追查定位问题.监控系统作为一个成熟的运维产品,业界有很多开源的实现可供选择.当公司刚 ...

  10. Python 解析构建数据大杂烩 -- csv、xml、json、excel

    Python 可以通过各种库去解析我们常见的数据.其中 csv 文件以纯文本形式存储表格数据,以某字符作为分隔值,通常为逗号:xml 可拓展标记语言,很像超文本标记语言 Html ,但主要对文档和数据 ...