使用Redis的有序集合类型,在Rails中创建简单的排行榜

Redis是什么?排行简单吗?

Redis中提供了一种称为”排序集合”的数据类型,使用它可以轻松创建类似访问排名的功能。下面是在Rails中的实现方法的备忘录。

关于已排序的集合类型的说明,这篇博客非常易懂。
在Redis中实现访问排名。

环境配置等。

首先安装Redis。

不要忘记 Gemfile。

gem 'redis'

接下来,在Rails的config/environments文件中编写终端点,并将其设置为环境变量。

ENV["REDIS"] = "http://localhost:6379"

在Rails的config/initializers文件中通过环境变量生成Redis对象。

require 'redis'

uri = URI.parse(ENV["REDIS"])
REDIS = Redis.new(host: uri.host, port: uri.port)

准备工作已经完成

保存和调用排名数据

如果要创建按类别分类的文章访问排行榜,可以在访问时设置类似这样的排行数据。

REDIS.zincrby "ranking/#{category.id}/#{Date.today.to_s}", 1, "#{article.id}"

如果要调用周排行榜前20个类别,可以合并关键字,得到这样的结果

(7.days.ago.to_date..Date.today).each do |date|
  keys << "ranking/#{category.id}/#{date.to_s}"
end
REDIS.zunionstore("ranking/#{category.id}/weekly", keys)
REDIS.zrevrange "ranking/#{category.id}/weekly", 0, 19

如果你想要附有分数的选项,请指明。

REDIS.zrevrange "ranking/#{category.id}/monthly", 0, 19, withscores: true

所有结果都会以数组形式返回

Redis太厉害了!

这种类型的排名当然可以通过关系型数据库加批处理来创建,但是经验告诉我们,它最终会出现问题,这在业界是司空见惯的事情。
至于排序好的集合类型除了用于排名之外,我还没有找到其他的用途,但得益于Redis的高速数据集,我们可以避免批处理出现问题,这是非常令人高兴的事情。

参考文献

在Mac上安装Redis
使用Redis实现访问排名
Ruby文档

服务的实施

我在这个地方尝试使用它。

麻布十番站的热门租赁物件排行榜,寻找房间的游牧者