百科:
Redis - 维基百科
推荐:
Redis 教程 - 菜鸟
请习惯查看官网
常用命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # 连接并执行命令 redis-cli -u redis://worker:123456789@localhost:6379/0 acl list acl list # 查看 ACL 列表。返回 Redis 服务器中所有已配置的用户账户及其权限规则的完整列表。 client list # 查看客户端连接。返回当前连接到 Redis 服务器的所有客户端连接的详细信息,用于实时监控和排查问题。 config get dbfilename # 获取配置项 config get maxmemory* # 通配符获取配置项。 info replication # 查看复制状态。返回关于当前 Redis 实例的主从角色、连接状态、同步偏移量等复制相关信息。 info memory # 查看内存状态。 info persistence # 查看持久化状态。 info server # 查看服务器信息,包括版本、操作系统、架构、监听端口以及启动时间等。 select 0 # 切换数据库。将当前客户端操作的逻辑数据库切换到编号为 0 的数据库(默认有 16 个数据库,编号 0 到 15)。 dbsize # 获取键数量。返回当前选定数据库中 Key 的总数量(不包括过期 Key)。 flushdb # 清空当前数据库。危险操作!清除当前 (SELECT 选中) 数据库中的所有 Key。 flushall # 清空所有数据库。极度危险操作!清除 Redis 实例中所有数据库的所有 Key。
可视化工具 RedisInsight https://github.com/redis/RedisInsight ,README 中有下载链接。
RedisInsight 是 Redis 官网可视化工具,前身为 Redis Desktop Manager。
AnotherRedisDesktopManager https://github.com/qishibo/AnotherRedisDesktopManager
官方 https://redis.io/
https://github.com/redis/redis
Docs https://redis.io/docs/latest/
包括:Get started 、使用 Redis Insight 优化 Redis 、Redis 客户端 API 库 。
包括:Redis products 、Commands 、APIs 。
Linux下载与安装 从源代码构建的官方文档:https://redis.io/docs/latest/operate/oss_and_stack/install/build-stack/
环境 系统:Ubuntu 24.04
Redis版本:
检查 1 2 3 4 5 6 find / | grep redis.conf find / | grep .*redis.* # ubuntu ufw status ufw disable
安装所需依赖项 见官方文档。
下载并解压 Redis 源代码 https://github.com/redis/redis/releases
1 2 3 4 5 mkdir -p /data/local/redis/log mkdir -p /data/local/redis/pid mkdir -p /data/local/redis/cluster cd /data/local tar -zxvf redis-8.4.0.tar.gz
构建 1 2 3 4 5 6 7 8 9 10 11 12 13 cd /data/local/redis-8.4.0 # 设置相应的环境变量以启用 TLS、模块和其他构建选项,然后编译 export BUILD_TLS=yes export BUILD_WITH_MODULES=yes export INSTALL_RUST_TOOLCHAIN=yes export DISABLE_WERRORS=yes make distclean make # 或 make -j "$(nproc)" all # 验证是否已成功构建 ./src/redis-server --version ./src/redis-cli --version
安装 1 2 3 4 cd /data/local/redis-8.4.0 # 安装到指定目录 make PREFIX=/data/local/redis install make uninstall
参考 环境变量持久化 配置环境变量:
1 2 3 4 5 grep -qxF 'export PATH=/data/local/redis/bin:$PATH' /etc/profile || \ echo 'export PATH=/data/local/redis/bin:$PATH' >> /etc/profile source /etc/profile which redis-server
访问控制列表(ACL) https://redis.io/docs/latest/operate/oss_and_stack/management/security/acl/
Redis ACL(Access Control List,访问控制列表)是一种安全机制,允许管理员对连接进行精细化限制,定义用户可以执行的命令和可以访问的键(Keys)。
1 2 3 4 5 cd /data/local/redisecho "user worker on ~* &* +@all >123456789" > /data/local/redis/users.aclecho "user default on ~* &* +@all >123456789" >> /data/local/redis/users.acl
用户权限规则主要由三个关键部分构成:
权限开关 (Enablement)
示例: user <username> on/off
作用: 明确该用户是否处于启用 (on) 或禁用 (off) 状态。
数据访问限制 (Key/Channel Access)
键模式 (~): 定义该用户可以访问和操作哪些键。
例如:~logs:* 只允许访问以 logs: 开头的键。
~* 允许访问所有键。
Pub/Sub 频道 (&): 定义该用户可以订阅和发布到哪些 Pub/Sub 频道。
例如:&updates 只允许访问名为 updates 的频道。
&* 允许访问所有频道。
命令执行限制 (Command Permissions)
命令集 (+@ / -@ / + / -): 明确该用户可以执行或禁止执行哪些命令或命令组。
+@all : 允许执行所有命令(最高权限)。
+@read : 允许执行所有只读命令(如 GET, HGETALL)。
-FLUSHDB : 显式禁止执行 FLUSHDB 命令。
单机模式 配置文件(master节点) https://github.com/redis/redis/blob/unstable/redis.conf
1 2 3 4 5 # 从解压目录复制一份配置文件,用于自定义配置文件的 include 指令 cp /data/local/redis-8.4.0/redis.conf /data/local/redis/redis.conf # 新建配置文件(master节点) vim /data/local/redis/redis_6379.conf
自定义配置文件内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 include /data/local/redis/redis.conf bind * -::* protected-mode no port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize yes pidfile /data/local/redis/pid/redis_6379.pid loglevel notice logfile "/data/local/redis/log/redis_6379.log" databases 16 aclfile /data/local/redis/users.acl requirepass 123456789 maxclients 10000 maxmemory 104857600 maxmemory-policy noeviction maxmemory-samples 5 replica-ignore-maxmemory yes active-expire-effort 1 save 3600 1 300 100 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump_6379.rdb dir /data/local/redis/ appendonly yes appendfilename "appendonly_6379.aof" appenddirname "appendonlydir_6379" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb masterauth 123456789 masteruser worker replica-serve-stale-data yes replica-read-only yes repl-diskless-sync yes repl-diskless-sync-delay 5 repl-diskless-sync-max-replicas 0 repl-diskless-load disabled repl-ping-replica-period 10 repl-timeout 60 repl-disable-tcp-nodelay no replica-priority 100 cluster-config-file /data/local/redis/cluster/nodes-6379.conf cluster-node-timeout 15000 cluster-require-full-coverage yes
单例启动 1 2 3 # 服务器启动与状态检查 redis-server /data/local/redis/redis_6379.conf ps -ef | grep redis
客户端连接与认证 1 2 3 4 5 6 7 8 9 # 客户端连接+认证 redis-cli -u redis://worker:123456789@localhost:6379/0 # ACL URI 认证 redis-cli -h localhost -p 6379 --user worker -a 123456789 -n 0 # ACL 参数认证 redis-cli -h localhost -p 6379 -a 123456789 client list # 默认用户 default # 客户端连接 redis-cli -h localhost -p 6379 -n 0 # 未认证连接。如果未设置 default 用户密码,则可直接连接。如果设置了密码,连接后必须在 CLI 内手动输入 auth <username> <password> 进行认证,否则无法执行redis命令。 # 客户端认证 auth 123456789
开机自启 vim /etc/systemd/system/redis@.service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # redis@.service [Unit] Description=Redis Server (%I) Documentation=https://zh.wikipedia.org/wiki/Systemd After=syslog.target network.target network-online.target Wants=network-online.target [Service] Type=forking PIDFile=/data/local/redis/pid/redis_%I.pid User=root Group=root ExecStart=/data/local/redis/bin/redis-server /data/local/redis/redis_%I.conf # ExecReload= ExecStop=/data/local/redis/bin/redis-cli -h localhost -p %I --user worker -a 123456789 shutdown Restart=on-failure RestartSec=10s [Install] WantedBy=multi-user.target
启动
1 2 systemctl start redis@6379.service systemctl enable redis@6379.service
主从模式 配置文件(slave节点) 新增配置文件(slave节点):vim /data/local/redis/redis_6380.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 include /data/local/redis/redis_6379.conf port 6380 requirepass 123456789 pidfile /data/local/redis/pid/redis_6380.pid logfile "/data/local/redis/log/redis_6380.log" dbfilename dump_6380.rdb appendfilename "appendonly_6380.aof" appenddirname "appendonlydir_6380" replicaof 192.168.0.7 6379 masterauth 123456789 masteruser worker cluster-config-file /data/local/redis/cluster/nodes-6380.conf
哨兵模式 配置文件 请在上述节点配置文件中,关闭集群模式,并配置主从关系。
编辑哨兵配置文件 vim /data/local/redis/redis_sentinel_26379.conf。或从解压目录复制一份哨兵配置文件后再修改:cp /data/local/redis-8.4.0/sentinel.conf /data/local/redis/redis_sentinel_26379.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 protected-mode no port 26379 daemonize yes pidfile /data/local/redis/pid/redis_sentinel_26379.pid loglevel notice logfile "/data/local/redis/log/redis_sentinel_26379.log" user worker on ~* &* +@all >123456789 requirepass 123456789 sentinel monitor mymaster 192.168.0.7 6379 1 sentinel auth-pass mymaster 123456789 sentinel auth-user mymaster worker sentinel sentinel-user worker sentinel sentinel-pass 123456789
哨兵启动 sentinel不是数据节点,而是监控节点,所以在nodes节点无法运行select、keys等命令。
1 2 3 4 5 6 7 8 9 redis-sentinel /data/local/redis/redis_sentinel_26379.conf ps -ef | grep redis redis-cli -u redis://worker:123456789@localhost:26379/0 -a 123456789 info sentinel redis-cli -p 26379 -a 123456789 info sentinel # 这种方式只能连接default用户 redis-cli -p 26379 #-a 123456789 # 连接sentinel,默认端口26379 auth sentinel-worker 123456789 info sentinel acl list
注意 反客为主后,会对原salve的配置进行rewrite( Redis Config rewrite 命令 ),而原master节点重新启动并不会成为现master节点的salve,需要重新配置。
开机自启 1 2 3 4 5 6 yum install chkconfig # centos stream9 必须在init文件创建前安装,否则目录已存在则安装失败,可能是系统bug # 从redis解压包复制init脚本,然后修改启动文件 # cp /data/local/redis-8.4.0/utils/redis_init_script /etc/init.d/redis# 或直接新增启动文件 vim /etc/init.d/redis
启动文件内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 # !/bin/sh # # as it does use of the /proc filesystem. # # Provides: redis_6379 # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Redis data structure server # Description: Redis data structure server. See https://redis.io # REDISPORT_6379=6379 PIDFILE_6379=/data/local/redis/pid/redis_${REDISPORT_6379}.pid CONF_6379="/data/local/redis/redis_${REDISPORT_6379}.conf" REDISPORT_6380=6380 PIDFILE_6380=/data/local/redis/pid/redis_${REDISPORT_6380}.pid CONF_6380="/data/local/redis/redis_${REDISPORT_6380}.conf" REDIS_SENTINELPORT_26379=26379 PIDFILE_26379=/data/local/redis/pid/redis_sentinel_${REDIS_SENTINELPORT_26379}.pid CONF_26379="/data/local/redis/redis_sentinel_${REDIS_SENTINELPORT_26379}.conf" EXEC=/data/local/redis/bin/redis-server SLEXEC=/data/local/redis/bin/redis-sentinel CLIEXEC=/data/local/redis/bin/redis-cli case "$1" in start) if [ -f $PIDFILE_6379 ] then echo "$PIDFILE_6379 exists, process is already running or crashed" else echo "Starting Redis $REDISPORT_6379 server..." $EXEC $CONF_6379 fi sleep 1 if [ -f $PIDFILE_6380 ] then echo "$PIDFILE_6380 exists, process is already running or crashed" else echo "Starting Redis $REDISPORT_6380 server..." $EXEC $CONF_6380 fi sleep 1 if [ -f $PIDFILE_26379 ] then echo "$PIDFILE_26379 exists, process is already running or crashed" else echo "Starting Redis $REDIS_SENTINELPORT_26379 server..." $SLEXEC $CONF_26379 fi ;; stop) if [ ! -f $PIDFILE_6379 ] then echo "$PIDFILE_6379 does not exist, process is not running" else PID_6379=$(cat $PIDFILE_6379) echo "Stopping $REDISPORT_6379 ..." $CLIEXEC -u redis://worker:123456789@localhost:6379/0 -a 123456789 --no-auth-warning shutdown while [ -x /proc/${PID_6379} ] do echo "Waiting for Redis $REDISPORT_6379 to shutdown ..." sleep 1 done echo "Redis $REDISPORT_6379 stopped" fi sleep 1 if [ ! -f $PIDFILE_6380 ] then echo "$PIDFILE_6380 does not exist, process is not running" else PID_6380=$(cat $PIDFILE_6380) echo "Stopping $REDISPORT_6380 ..." $CLIEXEC -u redis://worker:123456789@localhost:6380/0 -a 123456789 --no-auth-warning shutdown while [ -x /proc/${PID_6380} ] do echo "Waiting for Redis $REDISPORT_6380 to shutdown ..." sleep 1 done echo "Redis $REDISPORT_6380 stopped" fi sleep 1 if [ ! -f $PIDFILE_26379 ] then echo "$PIDFILE_26379 does not exist, process is not running" else PID_26379=$(cat $PIDFILE_26379) echo "Stopping $REDIS_SENTINELPORT_26379 ..." $CLIEXEC -u redis://worker:123456789@localhost:26379/0 -a 123456789 --no-auth-warning shutdown while [ -x /proc/${PID_26379} ] do echo "Waiting for Redis $REDIS_SENTINELPORT_26379 to shutdown ..." sleep 1 done echo "Redis $REDIS_SENTINELPORT_26379 stopped" fi ;; *) echo "Please use start or stop as first argument" ;; esac
修改文件权限
1 chmod 777 /etc/init.d/redis
启动
1 2 service redis start service redis stop # 如果失败,请检查/etc/init.d/redis脚本中的redis密码
设置开机启动
1 2 3 # 设置 redis 服务在运行级别为2、3、4、5时启动。--level 指定读系统服务要在哪一个Linux运行级别中开启或关闭。 chkconfig --level 2345 redis on chkconfig --level 2345 redis off
集群模式 请在上述节点配置文件中,开启集群模式,并取消主从关系。
redisz主从集群最少需要6个节点。
1 2 3 4 5 cd /data/local/redis cp redis_6380.conf redis_6381.conf cp redis_6380.conf redis_6389.conf cp redis_6380.conf redis_6390.conf cp redis_6380.conf redis_6391.conf
修改配置文件,启动6个服务
1 2 3 4 5 6 redis-server /data/local/redis/redis_6379.conf redis-server /data/local/redis/redis_6380.conf redis-server /data/local/redis/redis_6381.conf redis-server /data/local/redis/redis_6389.conf redis-server /data/local/redis/redis_6390.conf redis-server /data/local/redis/redis_6391.conf
redis-trib.rb 是官方提供的Redis Cluster的管理工具,无需额外下载,默认位于源码包的src目录下。
1 2 3 4 5 6 7 8 9 10 11 # 将六个节点合成一个集群,组合之前,请确保所有redis实例启动后,nodes-xxxx.conf文件都生成正常。 cd /data/local/redis-8.4.0/src/ # 必须在此目录下执行 # 此处不要用127.0.0.1,请用真实IP地址 redis-cli --cluster create --cluster-replicas 1 -a 123456789 \ 192.168.0.7:6379 \ 192.168.0.7:6380 \ 192.168.0.7:6381 \ 192.168.0.7:6389 \ 192.168.0.7:6390 \ 192.168.0.7:6391
Redis集群的不足
多键操作是不被支持的
多键的Redis事务是不被支持的。lua脚本不被支持
由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。
Redis五种数据类型 Redis 没有专门的整数类型
string 是 redis 最基本的数据类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
基本命令
请参阅字符串命令的完整列表 。
指标管理
按位运算
要对字符串执行按位运算,请参阅位图数据类型 文档。
表现
大多数字符串操作都是O(1),这意味着它们的效率很高。但是,请小心使用SUBSTR 复杂GETRANGE 度SETRANGE 命令,这些命令可以是O(n)。这些随机访问字符串命令在处理大字符串时可能会导致性能问题。
限制
默认情况下,单个 Redis 字符串最大为 512MB 。
例子
1 2 3 4 del mykey set mykey "Hello\nWorld" OK get mykey
Redis 列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)。
每个列表最多可存储 232 - 1 个元素(40多亿 )。
Redis 列表经常用于:
基本命令
请参阅完整的列表命令系列 。
阻塞命令
列表支持多种阻塞命令。例如:
BLPOP 从列表的头部移除并返回一个元素。如果列表为空,则命令将阻塞,直到元素可用或达到指定的超时为止。
BLMOVE 原子地将元素从源列表移动到目标列表。如果源列表为空,则该命令将阻塞,直到有新元素可用为止。
表现
访问其头部或尾部的列表操作的复杂度为 O(1),这意味着它们非常高效。但是,操作列表中元素的命令通常是 O(n)。这些示例包括LINDEX 、LINSERT 和LSET 。运行这些命令时要小心,特别是在对大型列表进行操作时。
限制
List的最大长度为 232 - 1(40多亿 )。
例子
将列表视为队列(先进先出):
1 2 3 4 5 6 7 8 9 del ids lpush work:queue:ids 1 lpush work:queue:ids 2 lpush work:queue:ids 3 rpop work:queue:ids "1" rpop work:queue:ids "2"
将列表视为堆栈(先进后出):
1 2 3 4 5 6 7 8 9 del ids lpush work:queue:ids 1 lpush work:queue:ids 2 lpush work:queue:ids 3 lpop work:queue:ids "3" lpop work:queue:ids "2"
检查列表的长度:
1 2 llen work:queue:ids (integer) 1
创建一个上限为100个元素的列表,可以在每次调用 LPUSH 后调用 LTRIM :
1 2 3 4 lpush notifications:user:1 "You've got mail!" ltrim notifications:user:1 0 99 lpush notifications:user:1 "Your package will be delivered at 12:01 today." ltrim notifications:user:1 0 99
Redis 的 Set 是唯一 string 类型元素的无序集合 。
可以使用 Redis 集来高效地:
跟踪唯一项目(例如,跟踪访问给定博客文章的所有唯一 IP 地址)。
表示关系(例如,具有给定角色的所有用户的集合)。
执行常见的集合运算,例如交集、并集和差集。
基本命令
请参阅set 命令的完整列表 。
表现
集合是通过哈希表实现的,所以大多数集合操作,包括添加、删除和检查项是否为集合成员,复杂度都是O(1)。这意味着它们的效率很高。
但是,对于具有数十万或更多成员的大型集,在运行 SMEMBERS 命令 时,应谨慎 行事。此命令为O(n),并在单个响应中返回整个集合。作为另一种选择,可以考虑SSCAN,它允许您迭代地检索集合的所有成员。
限制
每个集合的最大成员数为 232 - 1(40多亿 )。
例子
存储用户 123 和 456 的收藏书 ID 集:
1 2 3 4 5 6 7 sadd user:123:favorites 347 sadd user:123:favorites 561 sadd user:123:favorites 742 sadd user:456:favorites 561 sadd user:456:favorites 99999 srem user:456:favorites 99999
检查用户 123 是否喜欢书籍 742 和 299
1 2 sismember user:123:favorites 742 sismember user:123:favorites 299
用户 123 和 456 有没有共同喜欢的书?
1 sinter user:123:favorites user:456:favorites
用户 123 收藏了多少本书?
1 scard user :123 :favorites
Redis hash 是一个键值对集合 (key=>value)。
Redis hash 是一个 string 类型的 field 和 value 的映射表(field=>value对),hash 特别适合用于存储对象 。
基本命令
请参阅哈希命令的完整列表 。
表现
大多数 Redis 哈希命令的复杂度为 O(1)。
一些命令 - 例如HKEYS 、HVALS 和HGETALL - 是 O(n),其中n 是字段值对的数量。
限制
每个 hash 可以存储 232 - 1 个 键值对 (40多亿 )。实际上,仅受托管 Redis 部署的 VM 上的总内存的限制。
例子
将用户对象存储为散列
1 2 3 4 del zhangsan hset zhangsan sno 2022020037 name zhagnsan age 18 sex 1 hget zhangsan sno hgetall zhangsan
存储设备 777 对服务器执行 ping 操作、发送错误或发出请求的次数的计数器
1 2 3 4 5 6 7 8 del device:777:stats hincrby device:777:stats pings 1 # key为pings的value加1 hincrby device:777:stats pings 1 hincrby device:777:stats pings 10 # key为pings的value加10 hincrby device:777:stats errors 1 # key为errors的value加1 hincrby device:777:stats requests 1 # key为requests的value加1
Redis zset 和 set 一样,也是唯一 string 类型元素的集合。
不同的是,每个元素都会关联一个double类型的分数 ,通过分数为集合中的成员排序 (从大到小)。成员是唯一,分数(score)却可以重复。
当多个字符串具有相同的分数时,字符串按字典顺序排列。zset 的示例:
排行榜。使用排序集轻松维护大型在线游戏中最高分的有序列表。
速率限制器。使用 zset 来构建滑动窗口速率限制器,以防止过多的 API 请求。
基本命令
请参阅排序集命令的完整列表 。
ZADD 将新成员和关联的分数添加到已排序的集合中。如果该成员已经存在,则更新分数。
ZRANGE 返回在给定范围内排序的有序集合的成员。
ZRANK 返回所提供成员的排名,假设排序是按升序排列。
ZREVRANK 返回所提供成员的排名,假设排序集按降序排列。
表现
大多数有序集合操作的复杂度为 O(log(n)),其中n 是成员数。
ZRANGE 运行具有较大返回值(例如,数万或更多)的命令时要小心。此命令的时间复杂度为 O(log(n) + m),其中m 是返回的结果数。
备择方案
Redis 排序集有时用于索引其他 Redis 数据结构。如果您需要索引和查询您的数据,请考虑RediSearch 和RedisJSON 。
限制
每个集合的最大成员数为 232 - 1(40多亿 )。
例子
随着玩家分数的变化更新实时排行榜
1 2 3 4 5 6 7 ZADD leaderboard:455 100 user:1 ZADD leaderboard:455 75 user:2 ZADD leaderboard:455 101 user:3 ZADD leaderboard:455 15 user:4 ZADD leaderboard:455 275 user:2 # 请注意,在最后一次调用user:2中更新了 score 。ZADD
获取前 3 名玩家的分数
1 2 3 4 5 6 7 ZRANGE leaderboard:455 0 2 REV WITHSCORES 1) "user:2" 2) "275" 3) "user:3" 4) "101" 5) "user:1" 6) "100"
用户 2 的排名是多少?
1 2 ZREVRANK leaderboard:455 user:2 (integer) 0