注1:在存在多个候选返回值的时候,redis会返回语义更加丰富的返回值。如返回成功或失败,可以直接返回true或false,但返回0既可以表示失败,也可以表示操作的操作数(operand)为0,而返回非0不仅可以告诉我们操作成功了,而且还会精确地告诉我们操作了多少个对象,可谓一举两得。这种设计思路遍布 Redis API 中。
Redis 并不只是一个平凡的 kv 数据存储,而是一个拥有许多数据类型的服务器。其中有一种类型是用 String 来解释为位图-“Bitmaps are not an actual data type, but a set of bit-oriented operations defined on the String type”。字符串是safe blobs,最大长度是 512 MB,恰好等于一个2的32次方的位图。字符串的英文字符,都符合(comply to)ascii编码。
所谓的位图,可以用紧凑的方式来表示一个大的 true/false 值域,而且这个 true/false 的点还带有 position 信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# 把键的 offset 的位取出来,如果offset无值,则取0 getbit hello 10 # 把键的 offset 的位设值,只能设值0或1,返回旧值 setbit hello 1000 1 # Number of set bits in the range bitcount hello
# 1st position of 1 or 0 in the key in range. O(N) BITPOS hello 0
# 与或非 SET key1 "foobar" SET key2 "abcdef"
# and or not xor BITOP AND dest key1 key2 GET dest
其他命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14
# 返回最后结果的长度 append hello 123
# 返回结果的长度 strlen hello
# 原子化地设值并返回旧值 getset hello world123
# 设值指定位置的字符,返回修改后的字符串长度 setrange hello 1 a
# 设定指定位置的值,并返回。start 和 end 都是闭区间 getrange hello 1 2
哈希命令
设/取值
1 2 3 4 5 6 7 8 9 10 11 12 13 14
# 设值,在 key 和 value 之间加入了一个 field hset user:1 name tom
# 取值,在 key 和 value 之间加入了一个 field hget user:1 name
# 删除 field,而不删除key hdel user:1 name
# 计算 key 数目 hlen user:1
# 若 field 不存在,则设值 hsetnx user:1 name jerry
注意,len 往往是计数,而 strlen 往往是计值。
批量设/取值
1 2 3 4 5
# 批量设值 hmset user:1 name tom age 20 city beijing
# 批量获取 hmget user:1 name age city
对于mset的升级,就是把数据结构写在最前头。set -> mset -> hmset。
数值操作
1 2 3 4 5
# 按照指定值加值,这里的命令没有缺省被加数1了,必须显式指定被加数 hincrby user:1 age 10
# 按照指定值加浮点值,这里的命令没有缺省被加数1了,必须显式指定被加数 hincrbyfloat user:1 age 5.1
# 给一个 zset 增加,成员,先写score再写元素。因为有这个排序操作,这个操作的时间复杂度是O(log(n))。也支持 nx、xx、ch、incr 几个 argument。 zadd user:ranking 250 tom 1 kris 91 mike 200 frank 220 tim 250 martin