为了节约内存,建议使用hashset而不是set/get的方式来使用Redis
Redis的命令都是原子性的,你可以轻松地利用INCR,DECR等命令来计数。
常见的模块比如商品,用户相关的计数,采用Redis 的类型: Hash.
商品:评论数,浏览数,收藏数等计数
用户:动态数、关注数、粉丝数、收藏商品数、发帖数等计数
消息:系统消息,评论提示等计数
// 添加 id为5945125的商品 浏览数 为5
$redis->hSet('goods:5945125', 'view_num ', 5);
// 添加 id为10011的用户粉丝数 +1
$redis->hIncrBy('user:10011', 'fans_num ', 1);
// 获取id为10011的用户相关信息
$redis->hGetAll('user:10011');
类似社区模块将用户的好友/粉丝/关注,可以存在一个sorted set中,score可以是timestamp
默认集合按照score递增排序
这样求两个人的共同好友的操作,可能就只需要用求交集命令即可
//uid为2000用户关注1001和1002用户 , score值设定时间戳
$redis->zAdd('user:1000:follow', 1463557212, '1001');
$redis->zAdd('user:1000:follow', 1463557333, '1002');
//uid为2000用户关注1001和1003用户 , score值设定时间戳
$redis->zAdd('user:2000:follow', 1463577568, '1001');
$redis->zAdd('user:2000:follow', 1463896964, '1003');
//对集合'user:1000:follow'和'user:2000:follow'取交集'com_fllow:1000:2000'来获得共同关注的uid
$redis->zInter('com_fllow:1000:2000', array('user:1000:follow', 'user:2000:follow'));
// 获取全部集合元素
$redis->zRange('com_fllow:1000:2000',0,-1);
相对memcached 简单的key-value存储来说,redis众多的数据结构(list,set,sorted set,hash,etc)
可以更方便cache各种业务数据,性能也不亚于memcached。
缓存的应用场景有很多,这个需要根据具体的业务来做,例如商品信息,评论列表等
应用系统评论、发布商品、论坛发贴的spam控制(垃圾评论、发布垃圾商品、广告、刷自家商品排名等)
针对这些spam制定一系列anti-spam规则,其中有些规则可以利用redis做实时分析
譬如:1分钟评论不得超过2次、5分钟评论少于5次等
常规sorted set将最近一天用户操作记录起来
//获取5秒内操作记录
$res = $redis->zRangeByScore('user:1000:comment', time() - 5, time());
//判断5秒内不能评论
if (!$res)
$redis->zAdd('user:1000:comment', time(), '评论内容');
else
echo '5秒之内不能评论';
用于记录用户刚刚喜欢的商品最新列表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);
//以喜欢时间降序排列
$redis->zRevRange('user:1000:product:like', 0, -1,true);
//排行榜-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);