介绍
string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M.
| key | value |
|---|---|
| username | 张三 |
一.设置和获取
1. set
可用版本:>=1.0.0
时间复杂度:O(1)
语法
set key value [NX | XX] [GET] [EX seconds |PX milliseconds |EXAT unix-time-seconds |PXAT unix-time-milliseconds |KEEPTTL]
介绍
-
添加一个key,并给该key的值设为value,key存在则覆盖。
-
当值被覆盖时,如果没有给过期时间的参数,则会清空过期时间
-
可选参数:
-
NX:当key不存在时才设置(类似于setnx)
-
XX:当key存在时才设置
-
GET:获取key原来的值(类似于getset)
-
EX:设置key的过期时间,以秒为单位(类似于setex)
-
PX:设置key的过期时间,以毫秒为单位(类似于psetex)
-
EXAT:设置key在什么时间过期,以秒级时间戳为单位
-
PXAT:设置key在什么时间过期,以毫秒级时间戳为单位
-
KEEPTTL:在覆盖值时保留key的失效时间
NX和XX只能选一个
EXAT、PXAT、EX、PX和KEEPTTL只能选一个
历史
- 从 Redis 版本 2.6.12 开始:添加了EX、PX、NX和XX选项。
- 从 Redis 版本 6.0.0 开始:添加了KEEPTTL选项。
- 从 Redis 版本 6.2.0 开始:添加了GET、EXAT和PXAT选项。
- 从 Redis 版本 7.0.0 开始:允许NX和GET选项一起使用。
返回值
- 设值成功返回OK
- 使用NX或XX选项之后不满足条件而未执行成功返回nil
- 使用了get选项就一定返回之前的值
示例
#不带任何参数
127.0.0.1:6379> set key value
OK
#带get
127.0.0.1:6379> set key value2 get
"value"
#带NX
127.0.0.1:6379> set key value NX
(nil)
#带XX
127.0.0.1:6379> set key value XX
OK
#带EX
127.0.0.1:6379> set key value ex 10
OK
#带PX
127.0.0.1:6379> set key value px 10000
OK
#带EXAT
127.0.0.1:6379> set key value EXAT 8888888888
OK
#带PXAT
127.0.0.1:6379> set key value EXAT 8888888888000
OK
#带KEEPTTL
127.0.0.1:6379> set key value keepttl
OK
2.get
可用版本:>=1.0.0
时间复杂度:O(1)
语法
get key
介绍
- 获取key的值
返回值
- key的值
- key不存在返回nil
示例
#key不存在
127.0.0.1:6379> get key
(nil)
#key存在
127.0.0.1:6379> set key value
OK
127.0.0.1:6379> get key
"value"
3.mset
可用版本:>=1.0.1
时间复杂度:O(N),N是要设置的key的数量
语法
mset key value [key value ...]
介绍
- 批量设置key
返回值
- OK
示例
127.0.0.1:6379> mset k1 v1 k2 v2
OK
4.mget
可用版本:>=1.0.1
时间复杂度:O(N),N是要获得的key的数量
语法
mget key [key ...]
介绍
- 获得所有指定key的值,不存在的key对应返回nil
返回值
- 指定键的值列表
示例
127.0.0.1:6379> mget k1 k3
1) "v1"
2) (nil)
5.getset
可用版本:>=1.0.0
时间复杂度:O(1)
语法
getset key value
介绍
- 获取key的旧值并设置新值
- 在6.2.0被弃用
返回值
- key的旧值
- key不存在返回nil
示例
#key不存在
127.0.0.1:6379> getset k1 v1
(nil)
#key存在
127.0.0.1:6379> getset k1 v3
"v1"
127.0.0.1:6379> get k1
"v3"
6.getdel
可用版本:>=6.2.0
时间复杂度:O(1)
语法
getdel key
介绍
- 获取key的值并删除
返回值
- key的值
- key不存在返回nil
示例
127.0.0.1:6379> set key value
OK
#key存在
127.0.0.1:6379> getdel key
"value"
#key不存在
127.0.0.1:6379> getdel key
(nil)
7.setnx
可用版本:>=1.0.0
时间复杂度:O(1)
语法
setnx key value
介绍
- 只有当key不存在时在给key设置值
返回值
- key存在返回0
- key不存在返回1
示例
#key不存在
127.0.0.1:6379> setnx key value
(integer) 1
#key存在
127.0.0.1:6379> setnx key value
(integer) 0
8.msetnx
可用版本:>=1.0.1
时间复杂度:O(N),其中 N 是要设置的key的数量。
介绍
msetnx key value[key value ...]
语法
- 只有当给定的key都不存在时才批量设值key的值
返回值
- key都不存在返回1
- key有一个存在返回0
示例
#key都不存在
127.0.0.1:6379> msetnx k1 v1 k2 v2
(integer) 1
#存在一个key
127.0.0.1:6379> msetnx k1 v1 k3 v3
(integer) 0
9.setex
可用版本:>=2.0.0
时间复杂度:O(1)
语法
setex key seconds value
介绍
- 设置key的值并设置过期时间(单位秒)
- 等同于先执行set key value后执行expire key seconds
返回值
- 总是OK
示例
127.0.0.1:6379> setex key 10 value
OK
10.psetex
可用版本:>=2.6.0
时间复杂度:O(1)
语法
psetex key millisecondsvalue
介绍
- 设置key的值并设置过期时间(单位毫秒)
- 等同于先执行set key value后执行pexpire key milliseconds
返回值
- 总是OK
示例
127.0.0.1:6379> psetex key 10000 value
OK
11.getex
可用版本:>=6.2.0
时间复杂度:O(1)
语法
getex key [EX seconde | PX milliseconds |EXAT unix-time-seconds | PXAT unix-time-milliseconds | PERSIST]
介绍
- 获取key的值并设置过期时间
- 可选参数:
- EX seconds:设置还有多少秒过期
- PX milliseconds:设置还有多少毫秒过期
- EXAT unix-time-seconds:设置在什么时候过期,秒级时间戳
- PXAT unix-time-milliseconds:设置在什么时候过期,毫秒级时间戳
- PERSIST:取消key的过期时间
这些参数只能同时出现一个
返回值
- key的值
- key不存在返回nil
示例
#key不存在
127.0.0.1:6379> getex key
(nil)
#key存在
127.0.0.1:6379> set key value
OK
127.0.0.1:6379> getex key
"value"
#加EX
127.0.0.1:6379> getex key EX 10
"value"
#加PX
127.0.0.1:6379> getex key PX 10000
"value"
#加EXAT
127.0.0.1:6379> getex key EXAT 333333333
"value"
#加PXAT
127.0.0.1:6379> getex key PXAT 333333333000
"value"
#加PERSIST
127.0.0.1:6379> getex key PERSIST
"value"
二.自增、自减
1.incr
可用版本:>=1.0.0
时间复杂度:O(1)
语法
incr key
介绍
- key的值自增1
- 如果key不存在则会先执行set key 0,然后再执行该命令
- 如果key的值不为整数则会报错
返回值
- 自增后的值
示例
127.0.0.1:6379> get key
(nil)
#key不存在
127.0.0.1:6379> incr key
(integer) 1
#key存在
127.0.0.1:6379> incr key
(integer) 2
2.decr
可用版本:>=1.0.0
时间复杂度:O(1)
语法
decr key
介绍
- key的值自减1
- 如果key不存在则会先执行set key 0,然后再执行该命令
- 如果key的值不为整数则会报错
返回值
- 自减后的值
示例
127.0.0.1:6379> get key
(nil)
#key不存在
127.0.0.1:6379> decr key
(integer) -1
#key存在
127.0.0.1:6379> decr key
(integer) -2
3.incrby
可用版本:>=1.0.0
时间复杂度:O(1)
语法
incrby key increment
介绍
- key的值自增increment,increment为负数则自减
- 如果key不存在则会先执行set key 0,然后再执行该命令
- 如果key的值不为整数则会报错
返回值
- 自增后的值
示例
127.0.0.1:6379> get key
(nil)
#key不存在
127.0.0.1:6379> incrby key 2
(integer) 2
#key存在
127.0.0.1:6379> incrby key 3
(integer) 5
#increment为负数
127.0.0.1:6379> incrby key -2
(integer) 3
4.decrby
可用版本:>=1.0.0
时间复杂度:O(1)
语法
decrby key increment
介绍
- key的值自减increment,increment为负数则自增
- 如果key不存在则会先执行set key 0,然后再执行该命令
- 如果key的值不为整数则会报错
返回值
- 自减后的值
示例
127.0.0.1:6379> get key
(nil)
#key不存在
127.0.0.1:6379> decrby key 2
(integer) -2
#key存在
127.0.0.1:6379> decrby key 3
(integer) -5
#increment为负数
127.0.0.1:6379> decrby key -2
(integer) -3
5.incrbyfloat
可用版本:>=2.6.0
时间复杂度:O(1)
语法
incrbyfloat key increment
介绍
- key的值自增increment,increment为负数则自减
- 如果key不存在则会先执行set key 0,然后再执行该命令
- 如果key的值不为小数则会报错
- 和incrby不同的是这个支持自增小数
返回值
- 自减后的值
示例
127.0.0.1:6379> get key
(nil)
#key不存在
127.0.0.1:6379> incrbyfloat key 1.1
(integer) 1.1
#key存在
127.0.0.1:6379> incrbyfloat key 2.2
(integer) 3.3
#increment为负数
127.0.0.1:6379> incrbyfloat key -1.1
(integer) 2.2
三.其他
1.strlen
可用版本:>=2.2.0
时间复杂度:O(1)
语法
strlen key
介绍
- key的值的长度
返回值
- key的值的长度
- key不存在返回0
示例
#key不存在
127.0.0.1:6379> strlen key
(integer) 0
#key存在
127.0.0.1:6379> set key value
OK
127.0.0.1:6379> strlen key
(integer) 5
2.setrange
可用版本:>=2.2.0 时间复杂度:O(1),不计算复制新字符串所需的时间。通常,该字符串非常小,因此摊销复杂度为 O(1)。否则,复杂度为 O(M),其中 M 是 value 参数的长度
语法
setrange key offset value
介绍
- 替换指定offset的值
- 如果索引大于字符串值的最大索引,则会在空缺的地方补\x00
- key不存在则会先创建key,再执行该操作
返回值
- 字符串的长度
示例
#offset小于等于字符串的长度-1
127.0.0.1:6379> set key 123456
OK
127.0.0.1:6379> setrange key 2 4
(integer) 6
127.0.0.1:6379> get key
"124456"
#offset大于字符串的长度
127.0.0.1:6379> setrange key 7 1
(integer) 8
127.0.0.1:6379> get key
"124456\x001"
3.getrange
可用版本:>=2.4.0 时间复杂度:O(N),N是返回字符串的长度
语法
getrange key start end
介绍
- 获取索引在start-end的字符串,索引从0开始,包含边界
- 可以使用负数来表示,-1表示最后一个字符,-2表示倒数第二个,以此类推
- 使用负数之后会自动变为对应的正数,比如字符串的长度是6,start是-4,转换为正数也就是2
- 如果start或end的值小于0,会自动变为0
- 如果end的值大于字符串的长度-1,会自动变为字符串的长度-1
- start的值一定要小于等于end的值,否则获取不到值
返回值
- 索引在start-end的字符串
示例
#start和end都为正数
127.0.0.1:6379> getrange key 1 5
"24456"
#start和end都为负数
127.0.0.1:6379> getrange key -3 -2
"6\x00"
#start>end
127.0.0.1:6379> getrange key 2 1
""
#end大于最大索引
127.0.0.1:6379> getrange key 0 10
"124456\x001"
#end小于最小索引
127.0.0.1:6379> getrange key 0 -8
"1"
#start小于最小索引
127.0.0.1:6379> getrange key -8 2
"124"
4.append
可用版本:>=2.0.0 时间复杂度:O(1)
语法
append key value
介绍
- 如果key已经存在,会将value追加到旧值后面
- 如果key不存在,则会先创建该key再执行该命令
返回值
- 字符串的长度
示例
#key不存在
127.0.0.1:6379> append key value
(integer) 5
#key存在
127.0.0.1:6379> append key 1
(integer) 6
5.substr
可用版本:>=1.0.0 时间复杂度:O(N),N是返回字符串的长度
语法
substr key value
介绍
- 在2.0.0开始被弃用
- 和getrange命令一模一样
返回值
- 字符串的长度
6.lcs
可用版本:>=7.0.0 时间复杂度:O(N*M),N和M分别是s1和s2的长度
语法
lcs key1 key2 [LEN] [IDX] [MINMATCHLEN len] [WITHMATCHLEN]
介绍
-
获取key1和key2相同字符串的内容,匹配单个字符串,而不是连续的字符串
-
可选参数:
-
LEN:匹配相同字符串的长度
-
IDX:匹配相同字符串时的匹配位置,匹配顺序从从右到左
-
MINMATCHLEN:需要和IDX一起用,用于匹配公共字符串的最小长度,如果两个字符串中相同字符串内容为12和123,将len设置为3则只会匹配123,为2就是都匹配,为4则都不会匹配。
-
WITHMATCHLEN:需要和IDX一起用,在匹配位置加上匹配的字符串长度
LEN不能和参数一起用,其他的可以组合使用
-
返回值
-
如果没有给参数,返回公共字符串
-
给了LEN则是返回公共字符串的长度
-
给了IDX
-
第一行 返回mathes
-
第二行返回:无匹配内容返回(empty array)
-
第N个公共字符串 第1个key 开始索引 结束索引 第2个key 开始索引 结束索引 -
返回len
-
公共字符串的长度
-
-
给了WITHMATCHLEN:在匹配位置后面加上公共字符串的长度
示例
#不带参数
127.0.0.1:6379> set k1 va123
OK
127.0.0.1:6379> set k2 vs123
OK
127.0.0.1:6379> lcs k1 k2
"v123"
#带LEN
127.0.0.1:6379> lcs k1 k2 LEN
(integer) 4
#带IDX
127.0.0.1:6379> lcs k1 k2 IDX
1) "matches"
2) 1) 1) 1) (integer) 2 #第一次匹配的字符串为123,k1中1的开始索引为2
2) (integer) 4 #第一次匹配的字符串为123,k1中3的结束索引为4
2) 1) (integer) 2 #第一次匹配的字符串为123,k2中1的开始索引为2
2) (integer) 4 #第一次匹配的字符串为123,k2中3的开始索引为4
2) 1) 1) (integer) 0 #第二次匹配的字符串为v,k1中v的开始索引为0
2) (integer) 0 #第二次匹配的字符串为v,k1中v的结束索引为0
2) 1) (integer) 0 #第二次匹配的字符串为v,k2中v的开始索引为0
2) (integer) 0 #第二次匹配的字符串为v,k2中v的结束索引为0
3) "len"
4) (integer) 4
#带MINMATHCHLEN
127.0.0.1:6379> lcs k1 k2 IDX MINMATHCHLEN 3
1) "matches"
2) 1) 1) 1) (integer) 2
2) (integer) 4
2) 1) (integer) 2
2) (integer) 4
3) "len"
4) (integer) 4
#带WITHMATCHLEN
127.0.0.1:6379> lcs k1 k2 IDX withmatchlen
1) "matches"
2) 1) 1) 1) (integer) 2
2) (integer) 4
2) 1) (integer) 2
2) (integer) 4
3) (integer) 3 #此次公共字符串的长度
2) 1) 1) (integer) 0
2) (integer) 0
2) 1) (integer) 0
2) (integer) 0
3) (integer) 1 #此次公共字符串的长度
3) "len"
4) (integer) 4
#带IDX无匹配内容时
127.0.0.1:6379> set k1 1
OK
127.0.0.1:6379> set k2 2
OK
127.0.0.1:6379> lcs k1 k2 IDX
1) "matches"
2) (empty array)
3) "len"
4) (integer) 0