redis实战(5):对文章进行分组

群组功能有两个部分组成,一个不是负责记录文章属于哪个群组,另外一个部分负责取出群组内的文章;

1 从群组中添加/删除文章

为了记录各个群组都保存了哪些文章,需要为每个群组创建一个集合,将所属同一个群组的文章ID保存到该集合

def add_remove_groups(conn,article_id,to_add=[],to_remove[]){
	article = "article:"+article_id
	for group in to_add
	 	conn.sadd("group:"+group,article)
	for group in to_remove
		conn.srem("group:"+group,article)
}

出看上起,可能觉得使用集合来记录群组文章没有多大用处。到目前为止,只看到集合结构检查某个元素是否存在的能力,但是实际上redis不仅可以对多个集合执行操作,甚至在一些情况下,可以在集合和有序集合之间操作;

为了能够根据评分对群组文章进行排序和分页,网站需要将同一个群组里的所有文章都按照评分有序的存储到zset中,redis的zinterstore可以接受多个集合和多个zset作为输入,找出交集。

2 从群组中获取文章

通过对存储群组文章的集合和存储文章评分的有序集合执行 zinterstore命令,程序可以得到按照文章评分排序的群组文章;而通过对存储群组文章的集合和存储文章发布时间的有序集合执行zinterstore命令,程序则可以得到按照文章发布时间排序的群组文章。如果群组包含的文章非常多,那么执行zinterstore 命令就会比较花时间,为了尽址减少 Redis 的工作址,程序会将这个命令的计算结果缓存 60 秒另外,我们还重用了已有的 get_articles()函数来分页并获取群组文章.

def get_group_articles(conn,group,page,order=-score:"){
	key = orider = group 
	if not conn.exists(key)
		conn,zinterstore(key,["group:"+group,order], aggregate="max",)
		conn.expire(key,60)
return get_articles(conn,page,key)
}

有的网站只允许用户将文章放在一个或者两个群组中,在这种情况下,最好直接将文章所在的群组记录到存储文章信息的hash中,并在article_vote()函数末尾增加一个zincrby的命令调用,用于更新文章所在群组中的评分。

相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页