Redis数据类型——String

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 key

redis> 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 num

redis> SET mykey "10"
"OK"
redis> INCRBY mykey 5
(integer) 15

功能:对value进行具体值的自增,支持负数,不支持小数。

返回值:如果value为整数,返回自增后的值,否则显示类型错误 

时间复杂度:O(1)

0x05 decr & decrby

与incr相反,进行减的操作。

#基本语法

decr key

redis> 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 range



decrby key num

redis> 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 end

redis> 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 value

redis> SET key1 "Hello World"
"OK"
redis> SETRANGE key1 6 "Redis"
(integer) 11
redis> GET key1
"Hello Redis"

 功能:在offset设置字符串value

返回值:设置成功后的长度(字节)

时间复杂度:O(1)

0x08 strlen

#基本语法

strlen key

redis> 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 value

redis> 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"

最后

最后将讲解哈希类型~

  • 37
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值