84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
像网易新闻收藏的功能,如果使用redis做缓存的话,应该如何实现?
业精于勤,荒于嬉;行成于思,毁于随。
如果新闻有ID或者唯一标识符的话。可以考虑用redis的集合类型。而且集合的唯一性,防止了重复添加问题! redis.sadd('personmark:userID',newsID);//向用户集合添加一个元素 redis.smembers('personmark:userID');//一次性获取用户所有收集的新闻ID
使用排序集合zset; key为用户ID; member为新闻唯一性ID; score为以之前某一天开始的日期增量(比如,从2015-1-1日开始算,今天的score就是155?);有了score之后就取出来就不用再排序,直接显示; zadd(key, score, member):添加新闻 zrank(key, member):按score从小到大返回,也就是收藏的新闻按日期从新往旧排序; zrangebyscore(key, min, max):返回score从start到end的集合,用来实现新闻的翻页显示;
key: news_fav_uid value: 新闻ID的集合(数组) 其中uid是用户ID. $news_ids = array(1024,1025,1026); echo json_encode($news_ids); 无论你用的是Memcached/Redis/MySQL都可以这样存储. array_push把新的收藏压到$news_ids数组的末尾. 你要按时间排序,只需要json_decode解码后array_reverse翻转数组后foreach输出.
1楼的回答很好了,只是来补充一句,这里没必要把redis当成缓存了,直接作为数据存储吧,因为redis也是数据库
如果新闻有ID或者唯一标识符的话。可以考虑用redis的集合类型。而且集合的唯一性,防止了重复添加问题!
redis.sadd('personmark:userID',newsID);//向用户集合添加一个元素
redis.smembers('personmark:userID');//一次性获取用户所有收集的新闻ID
使用排序集合zset;
key为用户ID;
member为新闻唯一性ID;
score为以之前某一天开始的日期增量(比如,从2015-1-1日开始算,今天的score就是155?);有了score之后就取出来就不用再排序,直接显示;
zadd(key, score, member):添加新闻
zrank(key, member):按score从小到大返回,也就是收藏的新闻按日期从新往旧排序;
zrangebyscore(key, min, max):返回score从start到end的集合,用来实现新闻的翻页显示;
key: news_fav_uid
value: 新闻ID的集合(数组)
其中uid是用户ID.
$news_ids = array(1024,1025,1026);
echo json_encode($news_ids);
无论你用的是Memcached/Redis/MySQL都可以这样存储.
array_push把新的收藏压到$news_ids数组的末尾.
你要按时间排序,只需要json_decode解码后array_reverse翻转数组后foreach输出.
1楼的回答很好了,只是来补充一句,这里没必要把redis当成缓存了,直接作为数据存储吧,因为redis也是数据库