关于redis:文章投票分组排序Redis实战

8次阅读

共计 1031 个字符,预计需要花费 3 分钟才能阅读完成。


根底命令就跳过了,命令详情能够参照 redis.io 官网, 或者 Redis 中武官网

Redis 概要介绍:

Redis 是一个开源(BSD 许可)的,内存中的数据结构存储系统,它能够用作数据库、缓存和消息中间件。它反对多种类型的数据结构,如 字符串(strings),散列(hashes),列表(lists),汇合(sets),有序汇合(sorted sets)与范畴查问,bitmaps,hyperloglogs 和 天文空间(geospatial)索引半径查问。Redis 内置了 复制(replication),LUA 脚本(Lua scripting),LRU 驱动事件(LRU eviction),事务(transactions)和不同级别的 磁盘长久化(persistence),并通过 Redis 哨兵(Sentinel)和主动 分区(Cluster)提供高可用性(high availability)。


投票系统——仅反对票

目标:设计出一个随工夫流逝一直递加的评分零碎。同时实现按组的最热 / 最新。
分数计算形式:最终评分 = 文章反对票数 × 一个常量 + 文章公布工夫(Unix 工夫)
文章存储形式:

键为 article:92617,示意为 article 表中 id 为 92617 的文章(`hmset`)

实现:两个 zset:一个 key 为文章 id,score 为 $\underline{公布工夫}$;(最新)另一个 key 为文章 id,score 寄存 $\underline{评分}$。(最热)

避免用户屡次投票:用个 set 保留已投票用户 id。

性能实现

投票: 文章 hash 中 votes 的值加一 HINCRBY;记录 score 的 zset 中对应的 article 的 score 减少 ZINCRBY;对应的记录投票人员的 set 表退出该用户。(遵循一个事务)
公布: 生成 articleId,存储文章信息 hmset,生成 vote 汇合,生成 score,time 有序汇合。

获取: zrevrange/zrange获取最热 / 最新的 article_ids 汇合,通过遍历 id 来 hgetall 获取每篇文章的所有属性键值对。

分组: 新建一个名为 group 的 set 保留所有 article_id。

要使能按组获取最热 / 最新文章。 zinterstore命令 (比拟耗费工夫,能够设置为 60s 才过期)

get_group_articles()

当然,在 article 的 hash 中退出 group_id 来限度文章的分组个数。(这里投票时也要对 score:programming 进行加分)

正文完
 0