🍃前言
字符串类型是 Redis 最基础的数据类型,下面将介绍使用该类型时常用的命令,关于字符串需要特别注意:
- ⾸先 Redis 中所有的键的类型都是字符串类型,⽽且其他⼏种数据结构也都是在字符串类似基础上构建的,例如列表和集合的元素类型是字符串类型,所以字符串类型能为其他 4 种数据结构的学习奠定基础。
- 其次,字符串类型的值实际可以是字符串,包含⼀般格式的字符串或者类似JSON、XML格式的字符串;数字,可以是整型或者浮点型;甚⾄是⼆进制流数据,例如图⽚、⾳频、视频等。不过⼀个字符串的最⼤值不能超过512MB。
🎋常见命令
🚩set
将 string 类型的 value 设置到 key 中。如果 key 之前存在,则覆盖,⽆论原来的数据类型是什么。之前关于此 key 的 TTL 也全部失效。
语法:
SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
SET命令⽀持多种选项来影响它的⾏为:
- EX seconds 使⽤秒作为单位设置 key 的过期时间。
- PX milliseconds 使⽤毫秒作为单位设置 key的过期时间。
- NX 只在 key 不存在时才进⾏设置,即如果 key 之前已经存在,设置不执⾏。
- XX 只在 key 存在时才进⾏设置,即如果 key 之前不存在,设置不执⾏。
时间复杂度:
- O(1)
返回值:
- 如果设置成功,返回 OK。
- 如果由于 SET 指定了 NX 或者 XX 但条件不满⾜,SET 不会执⾏,并返回(nil)。
🚩get
key 对应的 value。如果 key 不存在,返回 nil。如果 value 的数据类型不是string,会报错。
语法:
get key
时间复杂度:
- O(1)
返回值:
- key对应的value,或者 nil 当 key 不存在
🚩mget
⼀次性获取多个 key 的值。如果对应的 key 不存在或者对应的数据类型不是 string,返回 nil。
语法:
mget key [key ...]
时间复杂度:
- O(N) , N是key数量,数量较少时可理解为O(1)
返回值:
- 对应 value 的列表
🚩mset
次性设置多个 key 的值。
语法:
mset key value [key value ...]
时间复杂度:
- O(N) ,N是key数量,数量较少时可理解为O(1)
返回值:
- 永远是 OK
🚩setnx
设置 key-value 但只允许在 key 之前不存在的情况下。
语法:
setnx key value
时间复杂度:
- O(1)
返回值:
- 1 表⽰设置成功。0 表⽰没有设置
🌳计数命令
很多存储系统和编程语⾔内部使⽤ CAS 机制实现计数功能,会有⼀定的CPU开销,但在Redis中完全不存在这个问题,因为 Redis 是单线程架构,任何命令到了 Redis 服务端都要顺序执⾏
🚩incr
将 key 对应的 string 表⽰的数字加⼀。
- 如果 key 不存在,则视为 key 对应的 value 是 0。
- 如果 key 对应的 string 不是⼀个整型或者范围超过了 64位有符号整型,则报错。
语法:
incr key
时间复杂度:
- O(1)
返回值
- integer 类型的加完后的数值。
🚩incrby
将 key 对应的 string 表⽰的数字加上对应的值。
- 如果 key 不存在,则视为 key 对应的 value 是 0。
- 如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错
语法:
incrby key decrement
时间复杂度:
- O(1)
返回值:
- integer类型的加完后的数值
🚩decr
将 key 对应的 string 表⽰的数字减⼀。
- 如果 key 不存在,则视为 key 对应的 value 是 0。
- 如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。
语法:
decr key
时间复杂度:
- O(1)
返回值:
- integer 类型的减完后的数值
🚩decby
将 key 对应的 string 表⽰的数字减去对应的值。
- 如果 key 不存在,则视为 key 对应的 value 是 0。
- 如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错
语法:
decby key decrement
时间复杂度:
- O(1)
返回值:
- integer 类型的减完后的数值。
🚩incrbyfloat
将 key 对应的 string 表⽰的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。
- 如果key 不存在,则视为 key 对应的 value 是0。
- 如果key 对应的不是 string,或者不是⼀个浮点数,则报错。
允许采⽤科学计数法表⽰浮点数。
语法:
incrbyfloat key decrement
时间复杂度:
- O(1)
返回值:
- 加/减完后的数值
🍀其他命令
🚩append
- 如果 key 已经存在并且是⼀个 string,命令会将 value 追加到原有 string 的后边。
- 如果 key 不存在,则效果等同于 SET 命令
语法:
append key value
时间复杂度:
- O(1).追加的字符串⼀般⻓度较短,可以视为O(1).
返回值:
- 追加完成之后 string 的⻓度。
🚩getrange
返回 key 对应的 string 的⼦串,由 start 和 end 确定(左闭右闭)。
- 可以使⽤负数表⽰倒数。-1代表倒数第⼀个字符,-2代表倒数第⼆个,其他的与此类似。
- 超过范围的偏移量会根据 string 的⻓度调整成正确的值
语法:
getrange key start end
时间复杂度:
- O(N). N 为[start, end] 区间的⻓度. 由于 string 通常⽐较短, 可以视为是 O(1)
返回值:
- string 类型的⼦串
🚩setrange
覆盖字符串的⼀部分,从指定的偏移开始。
语法:
setrange key offset value
时间复杂度:
- O(N), N 为 value 的⻓度. 由于⼀般给的 value ⽐较短, 通常视为 O(1).
返回值:
- 替换后的 string 的⻓度
🚩strlen
获取 key 对应的 string 的⻓度。当 key 存放的类似不是 string 时,报错。
语法:
strlen key
时间复杂度:
- O(1)
返回值:
- string 的⻓度。或者当 key 不存在时,返回0。
🌲命令小结
命令 | 执行效果 | 时间复杂度 |
set key value [key value…] | 设置key的值是value | O(k),k是键个数 |
get key | 获取 key 的值 | O(1) |
del key [key …] | 删除指定的 key | O(k), k 是键个数 |
mset key value [key value …] | 批量设置指定的 key 和 value | O(k), k 是键个数 |
mget key [key …] | 批量获取 key 的值 | O(k), k 是键个数 |
incr key | 指定的 key 的值 +1 | O(1) |
decr key | 指定的 key 的值 -1 | O(1) |
incrby key n | 指定的 key 的值 +n | O(1) |
decrby key n | 指定的 key 的值 -n | O(1) |
incrbyfloat key n | 指定的 key 的值 +n | O(1) |
append key value | 指定的 key 的值追加 value | O(1) |
strlen key | 获取指定 key 的值的⻓度 | O(1) |
setrange key offset value | 覆盖指定 key 的从 offset 开始的部分值 | O(n),n 是字符串⻓度,通常视为O(1) |
getrange key start end | 获取指定 key 的从 start 到 end 的部分值 | O(n),n是字符串⻓度,通常视为O(1) |
⭕总结
关于《【Redis】 String 字符串类型常见命令》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下