使用mruby-redis实现排名制度
-
- 首先
-
- 这次我们将使用mruby-redis来实现排名。Redis是一个基于键值对的内存数据库。键是字符串,值可以保存各种类型的数据。
值的类型
值的类型包括String,Hash,List,Set,Sorted Set这五种类型。
• String – 字符串
• Hash – 关联数组。可以存储多个元素,并且可以为字符串的键设置值
• List – 可以存储多个元素,并且有顺序
• Set – 只能存储唯一的值的集合
• Sorted Set – 只能存储唯一的值,并且按照给定的分数进行排序
使用mruby-redis实现排名
mruby-redis是从mruby访问Redis的MGEM。这次我们将使用Sorted Set来实现排名。
安装mruby-redis
首先,下载mruby
$ git clone https://github.com/mruby/mruby
然后,在build_config.rb文件中添加以下内容
MRuby::Build.new do |conf|
# …(省略)…
conf.gem :git => ‘https://github.com/matsumoto-r/mruby-redis.git’
end
我会进行建设。
```text
$ rake
```
-
- 启动redis-server
-
- 请在本地安装并启动redis-server
排名
当添加用户ID和分数后,将按照分数从高到低的顺序进行排序并显示。实现排名的ranking.rb如下所示
ranking.rb
host = “127.0.0.1”
port = 6379
database = 0
redis = Redis.new(host, port)
redis.select(database)
# 插入/更新数据
#redis.zadd(high-score”, score, user_id)
redis.zadd(“high-score”, 400, “lion”)
redis.zadd(“high-score”, 650, “cat”)
redis.zadd(“high-score”, 800, “dog”)
redis.zadd(“high-score”, 700, “bug”)
# 返回数据的排名
high_score_list = redis.zrevrange(“high-score”, 0, -1)
puts “排名 姓名 分数”
puts “———————”
high_score_list.each do |name|
puts “#{redis.zrevrank(“high-score”, name) + 1}: #{name} #{redis.zscore(“high-score”, name)}”
end
redis.close
执行结果如下所示
$ mruby ranking.rb
排名 姓名 分数
———————
1: dog 800
2: bug 700
3: cat 650
4: lion 400
mruby-redis方法解释
• Redis#select(数据库)选择从0到15个数据库。这里选择了0
• Redis#zadd(键名, 分数, 用户ID)在键名的有序集合中添加分数和用户ID
• Redis#zrevrange(键名, 起始索引, 结束索引)根据分数以降序返回有序集合。通过起始索引和结束索引指定返回的范围。起始索引从0开始。同时,末尾为-1, -2等。 redis.zrevrange(“high-score”, 0, -1)将返回根据分数降序排列的所有元素。顺便说一下,升序为Redis#zrange(键名, 起始索引, 结束索引)
• Redis#zrevrank(键名, 用户ID)返回降序排名。排名从0开始。顺便说一下,升序排名为Redis#zrank(键名, 用户ID)
• Redis#zscore(键名, 用户ID)返回分数
结束语
通过使用Redis的有序集合实现了排名功能。有序集合会在每次执行Redis#zadd时进行排序,因此非常适合实时排名。