Redis中的string字符串介绍

String字符串

字符串类型是Redis最基础的数据类型,关于字符串类型需要特别注意以下几点:

  • Redis中所有的键类型都是字符串类型,而且其他几种数据结构也都是在字符串类型基础上构建的,例如链表和集合的元素类型也是字符串类型

  • 不止局限于一般格式的字符串或者JSON、XML格式的字符串,像是数字(整型、浮点型)、甚至是二进制数据,例如图片、音频、视频等等。

  • 一个字符串的最大不超过512MB

  • Redis内部存储字符串完全是按照二进制流的形式保存的,所以Redis是不处理字符集的编码问题的,客户端传入的命令中使用的是什么字符编码,就存储什么字符编码。

关于Redis是不处理字符集的编码问题的演示:

如果想看到对应的字符需要在进入客户端时加入 --raw

shell 复制代码
127.0.0.1:6379> set key2 你好
OK
127.0.0.1:6379> get key2
"\xe4\xbd\xa0\xe5\xa5\xbd"
127.0.0.1:6379> 
root@instance-5a74bdri:~# redis-cli --raw
127.0.0.1:6379> get key2
你好
127.0.0.1:6379> 

常见命令

SET

语法:

shell 复制代码
SET key value [NX|XX] [expiration EX seconds|PX milliseconds]

功能:

将string类型的value设置到key中。如果key之前存在,则覆盖,无论原来的数据类型是什么,之前关于此key的TTL也全部失效。

命令有效版本:1.0.0以后

时间复杂度:O(1)

选项介绍:

  • EX seconds :使用秒作为设置key的过期时间
  • PX millseconds :使用毫秒作为单位设置key的过期时间
  • NX :只在key不存在时才进行设置,即如果key之前已经存在,设置不执行
  • XX :只在key存在时才进行设置,即如果key之前不支持,设置不执行

注意:由于带选项的set命令可以被 SETNX,SETEX,PSETEX等命令代替,所以之后的版本中,redis可能进行合并。

返回值:

  • 如果设置成功,返回OK。

  • 如果由于SET指定的NX获取XX但是条件不满足,SET不会执行,并返回nil

演示:

shell 复制代码
127.0.0.1:6379> set key1 value1 NX
OK
127.0.0.1:6379> set key1 value1 NX
(nil)
127.0.0.1:6379> set key1 value2 XX
OK
127.0.0.1:6379> set key2 value2 NX EX 100
OK
127.0.0.1:6379> TTL key2
94
127.0.0.1:6379> 

GET

语法:

shell 复制代码
GET key

功能:

获取key对应的value。如果key不存在,返回nil。如果value的数据类型不是sting,会报错。

命令有效版本:1.0.0以后

时间复杂度:O(1)

返回值:key对应的value,或者nil

演示:

shell 复制代码
127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> get key2
(nil)
127.0.0.1:6379> 

MGET

语法:

shell 复制代码
MGET key [key ...]

功能:

一次性获取多个key的值。如果对应的key不存在或者对应的数据类型不是string,返回nil。

命令有效版本:1.0.0以后

时间复杂度:O(1)

返回值:key对应的value列表,或者nil

演示:

shell 复制代码
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set key1 value
OK
127.0.0.1:6379> set key2 value2
OK
127.0.0.1:6379> set key3 value3
OK
127.0.0.1:6379> mget key1 key2 key3
1) "value"
2) "value2"
3) "value3"
127.0.0.1:6379> 

MSET

语法:

shell 复制代码
MSET key value [key value ...]

功能:一次性设置多个key的值

命令有效版本:1.0.1以后

时间复杂度:O(N)

返回值:有且只有OK

演示:

shell 复制代码
127.0.0.1:6379> mset key1 value1 key2 value2 key3 value3
OK
127.0.0.1:6379> mget key1 key2 key3
1) "value1"
2) "value2"
3) "value3"
127.0.0.1:6379> 

注意:Redis提供MSET和MGET的目的是为了减少网络通信的次数,但是每次批量操作所发送的键的数量也不能是无节制的,否则可能造成单一命令执行时间过长导致Redis堵塞。

SETNX

语法:

shell 复制代码
SETNX key value

功能:

只允许key之前不存在的情况下设置key value。

命令有效版本:1.0.0以后

时间复杂度:O(1)

返回值:1表示设置成功,0表示设置失败。

演示:

shell 复制代码
127.0.0.1:6379> setnx key1 value1
(integer) 1
127.0.0.1:6379> setnx key1 value
(integer) 0
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> 

计数命令

INCR

语法:

shell 复制代码
INCR key

功能:

将key对应的string表示的数字加一。如果key不存在,则将key视为对应的value为0。如果key对应的string不是一个整型或者范围超过了64位有符号整型,则报错。

命令有效版本:1.0.0以后

时间复杂度:O(1)

返回值:integer类型加完后的数值

演示:

shell 复制代码
127.0.0.1:6379> exists key1
(integer) 0
127.0.0.1:6379> incr key1
(integer) 1
127.0.0.1:6379> get key1
"1"
127.0.0.1:6379> set key2 10
OK
127.0.0.1:6379> incr key2
(integer) 11
127.0.0.1:6379> get key2
"11"
127.0.0.1:6379> set key3 abcdefg
OK
127.0.0.1:6379> incr key3
(error) ERR value is not an integer or out of range
127.0.0.1:6379> 

INCRBY

语法:

shell 复制代码
INCRBY key decrement

功能:将key对应的string表示的数字加N。如果key不存在,则将key视为对应的value为0。如果key对应的string不是一个整型或者范围超过了64位有符号整型,则报错。

命令有效版本:1.0.0以后

时间复杂度:O(1)

返回值:integer类型加完后的数值

演示:

shell 复制代码
127.0.0.1:6379> exists key
(integer) 0
127.0.0.1:6379> incrby key 100
(integer) 100
127.0.0.1:6379> get key
"100"
127.0.0.1:6379> set key1 111
OK
127.0.0.1:6379> incrby key1 123
(integer) 234
127.0.0.1:6379> get key1
"234"
127.0.0.1:6379> 

DECR

语法:

shell 复制代码
DECR key

功能:

将key对应的string表示的数字减一。如果key不存在,则将key视为对应的value为0。如果key对应的string不是一个整型或者范围超过了64位有符号整型,则报错。

命令有效版本:1.0.0以后

时间复杂度:O(1)

返回值:integer类型加完后的数值

演示:

shell 复制代码
127.0.0.1:6379> clear
127.0.0.1:6379> exists key
(integer) 0
127.0.0.1:6379> decr key
(integer) -1
127.0.0.1:6379> get key
"-1"
127.0.0.1:6379> set key1 101
OK
127.0.0.1:6379> decr key1
(integer) 100
127.0.0.1:6379> get key1
"100"
127.0.0.1:6379> 

DECRBY

语法:

shell 复制代码
DECRBY key decrement

功能:

将key对应的string表示的数字减N。如果key不存在,则将key视为对应的value为0。如果key对应的string不是一个整型或者范围超过了64位有符号整型,则报错。

命令有效版本:1.0.0以后

时间复杂度:O(1)

返回值:integer类型加完后的数值

演示:

shell 复制代码
127.0.0.1:6379> exists key
(integer) 0
127.0.0.1:6379> decrby key 100
(integer) -100
127.0.0.1:6379> get key
"-100"
127.0.0.1:6379> set key1 114514
OK
127.0.0.1:6379> decrby key1 7878
(integer) 106636
127.0.0.1:6379> get key1
"106636"
127.0.0.1:6379> 

INCRBYFLOAT

语法:

shell 复制代码
INCRBYFLOAT key increment

功能:

将key对应的string表⽰的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果

key不存在,则视为key对应的value是0。如果key对应的不是string,或者不是⼀个数值,则报

错。允许采⽤科学计数法表⽰浮点数

命令有效版本:2.6.0以后

时间复杂度:O(1)

返回值:加减完后的数值

演示:

shell 复制代码
127.0.0.1:6379> set key 10.10
OK
127.0.0.1:6379> incrbyfloat key 10.09
"20.19"
127.0.0.1:6379> incrbyfloat key 2.0e2
"220.19"
127.0.0.1:6379> 

注意:没有DECRBYFLOAT

其他命令

APPEND

语法:

shell 复制代码
APPEND KEY VALUE

功能:

如果key已经存在并且是⼀个string,命令会将value追加到原有string的后边。如果key不存在,

则效果等同于SET命令。

命令有效版本:2.0.0以后

时间复杂度:O(1)

返回值:追加后的string长度

演示:

shell 复制代码
127.0.0.1:6379> exists key
(integer) 0
127.0.0.1:6379> append key 12345
(integer) 5
127.0.0.1:6379> get key
"12345"
127.0.0.1:6379> set key1 12345
OK
127.0.0.1:6379> append key1 54321
(integer) 10
127.0.0.1:6379> get key1
"1234554321"
127.0.0.1:6379> 

GETRANGE

语法:

shell 复制代码
GETRANGE key start end

功能:

返回key对应的string的⼦串,由start和end确定(左闭右闭)。可以使⽤负数表⽰从后往前。-1代表倒数第⼀个字符,-2代表倒数第⼆个,其他的与此类似。超过范围的偏移量会根据string的⻓度调整成正确的值。

命令有效版本:2.4.0以后

时间复杂度:O(N)

返回值:string类型的子串

演示:

shell 复制代码
127.0.0.1:6379> set key "you can see me"
OK
127.0.0.1:6379> getrange key 0 -1
"you can see me"
127.0.0.1:6379> getrange key -3 -1
" me"
127.0.0.1:6379> getrange key 0 1000
"you can see me"
127.0.0.1:6379> getrange key -100 100
"you can see me"
127.0.0.1:6379> 

SETRANGE

语法:

shell 复制代码
SETRANGE key offset value

功能:

覆盖字符串的一部分,从指定的偏移开始

命令有效版本:2.2.0以后

时间复杂度:O(N)

返回值:替换后的string的长度

演示:

shell 复制代码
127.0.0.1:6379> set key "hello world"
OK
127.0.0.1:6379> setrange key 6 "redis"
(integer) 11
127.0.0.1:6379> get key
"hello redis"
127.0.0.1:6379> 

STRLEN

语法:

shell 复制代码
STRLEN key

功能:

获取key对应的stirng的长度。当key存放的类型不是string时,报错。

命令有效版本:2.2.0以后

时间复杂度:O(1)

返回值:string的长度。或者当key不存在时,返回0。

演示:

shell 复制代码
127.0.0.1:6379> set key "you can see me"
OK
127.0.0.1:6379> strlen key
(integer) 14
127.0.0.1:6379> strlen key2
(integer) 0
127.0.0.1:6379> 

内部编码

字符串类型的内部编码有3种:

  • int :8字节的长整型。

  • embstr :小于等于39字节的字符串。

  • raw :大于39字节的字符串。

Redis会根据当前值的类型和长度动态决定使用哪种内部编码实现。

演示:

shell 复制代码
127.0.0.1:6379> set int 123
OK
127.0.0.1:6379> object encoding int
"int"
127.0.0.1:6379> set embstr abcdef
OK
127.0.0.1:6379> object encoding embstr
"embstr"
127.0.0.1:6379> set raw aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
OK
127.0.0.1:6379> object encoding raw
"raw"
127.0.0.1:6379> 

经典使用场景

缓存功能

使用Redis作为缓存层,热点数据后都存储在Redis当中,由于Redis具有支撑高并发的特性,所以缓存通常能起到加速读写降低后端压力的作用。

计数功能

使用Redis为视频网站的视频播放次数计数,用户每播放一次视频,相应的视频播放数加一。

共享会话 session

⼀个分布式Web服务将⽤⼾的Session信息(例如⽤⼾登录信息)保存在各⾃的服务器中,但这样会造成⼀个问题:出于负载均衡的考虑,分布式服务会将⽤⼾的访问请求均衡到不同的服务器上,并且通常⽆法保证⽤⼾每次请求都会被均衡到同⼀台服务器上,这样当⽤⼾刷新⼀次访问是可能会发现需要重新登录,这个问题是⽤⼾⽆法容忍的。

短信验证码

使用Redis存储一个定时5分钟的随机6位数字充当验证码。

总结

与字符串有关的命令有:

set、get、del、mset、mget、incr、decr、incrby、decrby、incrbyfloat、append、strlen、setrange、getrange

应用场景有:

缓存功能、计数功能、共享会话、短信验证码。

相关推荐
你才是臭弟弟2 小时前
实时数据库与时序数据库
数据库·时序数据库
Python少年班2 小时前
MySQL MongoDB Redis官方本地百度网盘下载链接
redis·mysql·mongodb
月空MoonSky2 小时前
GaussDB与Oracle数据库的比较
数据库·oracle·gaussdb
Codeking__2 小时前
Redis分布式——分布式锁
数据库·redis·分布式
程序员敲代码吗2 小时前
持续集成/持续部署(CI/CD) for Python
jvm·数据库·python
倔强的石头1062 小时前
让时序开发更可控:金仓时序 DB 的易用性实践与平台化路径
数据库·kingbase
霸道流氓气质2 小时前
SpringBoot+modbus4j实现ModebusTCP通讯定时读取多个plc设备数并存储进redis中
java·spring boot·redis·modbustcp·plc
BD_Marathon2 小时前
MyBatis的一级缓存
spring·缓存·mybatis
数据知道2 小时前
PostgreSQL实战:如何用 CTE(公用表表达式)解决复杂的查询逻辑
数据库·postgresql