官方文档
全段翻译:
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
String (字符串类型)
String是redis最基本的类型,你可以理解成Memcached一模一样的类型,一个key对应一个value。
String类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。
String类型是redis最基本的数据类型,一个redis中字符串value最多可以是512M。
Hash(哈希,类似 Java里的Map)
Redis hash 是一个键值对集合。
Redis hash 是一个String类型的field和value的映射表,hash特别适合用于存储对象。
类似Java里面的Map
List(列表)
Redis列表是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾 部(右边)。
它的底层实际是个链表 !
Set(集合)
Redis的Set是String类型的无序集合,它是通过HashTable实现的
Zset(sorted set:有序集合)
Redis zset 和 set 一样,也是String类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。
Redis正是通过分数来为集合中的成员进行从小到大的排序,zset的成员是唯一的,但是分数(Score) 却可以重复。
# keys * 查看所有的key 127.0.0.1:6379> keys * (empty array) 127.0.0.1:6379> set name edgar OK 127.0.0.1:6379> keys * 1) "name" 127.0.0.1:6379> set age 1 OK 127.0.0.1:6379> keys * 1) "name" 2) "age" # exists key 的名字,判断某个key是否存在 127.0.0.1:6379> EXISTS name (integer) 1 127.0.0.1:6379> EXISTS name1 (integer) 0 # move key db ---> 移动key到指定数据库 127.0.0.1:6379> move name 1 (integer) 1 127.0.0.1:6379> keys * 1) "age" 127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]> keys * 1) "name" 127.0.0.1:6379[1]> get name "edgar" 127.0.0.1:6379[1]> select 0 OK 127.0.0.1:6379> keys * 1) "age" 127.0.0.1:6379> set name edgar OK 127.0.0.1:6379> keys * 1) "name" 2) "age" 127.0.0.1:6379> get name "edgar" # expire key 秒钟:为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。 # ttl key 查看还有多少秒过期,-1 表示永不过期,-2 表示已过期 127.0.0.1:6379> EXPIRE name 10 (integer) 1 127.0.0.1:6379> ttl name (integer) 3 127.0.0.1:6379> ttl name (integer) 2 127.0.0.1:6379> ttl name (integer) 0 127.0.0.1:6379> ttl name (integer) -2 127.0.0.1:6379> ttl name (integer) -2 127.0.0.1:6379> get name (nil) # 删除key 127.0.0.1:6379> del age (integer) 1 127.0.0.1:6379> keys * (empty array) 127.0.0.1:6379> set name edagr OK 127.0.0.1:6379> keys * 1) "name" # type key 查看你的key是什么类型 127.0.0.1:6379> type name # 查看当前key的类型 string
后面如果遇到不会的,可以在官网查看帮助文档!
90%的 Java 程序员使用 redis 只会使用一个String类型!
# =================================================== # set、get、append、strlen # =================================================== 127.0.0.1:6379> set key1 v1 # 设置值 OK 127.0.0.1:6379> get key1 # 获得值 "v1" 127.0.0.1:6379> keys * # 获得所有的key 1) "key1" 127.0.0.1:6379> EXISTS key1 # 判断某一个key是否存在 (integer) 1 127.0.0.1:6379> APPEND key1 "hello" # 追加字符串,如果当前key不存在,就相当于set key (integer) 7 127.0.0.1:6379> get key1 "v1hello" 127.0.0.1:6379> STRLEN key1 # 获取字符串长度! (integer) 7 127.0.0.1:6379> APPEND key1 ",edgar" (integer) 13 127.0.0.1:6379> STRLEN key1 (integer) 13 127.0.0.1:6379> get key1 "v1hello,edgar" # =================================================== # incr、decr 一定要是数字才能进行加减,+1 和 -1。 # incrby、decrby 命令将 key 中储存的数字加上指定的增量值。 # =================================================== 127.0.0.1:6379> set views 0 # 初始浏览量为0 OK 127.0.0.1:6379> get views "0" 127.0.0.1:6379> incr views # 自增1 浏览量变为1 (integer) 1 127.0.0.1:6379> incr views (integer) 2 127.0.0.1:6379> get views "2" 127.0.0.1:6379> decr views # 自减1 浏览量-1 (integer) 1 127.0.0.1:6379> decr views (integer) 0 127.0.0.1:6379> decr views (integer) -1 127.0.0.1:6379> get views "-1" 127.0.0.1:6379> INCRBY views 10 # 可以设置步长,指定增量! (integer) 9 127.0.0.1:6379> INCRBY views 10 (integer) 19 127.0.0.1:6379> DECRBY views 5 (integer) 14 # =================================================== # range [范围] # getrange 获取指定区间范围内的值,类似between...and的关系,从零到负一表示全部 # =================================================== 127.0.0.1:6379> set key1 "hello,edgar" # 设置 key1 的值 OK 127.0.0.1:6379> get key1 "hello,edgar" 127.0.0.1:6379> GETRANGE key1 0 3 # 截取字符串 [0,3] "hell" 127.0.0.1:6379> GETRANGE key1 0 -1 # 获取全部的字符串 和 get key是一样的 "hello,edgar" # =================================================== # setrange 设置指定区间范围内的值,格式是setrange key 偏移量 具体值 # =================================================== 127.0.0.1:6379> set key2 abcdefg OK 127.0.0.1:6379> get key2 "abcdefg" 127.0.0.1:6379> SETRANGE key2 1 xx # 替换指定位置开始的字符串! (integer) 7 127.0.0.1:6379> get key2 "axxdefg" # =================================================== # setex(set with expire) # 设置过期时间 # setnx(set if not exist) # 不存在在设置 (在分布式锁中常常使用!) # =================================================== 127.0.0.1:6379> setex key3 30 "hello" # 设置key3 的值为 hello,30秒后过期 OK 127.0.0.1:6379> ttl key3 (integer) 24 127.0.0.1:6379> get key3 "hello" 127.0.0.1:6379> setnx mykey "redis" # 如果mykey 不存在,创建mykey (integer) 1 127.0.0.1:6379> keys * 1) "mykey" 2) "key2" 3) "key1" 127.0.0.1:6379> ttl key3 (integer) -2 127.0.0.1:6379> setnx mykey "MongoDB" # 如果mykey存在,创建失败! (integer) 0 127.0.0.1:6379> get mykey "redis" # =================================================== # mset Mset 命令用于同时设置一个或多个 key-value 对。 # mget Mget 命令返回所有(一个或多个)给定 key 的值。 # 如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。 # msetnx 当所有 key 都成功设置,返回 1 。 # 如果所有给定 key 都设置失败(至少有一个 key 已经存在),那么返回 0 。原子操作 # =================================================== 127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 # 同时设置多个值 OK 127.0.0.1:6379> keys * 1) "k3" 2) "k1" 3) "k2" 127.0.0.1:6379> mget k1 k2 k3 # 同时获取多个值 1) "v1" 2) "v2" 3) "v3" 127.0.0.1:6379> msetnx k1 v1 k4 v4 # msetnx 是一个原子性操作,要么一起成功,要么一起失败! (integer) 0 127.0.0.1:6379> get k4 (nil) # 传统对象缓存 set user:1 {name:zhangsan,age:3} # 设置一个user:1 对象 值为 json字符来保存一个对象! # 这里的key是一个巧妙地设计:user:{id}:{field} ,如此设计在redis中是完全OK的! 127.0.0.1:6379> mset user:1:name zhangsan user:1:age 2 OK 127.0.0.1:6379> mget user:1:name user:1:age 1) "zhangsan" 2) "2" # =================================================== # getset(先get再set) # =================================================== 127.0.0.1:6379> getset db redis # 如果不存在值,则返回 nil (nil) 127.0.0.1:6379> get db "redis" 127.0.0.1:6379> getset db mongodb # 如果存在值,获取原来的值,并设置新的值 "redis" 127.0.0.1:6379> get db "mongodb"
String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。
常规key-value缓存应用:
常规计数:微博数,粉丝数等。
单值多Value
# =================================================== # Lpush:将一个或多个值插入到列表头部。(左) # rpush:将一个或多个值插入到列表尾部。(右) # lrange:返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。 # 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 # 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 # =================================================== 127.0.0.1:6379> LPUSH list one (integer) 1 127.0.0.1:6379> LPUSH list two (integer) 2 127.0.0.1:6379> LPUSH list three (integer) 3 127.0.0.1:6379> LRANGE list 0 -1 # 获取list中的值 1) "three" 2) "two" 3) "one" 127.0.0.1:6379> LRANGE list 0 1 # 通过区间获取具体的值! 1) "three" 2) "two" 127.0.0.1:6379> RPUSH list right # 将一个值或者多个值,插入到列表尾部(右) (integer) 4 127.0.0.1:6379> LRANGE list 0 -1 1) "three" 2) "two" 3) "one" 4) "right" # =================================================== # lpop 命令用于移除并返回列表的第一个元素。当列表 key 不存在时,返回 nil 。 # rpop 移除列表的最后一个元素,返回值为移除的元素。 # =================================================== 127.0.0.1:6379> LRANGE list 0 -1 1) "three" 2) "two" 3) "one" 4) "right" 127.0.0.1:6379> LPOP list # 移除list的第一个元素 "three" 127.0.0.1:6379> RPOP list # 移除list的最后一个元素 "right" 127.0.0.1:6379> LRANGE list 0 -1 1) "two" 2) "one" # =================================================== # Lindex,按照索引下标获得元素(-1代表最后一个,0代表是第一个) # =================================================== 127.0.0.1:6379> LRANGE list 0 -1 1) "two" 2) "one" 127.0.0.1:6379> LINDEX list 1 "one" 127.0.0.1:6379> LINDEX list 0 "two" # =================================================== # llen 用于返回列表的长度。 # =================================================== 127.0.0.1:6379> LPUSH list one (integer) 1 127.0.0.1:6379> LPUSH list two (integer) 2 127.0.0.1:6379> LPUSH list three (integer) 3 127.0.0.1:6379> LLEN list # 返回列表的长度 (integer) 3 # =================================================== # lrem key 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。 # =================================================== 127.0.0.1:6379> LPUSH list three (integer) 4 127.0.0.1:6379> LRANGE list 0 -1 1) "three" 2) "three" 3) "two" 4) "one" 127.0.0.1:6379> LREM list 1 one # 移除list集合中指定个数的value,精确匹配 (integer) 1 127.0.0.1:6379> LRANGE list 0 -1 1) "three" 2) "three" 3) "two" 127.0.0.1:6379> LREM list 1 three (integer) 1 127.0.0.1:6379> LRANGE list 0 -1 1) "three" 2) "two" 127.0.0.1:6379> LPUSH list three (integer) 3 127.0.0.1:6379> LREM list 2 three (integer) 2 127.0.0.1:6379> LRANGE list 0 -1 1) "two" # =================================================== # Ltrim key 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。 # =================================================== 127.0.0.1:6379> keys * (empty array) 127.0.0.1:6379> RPUSH mylist "hello" (integer) 1 127.0.0.1:6379> RPUSH mylist "hello1" (integer) 2 127.0.0.1:6379> RPUSH mylist "hello2" (integer) 3 127.0.0.1:6379> RPUSH mylist "hello3" (integer) 4 127.0.0.1:6379> ltrim mylist 1 2 # 通过下标截取指定的长度,这个list已经被改变了,截断了只剩下截取的元素! OK 127.0.0.1:6379> LRANGE mylist 0 -1 1) "hello1" 2) "hello2" # =================================================== # rpoplpush 移除列表的最后一个元素,并将该元素添加到另一个列表并返回。 # =================================================== 127.0.0.1:6379> RPUSH mylist "hello" (integer) 1 127.0.0.1:6379> RPUSH mylist "hello1" (integer) 2 127.0.0.1:6379> RPUSH mylist "hello2" (integer) 3 127.0.0.1:6379> rpoplpush mylist myotherlist "hello2" 127.0.0.1:6379> LRANGE mylist 0 -1 1) "hello" 2) "hello1" 127.0.0.1:6379> LRANGE myotherlist 0 -1 1) "hello2" # =================================================== # lset key index value 将列表 key 下标为 index 的元素的值设置为 value 。 # =================================================== 127.0.0.1:6379> EXISTS list # 判断这个列表是否存在 (integer) 0 127.0.0.1:6379> lset list 0 item # 如果不存在列表我们去更新就会报错 (error) ERR no such key 127.0.0.1:6379> lpush list value1 (integer) 1 127.0.0.1:6379> LRANGE list 0 0 1) "value1" 127.0.0.1:6379> lset list 0 item # 如果存在,更新当前下标的值 OK 127.0.0.1:6379> LRANGE list 0 0 1) "item" 127.0.0.1:6379> lset list 1 other # 如果不存在,则会报错! (error) ERR index out of range # =================================================== # linsert key before/after pivot value 用于在列表的元素前或者后插入元素。 # 将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。 # =================================================== 127.0.0.1:6379> RPUSH mylist "hello" (integer) 1 127.0.0.1:6379> RPUSH mylist "world" (integer) 2 127.0.0.1:6379> LINSERT mylist before "world" "other" (integer) 3 127.0.0.1:6379> LRANGE mylist 0 -1 1) "hello" 2) "other" 3) "world" 127.0.0.1:6379> LINSERT mylist after "world" "new" (integer) 4 127.0.0.1:6379> LRANGE mylist 0 -1 1) "hello" 2) "other" 3) "world" 4) "new"
性能总结
list就是链表,略有数据结构知识的人都应该能理解其结构。使用Lists结构,我们可以轻松地实现最新消 息排行等功能。List的另一个应用就是消息队列,可以利用List的PUSH操作,将任务存在List中,然后工 作线程再用POP操作将任务取出进行执行。Redis还提供了操作List中某一段的api,你可以直接查询,删 除List中某一段的元素。
Redis的list是每个子元素都是String类型的双向链表,可以通过push和pop操作从列表的头部或者尾部 添加或者删除元素,这样List即可以作为栈,也可以作为队列。
单值多value
# =================================================== # sadd 将一个或多个成员元素加入到集合中,不能重复 # smembers 返回集合中的所有的成员。 # sismember 命令判断成员元素是否是集合的成员。 # =================================================== 127.0.0.1:6379> sadd myset "hello" # set集合中添加元素 (integer) 1 127.0.0.1:6379> sadd myset "edgar" (integer) 1 127.0.0.1:6379> sadd myset "loveedgar" (integer) 1 127.0.0.1:6379> SMEMBERS myset # 查看指定set的所有值 1) "hello" 2) "loveedgar" 3) "edgar" 127.0.0.1:6379> SISMEMBER myset hello # 判断某一个值是不是在set集合中! (integer) 1 127.0.0.1:6379> SISMEMBER myset world (integer) 0 # =================================================== # scard,获取集合里面的元素个数 # =================================================== 127.0.0.1:6379> scard myset (integer) 4 # =================================================== # srem key value 用于移除集合中的一个或多个成员元素 # =================================================== 127.0.0.1:6379> srem myset hello (integer) 1 127.0.0.1:6379> scard myset (integer) 3 127.0.0.1:6379> SMEMBERS myset 1) "loveedgar" 2) "loveedgar2" 3) "edgar" # =================================================== # srandmember key 命令用于返回集合中的一个随机元素。 # =================================================== 127.0.0.1:6379> SRANDMEMBER myset # 随机抽选出一个元素 "loveedgar2" 127.0.0.1:6379> SRANDMEMBER myset "loveedgar2" 127.0.0.1:6379> SRANDMEMBER myset "loveedgar" 127.0.0.1:6379> SRANDMEMBER myset 2 # 随机抽选出指定个数的元素 1) "edgar" 2) "loveedgar2" # =================================================== # spop key 用于移除集合中的指定 key 的一个或多个随机元素 # =================================================== 127.0.0.1:6379> SMEMBERS myset 1) "loveedgar" 2) "loveedgar2" 3) "edgar" 127.0.0.1:6379> spop myset # 随机删除一些set集合中的元素! "loveedgar2" 127.0.0.1:6379> spop myset "edgar" 127.0.0.1:6379> SMEMBERS myset 1) "loveedgar" # =================================================== # smove SOURCE DESTINATION MEMBER # 将指定成员 member 元素从 source 集合移动到 destination 集合。 # =================================================== 127.0.0.1:6379> sadd myset "hello" (integer) 1 127.0.0.1:6379> sadd myset "world" (integer) 1 127.0.0.1:6379> sadd myset "edgar" (integer) 1 127.0.0.1:6379> sadd myset2 "set2" (integer) 1 127.0.0.1:6379> smove myset myset2 "edgar" # 将一个指定的值,移动到另外一个set集合! (integer) 1 127.0.0.1:6379> SMEMBERS myset 1) "hello" 2) "world" 127.0.0.1:6379> SMEMBERS myset2 1) "set2" 2) "edgar" # =================================================== - 数字集合类 - 差集: sdiff - 交集: sinter - 并集: sunion # =================================================== 127.0.0.1:6379> sadd key1 a (integer) 1 127.0.0.1:6379> sadd key1 b (integer) 1 127.0.0.1:6379> sadd key1 c (integer) 1 127.0.0.1:6379> sadd key2 c (integer) 1 127.0.0.1:6379> sadd key2 d (integer) 1 127.0.0.1:6379> sadd key2 e (integer) 1 127.0.0.1:6379> SDIFF key1 key2 # 差集 1) "a" 2) "b" 127.0.0.1:6379> SINTER key1 key2 # 交集 共同好友就可以这样实现 1) "c" 127.0.0.1:6379> SUNION key1 key2 # 并集 1) "e" 2) "c" 3) "b" 4) "a" 5) "d"
在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为 集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功 能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。
kv模式不变,但V是一个键值对
# =================================================== # hset、hget 命令用于为哈希表中的字段赋值 。 # hmset、hmget 同时将多个field-value对设置到哈希表中。会覆盖哈希表中已存在的字段。 # hgetall 用于返回哈希表中,所有的字段和值。 # hdel 用于删除哈希表 key 中的一个或多个指定字段 # =================================================== 127.0.0.1:6379> hset myhash field1 edgar # set一个具体 key-value (integer) 1 127.0.0.1:6379> hget myhash field1 "edgar" 127.0.0.1:6379> hmset myhash field1 hello field2 world # set多个 key-value OK 127.0.0.1:6379> hmget myhash field1 field2 # 获取多个字段值 1) "hello" 2) "world" 127.0.0.1:6379> hgetall myhash # 获取全部的数据 1) "field1" 2) "hello" 3) "field2" 4) "world" 127.0.0.1:6379> hdel myhash field1 # 删除hash指定key字段!对应的value值也就消失了! (integer) 1 127.0.0.1:6379> hgetall myhash 1) "field2" 2) "world" # =================================================== # hlen 获取哈希表中字段的数量。 # =================================================== 127.0.0.1:6379> hmset myhash field1 hello field2 world OK 127.0.0.1:6379> HGETALL myhash 1) "field2" 2) "world" 3) "field1" 4) "hello" 127.0.0.1:6379> hlen myhash # 获取哈希表中字段的数量 (integer) 2 # =================================================== # hexists 查看哈希表的指定字段是否存在。 # =================================================== 127.0.0.1:6379> HEXISTS myhash field1 (integer) 1 127.0.0.1:6379> HEXISTS myhash field3 (integer) 0 # =================================================== # hkeys 获取哈希表中的所有域(field)。 # hvals 返回哈希表所有域(field)的值。 # =================================================== 127.0.0.1:6379> hkeys myhash # 只获得所有的field 1) "field2" 2) "field1" 127.0.0.1:6379> hvals myhash # 只获得所有的value 1) "world" 2) "hello" # =================================================== # hincrby 为哈希表中的字段值加上指定增量值。 # =================================================== 127.0.0.1:6379> hset myhash field3 5 (integer) 0 127.0.0.1:6379> hget myhash field3 "5" 127.0.0.1:6379> HINCRBY myhash field3 1 (integer) 6 127.0.0.1:6379> HINCRBY myhash field3 -1 (integer) 5 # =================================================== # hsetnx 为哈希表中不存在的的字段赋值 。 # =================================================== 127.0.0.1:6379> hsetnx myhash field4 hello (integer) 1 # 设置成功,返回 1 。 127.0.0.1:6379> hsetnx myhash field4 world (integer) 0 # 如果给定字段已经存在,返回 0 。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
存储部分变更的数据,如用户信息等。
在set基础上,加一个score值。之前set是k1 v1 v2 v3,现在zset是 k1 score1 v1 score2 v2
# =================================================== # zadd 将一个或多个成员元素及其分数值加入到有序集当中。 # zrange 返回有序集中,指定区间内的成员 # =================================================== 127.0.0.1:6379> zadd myset 1 one (integer) 1 127.0.0.1:6379> zadd myset 2 two 3 three (integer) 2 127.0.0.1:6379> ZRANGE myset 0 -1 1) "one" 2) "two" 3) "three" # =================================================== # zrangebyscore 返回有序集合中指定分数区间的成员列表。有序集成员按分数值递增(从小到大)次序排列。 # zrevrangebyscore 返回有序集合中指定分数区间的成员列表。有序集成员按分数值递减(从大到小)次序排列。 # =================================================== 127.0.0.1:6379> zadd salary 2500 xiaohong (integer) 1 127.0.0.1:6379> zadd salary 5000 zhangsan (integer) 1 127.0.0.1:6379> zadd salary 500 edgar (integer) 1 # +Inf无穷大量+∞,同样地,-∞可以表示为-Inf。 127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf # 递增排列 1) "edgar" 2) "xiaohong" 3) "zhangsan" 127.0.0.1:6379> ZREVRANGEBYSCORE salary +inf -inf # 递减排列 1) "zhangsan" 2) "xiaohong" 3) "edgar" 127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores # 递增排列,带分数 1) "edgar" 2) "500" 3) "xiaohong" 4) "2500" 5) "zhangsan" 6) "5000" 127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 withscores # 显示工资 <=2500的所有成员 1) "edgar" 2) "500" 3) "xiaohong" 4) "2500" # =================================================== # zrem 移除有序集中的一个或多个成员 # =================================================== 127.0.0.1:6379> zrange salary 0 -1 1) "edgar" 2) "xiaohong" 3) "zhangsan" 127.0.0.1:6379> zrem salary xiaohong (integer) 1 127.0.0.1:6379> zrange salary 0 -1 1) "edgar" 2) "zhangsan" # =================================================== # zcard 命令用于计算集合中元素的数量。 # =================================================== 127.0.0.1:6379> zcard salary (integer) 2 # =================================================== # zcount 计算有序集合中指定分数区间的成员数量。 # =================================================== 127.0.0.1:6379> zadd myset 1 hello (integer) 1 127.0.0.1:6379> zadd myset 2 world 3 edgar (integer) 2 127.0.0.1:6379> zcount myset 1 3 (integer) 3 127.0.0.1:6379> zcount myset 1 2 (integer) 2 # =================================================== # zrank 返回有序集中指定成员的排名。其中有序集成员按分数值递增(从小到大)顺序排列。 # =================================================== 127.0.0.1:6379> zrank myset hello (integer) 0 127.0.0.1:6379> zrank myset edgar (integer) 2
和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列,比如 一个存储全班同学成绩的sorted set,其集合value可以是同学的学号,而score就可以是其考试得分, 这样在数据插入集合的时候,就已经进行了天然的排序。可以用sorted set来做带权重的队列,比如普 通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让 重要的任务优先执行。
排行榜应用,取TOP N操作 !