文章目录
- String字符串类型
- 常用命令
- set
- get
- MGET
- MSET
- 计数命令
- INCR
- INCRBY
- DECR
- DECRBY
- INCRBYFLOAT
- 其它命令
- APPEND
- GETRANGE
- SETRANGE
- STRLEN
- 命令总结
String字符串类型
1)⾸先Redis中所有的键的类型都是字符串类型
2)字符串类型的值(value)实际可以是字符串,包含⼀般格式的字符串或者类似JSON、XML格式的字符串,数字(整型或者浮点型);甚⾄是⼆进制流数据,例如图⽚、⾳频、视频等。不过⼀个字符串的最⼤值不能超过512MB
注意:由于Redis内部存储字符串完全是按照⼆进制流的形式保存的,所以Redis是不处理字符集编码问题的,客⼾端传⼊的命令中使⽤的是什么字符集编码,就存储什么字符集编码
常用命令
set
将string类型的value设置到key中。如果key之前存在,则覆盖,⽆论原来的数据类型是什么。之前关于此key的TTL也全部失效
语法:SET key value [expire EX seconds|PX milliseconds] [NX|XX]
选项含义:
- EX seconds⸺使⽤秒作为单位设置key的过期时间
- PX milliseconds ⸺使⽤毫秒作为单位设置key的过期时间
- NX ⸺只在key不存在时才进⾏设置,即如果key已经存在,设置不执行
- XX ⸺只在key存在时才进⾏设置,即如果key如果不存在,设置不执行
返回值:
-
如果设置成功,返回OK
-
如果由于SET指定了NX或者XX但条件不满⾜,SET不会执⾏,并返回(nil)
时间复杂度: O ( 1 ) O(1) O(1)
注意:由于带选项的SET命令可以被 SETNX 、 SETEX 、 PSETEX 等命令代替
setnx
key-value不存在才能设置,如果存在则设置失败
语法:SETNX key value
返回值:1表⽰设置成功。0表⽰没有设置
setex
设置key的过期时间,单位是秒
语法:SETEX key seconds value
psetex
设置key的过期时间,单位是毫秒
语法:PSETEX key milliseconds value
get
获取key对应的value。如果key不存在,返回nil。如果value的数据类型不是string,会报错。
语法:GET key
返回值:key对应的value,或者nil当key不存在
MGET
⼀次性获取多个key的值。如果对应的key不存在或者对应的数据类型不是string,返回nil
语法:MGET key [key ...]
时间复杂度: O ( N ) O(N) O(N),其中 N N N为key的数量
返回值:对应value的列表
MSET
⼀次性设置多个key的值
语法:MSET key value [key value ...]
时间复杂度: O ( N ) O(N) O(N),其中 N N N为key的数量
返回值:永远是OK
多次get和单词mget的区别:
使⽤mget/mset由于可以有效地减少了⽹络时间,所以性能相较更⾼。使⽤批量操作,可以有效提⾼业务处理效率,但是要注意,每次批量操作所发送的键的数量也不是⽆节制的,否则可能造成单⼀命令执⾏时间过⻓,导致Redis阻塞
计数命令
很多存储系统和编程语⾔内部使⽤CAS机制实现计数功能,会有⼀定的CPU开销,但在Redis中完全不存在这个问题,因为Redis是单线程架构,任何命令到了Redis服务端都要顺序执⾏
INCR
将key对应的string表⽰的数字加⼀。如果key不存在,则视为key对应的value是0,然后对应+1。如果key对应的string不是⼀个整型或者范围超过了64位有符号整型,则报错
语法:INCR KEY
返回值:integer类型的加完后的数值
INCRBY
将key对应的string表⽰的数字加上对应的值。如果key不存在,则视为key对应的value是0。如果key对应的string不是⼀个整型或者范围超过了64位有符号整型,则报错
语法:INCRBY key decrement #decrement可以是正数,负数,0 但不可能是浮点数
返回值:integer类型的加完后的数值
DECR
将key对应的string表⽰的数字减⼀。如果key不存在,则视为key对应的value是0。如果key对应的string不是⼀个整型或者范围超过了64位有符号整型,则报错
语法:DECR key
返回值:integer类型的减完后的数值
DECRBY
将key对应的string表⽰的数字减去对应的值。如果key不存在,则视为key对应的value是0。如果key对应的string不是⼀个整型或者范围超过了64位有符号整型,则报错
语法:DECRBY key decrement #decrement可以是正数,负数,0 但不可能是浮点数
返回值:integer类型的减完后的数值
INCRBYFLOAT
将key对应的string表⽰的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果key不存在,则视为key对应的value是0。如果key对应的不是string,或者不是⼀个浮点数,则报错。允许采⽤科学计数法表⽰浮点数
语法:INCRBYFLOAT key increment
返回值:加/减完后的数值
注意:上述操作的时间复杂度都是 O ( 1 ) O(1) O(1),因为redis处理命令的时候是单线程模型,多个客户端同时对同一个key进行计数命令操作不会引起线程安全问题
其它命令
APPEND
如果key已经存在并且是⼀个string,命令会将value追加到原有string的后边。如果key不存在,则效果等同于SET命令
语法:APPEND KEY VALUE
时间复杂度: O ( 1 ) O(1) O(1) 追加的字符串⼀般⻓度较短,可以视为 O ( 1 ) O(1) O(1)
返回值:追加完成之后string的⻓度,单位是字节
redis不会对字符编码做任何处理,redis不认识字符,只认识字节,xshell默认的字符编码是utf8
,所以汉字也是按照utf8
进行编码的,在utf8
当中,一个汉字占用3个字节,因为append返回的是追加之后string的⻓度,单位是字节,所以为6。通过get命令进行获取的时候,是按照原始的utf-8
编码,以16进制的方式进行展示 :\x
表示16进制
注意:在启动redis的时候,可以加上--raw
选项,可以使redis客户端自动将二进制数据尝试翻译
GETRANGE
返回key对应的string的⼦串,由start和end确定(左闭右闭)。可以使⽤负数表⽰倒数。-1代表倒数第⼀个字符,-2代表倒数第⼆个,其他的与此类似。超过范围的偏移量会根据string的⻓度调整成正确的值
作用:截取子串
语法:GETRANGE key start end
时间复杂度:O(N),N为 [ s t a r t , e n d ] [start,end] [start,end]区间的⻓度.由于string通常⽐较短,可以视为是O(1) 返回值:string类型的⼦串
正常下标都是从0开始的整数,但是redis的下标是可以支持负数的,其中-1代表的是最后一个元素
注意:如果字符串当中保存的是汉字,此时进行子串切分,很有可能切出来的是不完整的汉字,此结果在utf8码表当中不知道能查出什么
SETRANGE
覆盖字符串的⼀部分,从指定的偏移开始
语法:SETRANGE key offset value
- offset:偏移量 ,从第几个字节开始进行替换
- value:要替换后的结果,替换多长具体是看value的长度
时间复杂度:O(N),N为value的⻓度.由于⼀般给的value⽐较短,通常视为O(1).
返回值:替换后的string的⻓度
注意:setrange针对不存在的key也是可以操作的,但是会把offset之前的内容都填充为0x00
STRLEN
获取key对应的string的⻓度。当key存放的类似不是string时,报错
语法:STRLEN key
时间复杂度:O(1) 返回值:string的⻓度,单位是字节,当key不存在时,返回0
utf-8
编码当中,一个汉字占用3字节