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)

posted @ 2024-07-09 15:51  Anbin啊  阅读(22)  评论(0)    收藏  举报