2.2.1 设置key对应的值为string类型的value
set key value [ex 秒数] / [px 毫秒数] [nx] /[xx]
返回1表示成功,0失败
注: 如果ex,px同时写,以后面的有效期为准
setnx key value
仅当key不存在时才Set,如果key已经存在,返回0 。nx 是not exist的意思。
应用场景:用来选举Master或做分布式锁:所有Client不断尝试使用SetNx master myName抢注Master,成功的那位不断使用Expire刷新它的过期时间。如果Master倒掉了key就会失效,剩下的节点又会发生新一轮抢夺。
mset key1 value1 ... keyN valueN
一次设置多个key的值,成功返回1表示所有的值都设置了,失败返回0表示没有任何值被设置
msetnx key1 value1 ... keyN valueN
同上,但是不会覆盖已经存在的key
SET 命令还支持可选的 NX 选项和 XX 选项,例如:SET nx-str "this will fail" XX
如果给定了 NX 选项,那么命令仅在键 key 不存在的情况下,才进行设置操作;如果键 key 已经存在,那么 SET ... NX 命令不做动作(不会覆盖旧值)。
如果给定了 XX 选项,那么命令仅在键 key 已经存在的情况下,才进行设置操作;如果键 key 不存在,那么 SET ... XX 命令不做动作(一定会覆盖旧值)。在给定 NX 选项和 XX 选项的情况下,SET 命令在设置成功时返回 OK ,设置失败时返回 nil 。
2.2.2 获取key对应的string值
get key
如果key不存在返回nil
getset key value
原子的设置key的值,并返回key的旧值。如果key不存在返回nil。应用场景:设置新值,返回旧值,配合setnx可实现分布式锁。
分布式锁的思路:注意该思路要保证多台Client服务器的NTP一致。
C3发送SETNX lock.foo 想要获得锁,由于C0还持有锁,所以Redis返回给C3一个0
C3发送GET lock.foo 以检查锁是否超时了,如果没超时,则等待或重试。
反之,如果已超时,C3通过下面的操作来尝试获得锁:
GETSET lock.foo
通过GETSET,C3拿到的时间戳如果仍然是超时的,那就说明,C3如愿以偿拿到锁了。
如果在C3之前,有个叫C4的客户端比C3快一步执行了上面的操作,那么C3拿到的时间戳是个未超时的值,这时,C3没有如期获得锁,需要再次等待或重试。留意一下,尽管C3没拿到锁,但它改写了C4设置的锁的超时值,不过这一点非常微小的误差带来的影响可以忽略不计。
伪代码为:
get lock
lock = 0
while lock != 1:
timestamp = current Unix time + lock timeout + 1
lock = SETNX lock.foo timestamp
if lock == 1 or (now() > (GET lock.foo) and now() > (GETSET lock.foo timestamp)):
break;
else:
sleep(10ms)
do your job
do_job()
release
if now() < GET lock.foo:
DEL lock.foo
以上是一个单Server 的分布式锁思路,官网上还介绍了另一个单机使用超时方式进行的思路,和这个基本一致,并且在同一个文档中介绍了一个名为redlock的多Server容错型分布式锁的算法,同时列出了多语言的实现。这个算法的优势在于几个服务器可以有少量的时间差,不要求严格时间一致。
也可以设计一个按小时计算的计数器,可以用GetSet获取计数并重置为0。
mget key1 key2 ... keyN
一次获取多个key的值,如果对应key不存在,则对应返回nil
incr key
对key的值做加加操作,并返回新的值。注意incr一个不是int的value会返回错误,incr一个不存在的key,则设置key为1。范围为64有符号,-9223372036854775808~9223372036854775807。
decr key
同上,但是做的是减减操作,decr一个不存在key,则设置key为-1
incrby key integer
同incr,加指定值 ,key不存在时候会设置key,并认为原来的value是 0
decrby key integer
同decr,减指定值。decrby完全是为了可读性,我们完全可以通过incrby一个负值来实现同样效果,反之一样。
incrbyfloat key floatnumber
针对浮点数
哪些可以被操作呢?
这个操作的应用场景:计数器
2.2.4 追加字符串
append key value
返回新字符串值的长度。
2.2.5 截取字符串
substr key start end
返回截取过的key的字符串值,注意并不修改key的值。下标是从0开始的
2.2.6 改写字符串
SETRANGE key offset value
用value 参数覆写(overwrite)给定key 所储存的字符串值,从偏移量offset 开始。 不存在的key 当作空白字符串处理。可以用作append:
注意: 如果偏移量>字符长度, 该字符自动补0x00,注意它不会报错
2.2.7 返回子字符串
GETRANGE key start end
返回key 中字符串值的子字符串,字符串的截取范围由start 和end 两个偏移量决定(包括start 和end 在内)。可以使用负值,字符串右面下标是从-1开始的。
注意返回值处理:
1: start>=length, 则返回空字符串 2: stop>=length,则截取至字符结尾 3: 如果start 所处位置在stop右边, 返回空字符串
2.2.8 取指定key的value值的长度
strlen
2.2.9 位操作
注意:位操作中的位置是反过来的,offset过大,则会在中间填充0,比如 SETBIT bit 0 1,此时bit为10000000,此时再进行SETBIT bit 7 1,此时bit为10000001。offset最大2^32-1。
GETBIT key offset / SETBIT key offset value
设置某个索引的位为0/1
bitcount
对位进行统计
bitop
对1个或多个key对应的值进行AND/OR/XOR/NOT操作
注意:
1.bitop操作避免阻塞应尽量移到slave上操作. 2.对于NOT操作, key不能多个
本文为《Redis开发运维实践指南》内容,该书作者为黄鹏程,已授权云栖社区转载。