set的时候设置生命周期
set key value [ex 秒] /[px 毫秒] [nx]/[xx]
:后面接秒是可以设置key的生命周期的- 设置name的生命周期10s有效;
set name sinmu ex 10
- 设置name的生命周期10s有效;
- 当ex和px同时出现的时候,以后面的为准
- 如
set name sinmu ex 10 px 1000
,实际的时间会以1000毫秒为准
- 如
nx
:如果key不存在就进行setxx
:如果key存在就可以执行
一次性设置/获取多个key
- 一次设置多个key:
mset name sinmu sex man age 3
- 一次性获取多个value:
mget name sex age
对字符串的修改
-
setrange key offset value
:作用是从key的地offset位开始替换为value值,字符串是从第0位开始的
如:将name的值向右偏移第2个位后开始替换**:setrange name 2 **
-
当这个偏移的值大于字符串的长度时会发生一些奇妙的变化:后面的会用
\x00
补充
对字符串的追加
append key value
:将value追加到key存储的值的后面
如我需要在name后面追加一个hello
对字符串的截取
getrange key start stop
:对key的内容截取[start,stop]段- 当start >= stop > 0,会返回空字符串
- start >=length,返回空字符串
- stop >= length , 截取到字符串末尾
getset:返回旧值,设置新值
对于这个我想到一个应用场景:linux每次登陆会显示上一次的登陆时间,那么我们通过redis也可以模拟这个操作。
set time 2020-6-15
,当6.16登陆的时候显示的应该是2020-6-15这个值,并且这个时间也更新到2020-6-16登陆的值。对此的语句:getset time 20206-16
对于数字增加和减少
incr key
:增加1decr key
:减少1incrby key num
:增加numdecrby key num
:减少num
对此有些类似与一个资格的获取,淘宝进行秒杀的时候,都是先获取一个购买的资格,然后在进行订单操作,那么这个购买的资格以及对用户显示的剩余货物的数量就可以通过redis进行模拟。
比如货物的数量有100份,对此货物进行秒杀,每多一个购买的资格,就有一个触发条件进行decr key
,下一个购买者抢购资格的时候就会少一个。
将大写字母转换成小写
- 主要是使用二进制的操作
根据Ascii码表 A的十进制是65=64+1,转换成二进制为0100 0001,同理a的十进制97,其二进制为0110 0001
A 65 0100 0001
a 97 0110 0001
换言之,在A的基础上,从左往右数,只需要将第2位的0换成1即可转换成a,现在redis有这么一个命令可以对位进行操作
setbit key offset value
:将key的二进制的offset位的值设置为value,如将A转换成a,那么只需要将A的二进制的的第2位的0设置为1 就可以转换成a了,其语句为;setbit word 2 1
需要注意2个问题
- 如果这个offset超出了key原本的位的长度,会发生什么?
针对第一个问题来尝试一下,A只有8位,那么使用setbit word 10 1
说明中间是用\x00
进行填充,另我好奇的是,最后有个\b,其代表的应该是二进制,就有些令我不知其解了
- 这个offset的最大值为多少
首先来预估一下这个情况,先测试一下216=65536和232=4294967296
通过测试发现,(232 )-1是offset的最大值,就有(232)/8个字节,(232)/(8*210)k=219k,有((219)/210)M,大约在512M左右
以上为redis中的字符串的基本操作