Redis官网指令文档:Commands | Docs
前言
此处的String类型是针对Redis的Value的,因为Key的形式都是String,而Value则有哈性、列表、集合等形式。
众所周知,由于不同编码,经常会出现乱码的问题,但在Redis中却很少出现,这是因为Redis中的字符串,直接就是按照二进制的方式进行存储的,即存进去的是啥,取出来的就是啥(一些关系型数据库则会使用字符集的形式进行存储,会对原始字符串进行修改)。
正因为其二进制的存储方式,Redis除了存储文本数据,还可以存储图片、视频、音频这类二进制文件,但Redis对String类型进行了约束,限制了最大存储512M。
常用指令
0x00 set & get
set和get是非常常用的命令,对于get来说很简单,而对于set的话还有一些参数可以进行配置。
get:
#get基本语法get key
功能:获取key的value
时间复杂度:O(1)
返回值:返回key所对应的value,如果key不存在则返回nil。
set:
#基本语法set key value [NX | XX] [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds]#其中[]表示可选项
功能:设置一个键值对,可以进行参数配置
NX:表示当key不存在进行set
XX:表示当key存在进行set
EX和PX:表示设置的过期时间,EX的单位为妙,PX单位为毫秒
EXAT和PXAT:表示设置的过期时间,不过是时间戳的格式
时间复杂度:O(1)
返回值:设置成功返回ok,失败返回错误信息
0x01 setnx
此处的命令本质就是上面set命令中增加参数而已,没有什么区别。
setnx:
#基本语法setnx key value
功能:如果key不存在就进行set,如果存在则不set
返回值: 如果key不存在就进行set,返回set成功的个数(1表示成功,0表示失败)。
时间复杂度:O(1)
0x02 setex & psetex
这两个命令也是对set命令的增强,本质上等价于set中添加参数。
setex:
#基本语法setex key seconds value等价于set key value ex seconds
功能:创建一个键值对,并设置scconds秒的过期时间
返回值:成功设置的个数
时间复杂度:O(1)
psetex:
#基本语法psetex key millionseconds value等价于set key value px millionseconds
功能:创建一个键值对,并设置millionscconds秒的过期时间
返回值:成功设置的个数
时间复杂度:O(1)
0x03 mset & mget
这两个命令可以一下次设置多个key,获取多个value,为的是节省网络开销~
mget:
#基本语法mget key1 [key2 key3 .....]redis> SET key1 "Hello"
"OK"
redis> SET key2 "World"
"OK"
redis> MGET key1 key2 nonexisting
1) "Hello"
2) "World"
3) (nil)
功能:返回多个value,如果不存在就返回nil
返回值:返回key对应的value
时间复杂度:O(N),此处的N指的是mget指令中key的个数。
mget:
#基本语法mset key1 value1 [key2 value2 .....]redis> MSET key1 "Hello" key2 "World"
"OK"
redis> GET key1
"Hello"
redis> GET key2
"World"
功能:设置多个键值对
返回值:OK
时间复杂度:O(N),此处的N指的是mset指令中key-value的个数。
0x04 incr & incrby
incr类似++操作,incrby是++一个数
incr:
#基本语法incr keyredis> SET mykey "10"
"OK"
redis> INCR mykey
(integer) 11
redis> GET mykey
"11"#如果key不存在会创建,将value置为0
#数据范围为java中long的范围
功能:对value进行自增操作,不支持小数
返回值:如果value为整数,返回自增后的值,否则显示类型错误
时间复杂度:O(1)
incrby:
#基本语法incrby key numredis> SET mykey "10"
"OK"
redis> INCRBY mykey 5
(integer) 15
功能:对value进行具体值的自增,支持负数,不支持小数。
返回值:如果value为整数,返回自增后的值,否则显示类型错误
时间复杂度:O(1)
0x05 decr & decrby
与incr相反,进行减的操作。
#基本语法decr keyredis> SET mykey "10"
"OK"
redis> DECR mykey
(integer) 9
redis> SET mykey "234293482390480948029348230948"
"OK"
redis> DECR mykey
(error) value is not an integer or out of rangedecrby key numredis> SET mykey "10"
"OK"
redis> DECRBY mykey 3
(integer) 7#如果key不存在,会创建key,并将value置为0
功能:与incr和incrby相对。
返回值:如果value为整数,返回自减后的值,否则显示类型错误
时间复杂度:O(1)
0x06 incrbyfloat
#基本语法incrbyfloat key num
功能:把key加上num,num可以为小数,如果要进行减操作,使用负数,Redis没有提供decrbyfloat
返回值:进行操作后的值
时间复杂度:O(1)
0x07 setrange & getrange
这两个命令都是对value的某个范围进行操作,这里的区间都是闭区间,下标可以为负数!
getrange:
#基本语法getrange key start endredis> SET mykey "This is a string"
"OK"
redis> GETRANGE mykey 0 3
"This"
redis> GETRANGE mykey -3 -1
"ing"
redis> GETRANGE mykey 0 -1
"This is a string"
redis> GETRANGE mykey 10 100
"string"
功能:获取key对应value的[start, end] 的字符串。下标支持负数,-1表示字符串最后一个位置,-2表示倒数第二个位置,下标越界了不会报错。
返回值:返回[star, end] 之间的字符串
时间复杂度:O(end - start)
注意:
如果字符是中文汉字的话,会有一些问题。因为在utf8中中文汉字占3个字节,而getrange是按字节来切的,后面取出来的时候会出现问题。
setrange:
#基本语法setrange key offset valueredis> SET key1 "Hello World"
"OK"
redis> SETRANGE key1 6 "Redis"
(integer) 11
redis> GET key1
"Hello Redis"
功能:在offset设置字符串value
返回值:设置成功后的长度(字节)
时间复杂度:O(1)
0x08 strlen
#基本语法strlen keyredis> SET mykey "Hello world"
"OK"
redis> STRLEN mykey
(integer) 11
redis> STRLEN nonexisting
(integer) 0
功能:返回key对应value的长度
返回值:返回key对应value的长度,不存在则返回0
时间复杂度:O(1)
0x09 append
#基本语法append key valueredis> EXISTS mykey
(integer) 0
redis> APPEND mykey "Hello"
(integer) 5
redis> APPEND mykey " World"
(integer) 11
redis> GET mykey
"Hello World"
功能:在key对应value的末尾追加字符串.如果key不存在,则类似set的操作。
返回值:追加后的字符串长度
时间复杂度:O(1)
注意:
append返回是字节的个数,返回不是字符的个数!
如果是utf8编码,一个字符占三个字节
0x0a substr(已弃用)
官方文档表示,已经认为弃用了~~
0x0b lcs
Redis7.0版本中新出的。
求两个字符串的最长公共子序列
#基本语法lcs key1 key2 [len]> MSET key1 ohmytext key2 mynewtext
OK
> LCS key1 key2
"mytext"
> LCS key1 key2 LEN
(integer) 6
功能:求最长公共子序列
返回值:根据参数配置,返回
时间复杂度:O(n*m)
内部编码
在String类型中有3中编码类型。
1)int:8个字节的整形。适用于存储整数的场景,便于计算。
2)embstr:压缩字符串。适用于比较短的字符串。
3)raw:普通字符串。适用于长的字符串,底层持有的是字节数组
127.0.0.1:6379> set key3 10
OK
127.0.0.1:6379> object encoding key3
"int"
127.0.0.1:6379> set key4 "hello"
OK
127.0.0.1:6379> object encoding key4
"embstr"
127.0.0.1:6379> set key5 "sssssssssssssssssssssssssssssssssssssssssssssssssssssssddddddddddddddddddddddddddddd"
OK
127.0.0.1:6379> object encoding key5
"raw"
最后
最后将讲解哈希类型~