Redis开发运维实践数据操作之字符串操作

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开发运维实践指南》内容,该书作者为黄鹏程,已授权转载。

时间: 2024-10-07 20:04:09

Redis开发运维实践数据操作之字符串操作的相关文章

Redis开发运维实践数据操作之列表操作

2.3.1 添加元素 lpush key string 在key对应list的头部添加字符串元素,返回1表示成功,0表示key存在且不是list类型.注意:江湖规矩一般从左端Push,右端Pop,即LPush/RPop. lpushx 也是将一个或者多个value插入到key列表的表头,但是如果key不存在,那么就什么都不在,返回一个false[rpushx也是同样] rpush key string 同上,在尾部添加 linsert 在key对应list的特定位置之前或之后添加字符串元素 ,

Redis开发运维实践数据操作之集合操作

2.4.1 添加元素 sadd key member 成功返回1,如果元素以及在集合中返回0,key对应的set不存在返回错误 2.4.2 移除元素 srem key member 成功返回1,如果member在集合中不存在或者key不存在返回0,如果key对应的不是set类型的值返回错误 2.4.3 删除并返回元素 spop key 如果set是空或者key不存在返回nil 2.4.4 随机返回一个元素 srandmember key 同spop,随机取set中的一个元素,但是不删除元素 2.

Redis开发运维实践数据操作之哈希操作

2.6.1 设置hash值 hset key field value 设置hash field为指定值,如果key不存在,则先创建. hsetnx 设置hash field为指定值,如果 key 不存在,则先创建.如果 field已经存在,返回0,nx是not exist的意思. 2.6.2 获取hash值 hget key field 获取指定的hash field hmget key filed1....fieldN 获取全部指定的hash filed hmset key filed1 va

Redis开发运维实践数据迁移之将key从当前数据库移动到指定数据库

4.1 将key从当前数据库移动到指定数据库 返回1成功.0 如果key不存在,或者已经在指定数据库中 Redis开发运维实践指南 本文为<Redis开发运维实践指南>内容,该书作者为黄鹏程,已授权转载.

Redis开发运维实践数据操作有序集合操作

2.5.1 添加元素 zadd key score member 添加元素到集合,元素在集合中存在则更新对应score. 2.5.2 删除元素 zrem key member 1表示成功,如果元素不存在返回0 zremrangebyrank key min max 删除集合中排名在给定区间的元素 zremrangebyscore key min max 删除集合中score在给定区间的元素 2.5.3 增加score zincrby key incr member 增加对应member的scor

Redis开发运维实践数据操作之HyperLogLog操作

2.7.1 将元素添加至 HyperLogLog PFADD key element [element ...] 这个命令可能会对 HyperLogLog 进行修改,以便反映新的基数估算值,如果 HyperLogLog 的基数估算值在命令执行之后出现了变化, 那么命令返回 1 , 否则返回 0 . 命令的复杂度为 O(N) ,N 为被添加元素的数量. 2.7.2 返回给定 HyperLogLog 的基数估算值 PFCOUNT key [key ...] 当只给定一个 HyperLogLog 时,

Redis开发运维实践指南数据操作之key操作

数据操作 熟悉每个数据操作前一定要明白每个操作都是代价,以时间复杂度和对应查询集或者结果集大小为衡量.时间复杂度收敛状况如下: 2.1.1 列出key keys *user* keys * 有3个通配符 *, ? ,[] *: 通配任意多个字符 ?: 通配单个字符 []: 通配括号内的某1个字符 注:生产已经禁止.更安全的做法是采用scan,原理和操作如下: 针对Keys的改进,支持分页查询Key.在迭代过程中,Keys有增删时不会要锁定写操作,数据集完整度不做任何保证,同一条key可能会被返回

Redis开发运维实践常见运维操作(一)

3.1 启动 3.1.1 启动redis 常见选项: ./redis-server (run the server with default conf) ./redis-server /etc/redis/6379.conf ./redis-server --port 7777 ./redis-server --port 7777 --slaveof 127.0.0.1 8888 ./redis-server /etc/myredis.conf --loglevel verbose 3.1.2

Redis开发运维实践开发设计规范之数据异常处理

4.3 数据异常处理 程序应该处理如果redis数据丢失时的清理redis内存和重新加载的过程. Redis开发运维实践指南