Redis之string类型详解
追加字符串
set anbin hello #设置anbin值为hello
假如我还想在hello后面追加一些字符串,那么可以使用append命令,例如:append anbin world,此时anbin的值就是helloworld;需要注意的是,如何append作用的key不存在,将会自动转为set操作;
也就是说使用append anbin world时,假如anbin这个key不存在,默认set一个key为anbin,value为world的键值对。
获取字符串长度
现在来获取一下刚刚设置的anbin值长度。
strlen anbin
返回值为10,即anbin的值helloworld长度为10位字符。
字符递增1
set num 1 #设置num值为1
incr num #让num值递增1
get num #此时num值为2
这个命令的业务场景可以使用于:网站浏览量,页面计数统计,排行榜数据更新等。
字符递减1
延续上面“字符递增”的例子,业务场景相同,但作用与之相反。注意奥,递减的值可以是<0的负数,也就是说递减后的最小值并不是0
decr num #让num值递减1
字符步长增加
延续上面“字符递增1的例子”,假如我这一次想对字符串值+2,下一次想+10,再下一次想+100,每次要增加的值就叫做步长,步长并不是固定的。
inerby num 2 #num值+2
inerby num 100 #num值+100
字符步长减少
延续上面“字符递减1的例子”,假如我这一次想对字符串值-2,下一次想-100,命令如下:
decrby num 2 #num值-2
decrby num 100 #num值-100
截取字符串
set name wangzherongyao
getrange name 0 3 #字符串下标为0,从第一个字符串截取到第4个字符串,返回wang
getrange name 0 -1 #末尾参数传入-1获取完整的字符串值,返回wangzherongyao(不知道这命令有啥用,不如直接get)
替换字符串
set key2 abcdefg
setrange key2 1 xx #讲key2的值从第1位开始进行替换,替换的字符长度取决于写入的值
get key2 #返回值为axxdefg
同时设置key-value有效时间
与expire作用相同,setex可以实现对key设置有效时间。不同点在于:expire设置要分两步,先set key再expire key seconds。而setex只需要一步,set的同时设置seconds时间秒数。
setex key3 20 value3
#设置key为key3,value为value3的值,并设置其有效时间为20秒
同时设置key-value有效时间 (若key不存在)
与expire的相同点和不同点,和上述setex一样。
setex和setnx的区别在于:setex是直接强制set key,不管key存不存在;
而setnx则会进行判断key,如果key不存在才会执行,所以setnx在分布式锁中用的很频繁。
setex key4 30 value4 #设置键为key4,值为value4,有效时间30秒
get key4 #返回value4
setnx key4 20 value44 #当key4这个键不存在时,设置键为key4,值为value44,有效时间20秒
get key4 #返回value4,因为key4已经存在了,所以setnx命令实际不会生效,依旧返回原始值value4
批量设置与批量获取
mset k1 v1 k2 v2 k3 v3 #使用mset批量设置3个键值对,以空格做区分。
keys * #返回k1 k2 k3
mget k1 k2 k3 #使用mget批量获取3个键的值,返回v1 v2 v3
批量设置(若key不存在)
msetnx k4 v4 k5 v5 #使用msetnx批量设置2个键值对,以空格做区分
需要注意:使用msetnx有可能会失败,因为redis自带事务,事务特性中又有原子性保证数据完整。
例如: msetnx k1 v1 k100 v100 #返回0,代表执行失败
为什么会出现这种情况呢?因为k1这个key已经设置过了,而msetnx仅会在key不存在时执行,
所以尽管后面的k100这个key没有设置过,但由于k1已经被设置过了而导致失败,还是会因为原子性一起失败。
获取再设置
getset db redis
#先get到db的值,返回值后(不存在则返回nil,存在则直接返回get的值),再set值为redis
getset db mysql #先get到db的值,由于上条命令已经设置值为redis,所以此处会返回值为redis,再set值为mysql(注意,此时值已经被更新为mysql,不再是redis)