参考:https://www.cnblogs.com/lxwphp/p/7727796.html
对商品喜欢数,评论数,鉴定数,浏览数进行计数,可以利用INCR,DECR等命令来计数
connect('127.0.0.1',6379);
$redis->hSet('product:123', 'like ', 1); // 添加 id为123的商品 like 为1
$redis->hIncrBy('product:123', 'like ', 1); // 添加 id为123的商品like +1
$a = $redis->hGetAll('product:123'); // 获取id为123的商品相关信息
print_r($a);
//输出:Array ( [like_num] => 2 )
//扩展板
对用户动态数、关注数、粉丝数、喜欢商品数、发帖数等计数 ,用户维度计数同商品维度计数都采用 Hash.
connect('127.0.0.1',6379);
$redis->hSet('user:100000', 'follow ', 5); // 添加uid为10000的用户follow 为5
$redis->hIncrBy('user:100000', 'follow ', 1); // 更新uid为10000的用户follow +1
$a = $redis->hGetAll('user:100000'); // 获取uid为10000的用户
print_r($a);
//输出:Array ( [follow ] => 6 )
譬如将用戶的好友/粉丝/关注,可以存在一个sorted set中,score可以是timestamp
默认集合按照score递增排序
这样求两个人的共同好友的操作,可能就只需要用求交集命令即可
connect('127.0.0.1',6379);
#uid为1000用户关注uid为1001\1002, score值设定时间戳1463557212\1463557333
$redis->zAdd('user:1000:follow', 1463557212, '1001');
$redis->zAdd('user:1000:follow', 1463557333, '1002');
#uid为2000用户关注uid为1001\1003, score值设定时间戳1463577568\1463896964
$redis->zAdd('user:2000:follow', 1463577568, '1001');
$redis->zAdd('user:2000:follow', 1463896964, '1003');
#对集合'user:1000:follow'和'user:2000:follow'取交集'com_fllow:1000:2000'
$redis->zInter('com_fllow:1000:2000', array('user:1000:follow', 'user:2000:follow'));
#获得共同关注的uid
$a = $redis->zRange('com_fllow:1000:2000',0,-1);
#获得uid为2000的用户关注了的人的uid
$b = $redis->zRange('user:1000:follow',0,-1,0);#默认为0,显示key值
$c = $redis->zRange('user:2000:follow',0,-1,1);#1显示全部数组内容
print_r($a);
echo '
';
print_r($b);
echo '
';
print_r($c);
//输出:Array ( [0] => 1001 )
//Array ( [0] => 1001 [1] => 1002 )
//Array ( [1001] => 1463577568 [1003] => 1463896964 )
(为什么不全部记录?节省memory,全部操作会记录到log,后续利用hadoop进行更全面分析统计)
connect('127.0.0.1',6379);
$key = 'user:1006:comment';
#获取5秒内操作记录
$res5 = $redis->zRangeByScore($key, time() - 5, time());
$res60 = $redis->zRangeByScore($key, time() - 60, time());
$res300 = $redis->zRangeByScore($key, time() - 300, time());
if ($com){
if (count($res300)>5)
return '5分钟之内不能评论5次';
if (count($res60)>=2)
return '1分钟之内不能评论2次';
if ($res5)
return '5秒之内不能评论';
else
$redis->zAdd($key, time(), time().$com);
/* #判断5分钟之内不能评论5次
if (count($res300)<=5) {
#判断1分钟之内不能评论2次
if (count($res60)<2){
#判断5秒之内是否有评论
if (!$res5){
$redis->zAdd($key, time(), time().$com);
} else {
echo '5秒之内不能评论';
}
} else {
echo '1分钟之内不能评论2次';
}
} else {
echo '5分钟之内不能评论5次';
}*/
}
$a = $redis->zRange($key,0,-1,0);#1显示全部数组内容
foreach ($a as $k => &$v){
$v = substr($v,10);
}
return $a;
}
$com = isset($_POST['com']) ? $_POST['com'] : '';
$res = rang($com);
print_r($res) ;
?>
应用于关注的人、主题、品牌及专栏,redis在这边主要当作cache使用
connect('127.0.0.1',6379);
//score 为timestamp uid为2000的用户关注tid为13的topic
$redis->zAdd('user:2000:feed:topic', time(), '我是话题1');
$redis->zAdd('user:2001:feed:topic', time(), '我是话题2');
# ttl 30天之内按秒数计算 30天之外以timestamp为准
$redis->expire('user:2000:feed:topic',24*60*60);#关注有效期为24小时
$redis->expire('user:2001:feed:topic',5);#关注有效期为5s
connect('127.0.0.1',6379);
$b = $redis->zRange('user:2000:feed:topic',0,-1,0);#默认为0,显示key值
$c = $redis->zRange('user:2001:feed:topic',0,-1,0);#默认为0,显示key值
print_r($b);
print_r($c);
商品最新列表-sorted set结构呈现
connect('127.0.0.1',6379);
foreach ($lists as $k=>$v){#将数据库查出来的数据放入redis缓存
$redis->zAdd('user:1000:product:name', time(), $v['title']);
}
$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');
#默认时间升序序排列
$a = $redis->zRange('user:1000:product:name', 0, -1,false);
//$a = $redis->zRange('user:1000:product:like', 0, -1,false);
print_r($a);
#以时间降序排列
$a = $redis->zRevRange('user:1000:product:like', 0, -1,true);
//$redis->flushAll();#清除数据
print_r($a);
队列排序
connect('127.0.0.1',6379);
$redis->lPush('user:1000:product:l', '3006');
$redis->lPush('user:1000:product:l', '3001');
$redis->lPush('user:1000:product:l', '3004');
$redis->lPush('user:1000:product:l', '3003');
$a = $redis->lRange('user:1000:product:l', 0, -1);
//$a = $redis->zRange('user:1000:product:like', 0, -1,true);
$redis->flushAll();
print_r($a);
采用Hash结构对消息通知业务场景计数
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
#设置1条未读系统消息
$redis->hSet('user:1000:message:notice', 'system', 0);
$redis->hIncrBy('user:1000:message:notice', 'system', 1);#未读系统消息+1
$redis->hSet('user:1000:message:notice', 'comment', 0);#设置1条未读评论
$redis->hIncrBy('user:1000:message:notice', 'comment', 1);#未读评论+1
#查看所有消息通知数量
$a = $redis->hGetAll('user:1000:message:notice');
print_r($a);
输出:Array ( [system] => 1 [comment] => 1 )