前言
之前一章,我们大概了解了redis的5种数据结构,以及其简单使用,接下来我们就要针对具体的场景做一些分析!
例如:如何使用redis做一个投票网站的后端?
文章投票细节
- 构建一个投票网站,首先要做的就是为这个网站设置一些数值和限制条件:如果一篇文章获得了至少200张支持票(up vote),那么网站就认为这篇文章是一篇有趣的文章;假如这个网站每天发布1000篇文章,而其中50篇文章符合网站的有趣文章的要求,那么网站要做的就是把这50篇文章列表前100位至少一天;另外,这个网站暂时不提供投反对票(down vote)的功能。
- 为了产生一个能够随着时间流逝而不断减少的评分,程序需要根据文章的发布时间和当前时间来计算文章的评分,具体的方法计算为:将文章得到的支持票数量乘以一个常量,然后加上文章的发布时间,得出的结果就是文章的评分。
- 使用从UTC时区1970年1月1日到现在为止经过的秒数来计算文章评分,这个值通常被认为是Unix时间。之所以选择使用Unix时间,是因为在所有能够运行Redis的平台上面,使用编程语言获得这个值都是一件非常简单的事情。另外,计算评分时与支持票数量相乘的常量为432,这个常量是通过将一天的秒数(86400)除以文章展示一天所需的支持票数量(200)得出的:文章每获得一张支持票,程序就需要将文章的评分增加432分。
- 构建文章投票网站除了需要计算文章评分之外,还需要使用redis结构存储网站上的各种信息。对于网站里的每篇文章,程序都使用一个散列来存储文章的标题、指向文章的网址、发布文章的用户、文章的发布时间、文章得到的投票数量等信息。
文章投票使用两个有序集合来有序地存储文章:第一个有序集合的成员为文章ID,分值为文章的发布时间;第二个有序集合的成员同样为文章ID,而分值则为文章的评分。通过这两个有序集合,网站既可以根据文章发布的先后顺序来展示文章,又可以根据文章评分的高低来展示文章。
为了防止用户对同一篇文章进行多次投票,网站需要为每篇文章记录一个已投票用户名单。为此,程序将为每篇文章创建一个集合,并使用这个集合来存储所有已投票用户的ID。
为了尽量节约内存,我们规定当一篇文章发布期满一周之后,用户将不能在对他进行投票,文章的评分将被固定下来,而记录文章已投票的用户名单的集合也会被删除。
例如:当115423号用户给100408号文章投票的时候,数据结构发生的变化。
既然我们知道了网站计算文章评分的方法,也知道了网站存储数据所需的数据结构,是时候开始实现这个投票功能了!!!
具体业务: 当用户尝试对一篇文章进行投票时,程序需要使用ZSCORE命令检查记录文章发布时间的有序集合,判断文章的发布时间是否超过一周。如果文章已投票用户名单的集合里面。如果添加操作执行成功的话,那么说明用户是第一次对这篇文章进行投票,程序将使用ZINCRBY命令为文章的评分增加432分(HINCRBY)命令对散列记录的文章投票数量进行更新(HINCRBY命令用户对散列存储的值执行自增操作)
发布并获取文章细节
发布一篇新文章需要创建一个新的文章ID,这项工作可以通过对一个计数器(counter)执行INCR命令来完成。接着程序需要使用SADD将文章发布者的ID添加到记录文章已投票用户名单的集合里面,并使用EXPIRE命令为这个集合设置一个过期时间,让Redis在文章发布满一周之后,自动删除这个集合。之后,程序会使用HMSET命令来存储文章的相关信息,并执行两个ZADD命令,将文章的初始评分(initial score)和发布时间分别添加到两个相应的有序集合里面。
有了文章投票和文章发布功能,接下来就考虑如何取出评分最高的文章以及如何取出最新发布的文章了。为了实现这两个功能,程序需要先使用ZREVRANGE命令取出多个文章ID,然后在对每一个文章执行一次HGETALL命令来取出文章的详细信息,这个方法既可以用于取出评分最高的文章,又可以用于取出最新发布的文章。这里有个注意的地方,因为有序集合会根据成员的分值从小到大地排列顺序,所以使用ZREVRANGE 命令,以分值从大到小的排列顺序取出文章ID才是正确的做法。
目前很多网站都支持的群组(group)功能:这个功能可以让用户只看见与特定话题有关的文章,比如与“可爱的动物”有关的文章、与“政治”有关的文章、与“java编程”有关的文章或者介绍“Redis用法”的文章等等。
对文章进行分组
群组功能由两部分组成,一个部分负责记录文章属于哪个群组,另一个部分负责取出群组里面的文章。为了记录各个群组都保存了哪些文章,网站需要为每个群组创建一个集合,并将所有同属一个群组的文章ID都记录到那个集合里面。
记录自己看书的笔记历程,虽然有些东西是初次见到,但是学习之中获得的思维方式以及解决问题的策略,代码的书写确实给了我很大的触动!有些个人觉得不是特别important的东西就省略了!保留了书的精华,小伙伴们细细领悟《Redis实战》!!!