Rails 中用 Redis 搭建排行榜
因需要在网站在加入一个排行榜 ( leaderboard ),查了一下资料,说基本上都是用 Redis 来完成的。 于是记录一下学习过程。
安装( 需要 brew ):
brew install redis
设置 redis 随系统自启动
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
启动 redis ( 不使用 launchctl
)
redis-server /usr/local/etc/redis.conf
检查 redis 是否运行
redis-cli ping
PONG 表示成功运行
配置文件:
/usr/local/etc/redis.conf
卸载 redis
brew uninstall redis; rm ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
ref: How to Install and configure Redis on Ubuntu 14.04
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install redis-server
$ sudo service redis-server status
或查看默认端口是否启用
$ sudo netstat -naptu | grep LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 887/sshd
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 20478/redis-server
tcp6 0 0 :::22 :::* LISTEN 887/sshd
也可通过 redis 源码来进行安装
ref: How To Install and Configure Redis on Ubuntu 16.04
目标:用 Sorted Sets 来维护一个高分列表,假定名称为 leaderboard
。
所谓 Sorted Sets 就是一个字符串集合,它可以根据你设置的分数来排序。
命令:
zadd
: 来添加或更新得分, zrank
: 获取一个玩家的排名,正序zrevrank
: 获取一个玩家的排名,倒序zrange
: 获取玩家排名列表zrevrange
: 获取玩家排名列表zscore
: 获取玩家排名得分 zscore theboard "Bob"
zincrby
: 给玩家 Bob 增加 10 分 zincrby theboard 10 "Bob"
DEL
: 删除一个 key$ redis-cli
zadd
添加记录语法:zadd [set name] [score] [string]
zadd leaderboard 1 "Alice"
zadd leaderboard 30 "Bob"
zadd leaderboard 5300 "Carol"
zrevrange
倒序语法:zrevrange [set name] [first position] [second position]
注意:如果想从第一个开始,则 first position 要设为 0
zrevrange leaderboard 0 2
zrevrange leaderboard 0 99
127.0.0.1:6379> zrevrange leaderboard 0 2
1) "Carol"
2) "Bob"
3) "Alice"
同时也输出得分
127.0.0.1:6379> zrevrange leaderboard 0 2 withscores
1) "Carol"
2) "5300"
3) "Bob"
4) "30"
5) "Alice"
6) "1"
再添加一个玩家
zadd leaderboard 25 "Don"
再次获取前三名
127.0.0.1:6379> zrevrange leaderboard 0 2
1) "Carol"
2) "Bob"
3) "Don"
zadd
来更新得分zadd leaderboard 31 "Alice"
重新获取前三名
127.0.0.1:6379> zrevrange leaderboard 0 2
1) "Carol"
2) "Alice"
3) "Bob"
zrem
来删除数据语法:zrem [set name] [string]
zrem leaderboard "Carol"
127.0.0.1:6379> zrevrange leaderboard 0 2
1) "Alice"
2) "Bob"
3) "Don"
在 Redis 与所选择的编程语言之间,需要通过 Redis 客户端来通话。 可以在官方提供的列表中查询,推荐使用打星号的。
从中可以看到 Ruby 推荐使用 redis-rb
$ gem install redis
安装好之后,可以执行下面命令,查看是否成功安装
$ gem list redis
*** LOCAL GEMS ***
hiredis (0.6.1)
redis (4.0.1, 3.3.3)
redis-namespace (1.5.3)
redis-objects (1.3.0)
redis-session-store (0.9.1)
执行 irb
进入 Ruby 控制台
$ irb
2.3.1 :001 > require 'redis'
=> true
2.3.1 :002 > redis = Redis.new
=> #<Redis client v4.0.1 for redis://127.0.0.1:6379/0>
2.3.1 :003 > redis.set 'key', 'value'
=> "OK"
2.3.1 :004 > redis.get 'key'
=> "value"
在 Gemfile 中 group :development, :test do
上面添加 ` gem ‘redis-rails’`
Gemfile
+ gem 'redis-rails'
group :development, :test do
运行 bundle install
后重启 rails s
*
$ sudo apt-get install redis-server
查看是否正常运行
$ sudo service redis-server status
$ sudo systemctl status redis
或
$ redis-cli ping
会输出
PONG
配置文件: /usr/local/etc/redis.conf
$ sudo vi /etc/redis/redis.conf
将一些高危命令彻底关闭,来禁用远程修改 DB 文件地址
rename-command FLUSHALL ""
rename-command CONFIG ""
rename-command EVAL ""
并添加了密码
bind 127.0.0.1
# ....
requirepass foobar
去掉注释,加上一个强密码。这样就只能通过本机,并需要密码才能访问。
重启 redis
$ sudo service redis restart
127.0.0.1:6379> KEYS * 1) “quiz:13” 2) “quiz:53” 3) “quiz:117” 4) “quiz:55”