[Redis][String][上]详细讲解
目录
- 0.前言
- 1.常见命令
- 1.SET
- 2.GET
- 3.MSET && MGET
- 4.SETNX && SETXX
- 2.计数命令
- 1.INCR
- 2.INCRBY
- 3.DECR
- 4.DECYBY
- 5.INCRBYFLOAT
- 6.注意
0.前言
-
字符串类型是Redis最基础的数据类型,关于字符串需要特别注意:
- Redis中所有的键的类型都是字符串类型,⽽且其他⼏种数据结构也都是在字符串类似基础上构建的
- 例如:列表和集合的元素类型是字符串类型
- 字符串类型的值实际可以是字符串,包含⼀般格式的字符串 --> 不仅仅可以存储文本数据
- 类似JSON、XML格式的字符串
- 数字,可以是整型或者浮点型
- 甚⾄是⼆进制流数据,
- 例如:图⽚、⾳频、视频等
- 例如:图⽚、⾳频、视频等
- Redis中所有的键的类型都是字符串类型,⽽且其他⼏种数据结构也都是在字符串类似基础上构建的
-
⼀个字符串的最⼤值不能超过512MB
-
Redis内部存储字符串完全是按照⼆进制流的形式保存的
- Redis是不处理字符集编码问题的,客⼾端传⼊的命令中使⽤的是什么字符集编码,就存储什么字符集编码
1.常见命令
1.SET
- 功能:将
string
类型的value
设置到key
中- 如果
key
不存在,则创建新的键值对 - 如果
key
之前存在,则覆盖,⽆论原来的数据类型是什么(可能会改变原来的数据类型),之前关于此key
的TTL
也全部失效
- 如果
- 语法:
SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
- 选项:
EX seconds
:使⽤秒作为单位设置key
的过期时间PX milliseconds
:使⽤毫秒作为单位设置key
的过期时间NX
:只在key
不存在时才进⾏设置,即如果key
之前已经存在,设置不执⾏XX
:只在key
存在时才进⾏设置,即如果key
之前不存在,设置不执⾏- 相当于更新
key
的value
- 相当于更新
- 注意:由于带选项的SET命令可以被
SETNX, SETEX, PSETEX
等命令代替,所以之后的版本中,Redis可能进行合并
- 返回值:
- 如果设置成功,返回OK
- 如果由于
SET
指定了NX
或者XX
但条件不满⾜,SET
不会执⾏,并返回(nil)
- 时间复杂度: O ( 1 ) O(1) O(1)
2.GET
- 功能:获取
key
对应的value
- 如果
key
不存在,返回nil
- 如果
value
的数据类型不是string
,会报错
- 如果
- 语法:
GET key
- 返回值:
key
对应的value
,或者当key
不存在时返回nil
- 时间复杂度: O ( 1 ) O(1) O(1)
3.MSET && MGET
-
MSET:
- 功能:一次性设置多个
key
的值 - 语法:
MSET key value [key value ...]
- 返回值:永远是OK
- 时间复杂度: O ( 1 ) O(1) O(1)
- 功能:一次性设置多个
-
MGET:
- 功能:⼀次性获取多个key的值
- 如果对应的
key
不存在或者对应的数据类型不是string
,返回nil
- 如果对应的
- 语法:`MGET key [key …]
- 返回值:对应
value
的列表 - 时间复杂度: O ( 1 ) O(1) O(1)
- 功能:⼀次性获取多个key的值
-
多次
GET
和单词MGET
比较:使用MGET/MSET
可有效减少网络时间,性能较高
-
综上:学会使⽤批量操作,可以有效提⾼业务处理效率
- 注意:每次批量操作所发送的键的数量也不是⽆节制的,否则可能造成单⼀命令执⾏时间过⻓,导致Redis阻塞
4.SETNX && SETXX
- SETNX:
- 功能:设置
key-value
,但只允许在key
之前不存在的情况下 - 语法:
SETNX key value
- 时间复杂度: O ( 1 ) O(1) O(1)
- 返回值:1表⽰设置成功,0表⽰没有设置
- 功能:设置
- SETXX:
- 功能:设置
key-value
,但只允许在key
之前存在的情况下 - 语法:
SETXX key value
- 时间复杂度: O ( 1 ) O(1) O(1)
- 返回值:1表⽰设置成功,0表⽰没有设置
- 功能:设置
- SET、SETNX、SETXX执⾏流程
2.计数命令
1.INCR
- 功能:将
key
对应的string
表⽰的数字加⼀- 如果
key
不存在,则视为key
对应的value
是0
- 如果
key
对应的string
不是⼀个整型或者范围超过了64位有符号整型,则报错
- 如果
- 语法:
INCR key
- 返回值:
integer
类型的加完后的数值 - 时间复杂度: O ( 1 ) O(1) O(1)
2.INCRBY
- 功能:将
key
对应的string
表⽰的数字加上对应的值- 如果
key
不存在,则视为key
对应的value
是0
- 如果
key
对应的string
不是⼀个整型或者范围超过了64位有符号整型,则报错
- 如果
- 语法:
INCRBY key increment
- 返回值:
integer
类型的加完后的数值 - 时间复杂度: O ( 1 ) O(1) O(1)
3.DECR
- 功能:将
key
对应的string
表⽰的数字减⼀。- 如果
key
不存在,则视为key
对应的value
是0
- 如果
key
对应的string
不是⼀个整型或者范围超过了64位有符号整型,则报错
- 如果
- 语法:
DECR key
- 时间复杂度: O ( 1 ) O(1) O(1)
- 返回值:
integer
类型的减完后的数值
4.DECYBY
- 功能:将
key
对应的string
表⽰的数字减去对应的值- 如果
key
不存在,则视为key
对应的value
是0
- 如果
key
对应的string
不是⼀个整型或者范围超过了64位有符号整型,则报错
- 如果
- 语法:
DECRBY key decrement
- 时间复杂度: O ( 1 ) O(1) O(1)
- 返回值:
integer
类型的减完后的数值
5.INCRBYFLOAT
- 功能:将
key
对应的string
表⽰的浮点数加上对应的值,允许采⽤科学计数法表⽰浮点数- 如果对应的值是负数,则视为减去对应的值
- 如果
key
不存在,则视为key
对应的value
是0
- 如果
key
对应的不是string
,或者不是⼀个浮点数,则报错
- 语法:
INCRBYFLOAT key increment
- 时间复杂度: O ( 1 ) O(1) O(1)
- 返回值:加/减完后的数值
6.注意
- Redis存储整数,是直接使用
int
类型存的,而存储小数,本质上是当作字符串来存储- Redis的
int
比较方便算术运算 - 小数意味着每次进行算术运算,都需要把字符串转成小数,进行运算,再把结果转回字符串保存
- Redis的
- 很多存储系统和编程语⾔内部使⽤CAS机制实现计数功能,会有⼀定的CPU开销
- 但在Redis中完全不存在这个问题,因为Redis是单线程架构,任何命令到了Redis服务端都要顺序执⾏
- 由于Redis处理命令的时候,是单线程模型,多个客户端同时针对同一个
key
进行INCR
等操作,不会引起"线程安全"问题