redis中的字符串,直接按照二进制方式存储的,不会做任何编码转换,存的是什么,取出来还是什么
所以可以存储:
文本数据,整数,普通字符串,JSON,xml,图片,数据,音频
但是音频,视频体积可能过大,redis对于string类型,限制了大小最大是512Mb,redis单线程模型,希望进行操作都是比较快的
SET
操作格式:
set key value [ex(expiration) seconds | px seconds] [NX|XX]
NX:如果key不存在,才设置,如果key存在,则不设置,返回nil
EX:如果key存在,才设置,相当于更新操作,可以不存在,则不设置,返回nil
set命令的变种:
SETNX:不存在才能设置,存在则设置失败
SETEX:设置键值对的同时,设置时间
举个例子:
set key1 10 value1PSETEX:设置key过期时间,与SETEX无非是单位不同,上面是秒,下面是毫秒
新的键值对,如果key存在,则让新的value覆盖旧的value,如果进行覆盖的话创建的时间也会被重新设置。
举个例子:
//设置定时删除 set key1 123 ex 10 //不存在才设置 set key2 123 ex 10 NX清空全部键值对的操作:
FLUSHALL
GET
对于get来说,只支持string类型的value,如果value是其他类型,使用get则会失效。
MSET/MGET
与上面STE/GET最明显的区别就是,一次可以操作多组键值对
操作格式:
mset key value [key value...]
举个例子:
mset key1 value1 key2 value2 key3 value3 mget key1 key2 key3时间复杂度
O(N)
N为key的数量
INCR/INCRBY/DECR/DECRBY/INCRBYFLOT
incr:对value进行+1
incrby:duivalue进行+n
decr:对value进行-1
decrby:对value进行-n
incrbyfloat:对value+/-小数n
举个例子:
set key 10 incr key注意:
该整数大小对应C++中的long long
incr操作的key如果不存在,就会把这个key的value当作0来使用
incr/incrby/incrbyfloat加上负数就可以当减来使用
value支持负数的存在
时间复杂度:
O(1)
APPEND
如果key已经存在,并且是一个string,命令会将value追加到原有string后边。如果key不存在,那么该命令相当于set命令
操作格式:
append key value
举个例子:
append key1 value1返回值:
追加后string的长度
时间复杂度:
O(1)
注意:
在Xshell终端,默认字符编码为utf8,所以在该终端输入汉字后,也是utf8编码的,所以一个汉字在itf8字符集中,通常是3个字节
在启动redis客户端的时候,加上--raw这样的选项,就可以使redis客户端能自动把二进制数据尝试翻译
CTRL + s在XShell中的作用是冻结当前画面
CTRL + q在XShell中的作用是解除冻结当前画面
getrange
获取字符串中的子串,相当于C++中的substr
操作格式:
getrange key start end
注意:
该指定的区间是前闭后闭,而不是大多数的前闭后开
redis下标还支持负数,-1表示倒数第一个
举个例子:
//设置一组键值对 set key helloworld //获取该键值对中的子串,从头拿到最后一个字符 getrange key 0 -1注意:
如果字符串中的是汉字,此时切分字串,很可能不是完整的汉字,结果就非常随机
SETRANGE
对字串进行修改
操作格式:
setrange key offset(偏移量,可以理解为从第几个字节开始替换的)value
返回值:
替换后新的字符串的长度
注意:
替换后的长度不一定等于原长度,因为替换字串可能过长,导致长度高于原串长度
举个例子:
//设置键值对 set key1 helloword //替换字串,这样长度就高于燕来的子串 setrange key1 offset aaaaaaaaaaaaaaaaaaaa注意:
该方式也可能导致汉字成乱码
setrange针对不存在的key也是可以操作的,不过会把offset之前不存在的内容填充成0x00
STRLEN
获取字符串的长度,单位是字节,当key存放的不是类型string时,会进行报错
操作格式:
strlen key
时间复杂度:
O(1)
返回值:
string的长度,当key不存在时返回0
举个例子:
set key1 value1 strlen key1string的编码方式
字符串类型内部的编码方式有3种:
int:8字节编码
embstr:小于等于39个字节的字符串
raw:大于39个字节字符串
注意:
不用刻意记住这些数字,这些数字可以根据需求场景进行配置
redis存储小数,本质上还是当作字符串来存,也就意味之在进行小数运算时需要先将字符串转换成小数,计算完毕后,再将小数转换成字符串进行存储,所以相对于整数计算,小数的开销更大。