目录
[SET 存入键值对](#SET 存入键值对)
[MSET 批量存入键值对](#MSET 批量存入键值对)
[BITCOUNT 计算值中1的数量](#BITCOUNT 计算值中1的数量)
[BITOP 与或非异或操作](#BITOP 与或非异或操作)
[DECR 减1](#DECR 减1)
[APPEND 追加](#APPEND 追加)
[INCR 自增](#INCR 自增)
[GET 取值](#GET 取值)
[GETSET 取旧值赋新值](#GETSET 取旧值赋新值)
[MGET 批量取值](#MGET 批量取值)
[STRLEN 计算值的长度](#STRLEN 计算值的长度)
SET 存入键值对
SET key value [EX seconds | PX milliseconds | EXAT timestamp | PXAT milliseconds-timestamp | KEEPTTL ] [NX|XX]
- EX seconds: 设置键的过期时间为 second 秒。 SET key value EX second 效果等同于 SETEX key second value
- PX milliseconds : 设置键的过期时间为 millisecond 毫秒。 SET key value PX millisecond 效果等同于 PSETEXkey millisecond value
- EXAT timestamp:指定过期时间为Unix时间,单位是秒
- PXAT milliseconds-timestamp:指定过期时间为Unix时间,单位是毫秒
- KEETTTL:保存ttl时间
- NX : 只在键不存在时,才对键进行设置操作,常用于添加。 SET key value NX 效果等同于 SETNX key value
- XX: 只在键已经存在时,才对键进行设置操作,常用于更新
存入字符串键值对
如果 key 已经持有其他值, set 就覆写旧值,无视类型。
对于某个原本带有生存时间(TTL)的键来说, 当 set 命令成功在这个键上执行时, 这个键原有的 TTL 将被清除。
127.0.0.1:6379> set time '2023-09-14'
OK
127.0.0.1:6379> get time
"2023-09-14"
# 设置过期时间EX 5 单位是秒
127.0.0.1:6379> set time '2023-09-14' EX 5
OK
127.0.0.1:6379> get time
"2023-09-14"
# 过5秒之后time已过期,获取不到
127.0.0.1:6379> get time
(nil)
# 设置过期时间PX 5000 单位是毫秒
127.0.0.1:6379> set time '2023-09-14' PX 5000
OK
127.0.0.1:6379> get time
"2023-09-14"
# 过5000毫秒之后time已过期,获取不到
127.0.0.1:6379> get time
(nil)
127.0.0.1:6379> set time '2023-09-14' NX
OK
# NX:key为time已存在,设置失败
127.0.0.1:6379> set time '2023-09-14' NX
(nil)
# XX:key为time已存在,设置成功
127.0.0.1:6379> set time '2023-09-14' XX
OK
# XX:key为time1不存在,设置失败
127.0.0.1:6379> set time1 '2023-09-14' XX
(nil)
时间复杂度为O(1)。
SET 成功时才返回OK。
SETNX
SETNX key value(set if not exists的简写):将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> setnx name zhangsan
(integer) 0
127.0.0.1:6379> set name zhangxan nx
(nil)
127.0.0.1:6379> get name
"lisi"
时间复杂度为O(1)。成功返回OK,否则返回0。
SETEX
SETEX key seconds value:将值 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位)。如果 key 已经存在, SETEX 命令将覆写旧值。
该命令相当于以下两条命令 set key value; expire key seconds; 两条命令。
SET key value
EXPIRE key seconds # 设置生存时间
不同的是,SETEX是一个原子操作。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> setex name 10 xxian
OK
127.0.0.1:6379> get name
"xxian"
127.0.0.1:6379> get name
(nil)
时间复杂度为O(1)。
成功返回OK,seconds不合法时,报错ERR value is not an integer or out of range。
SETBIT
SETBIT key offset value:对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
位的设置或清除取决于 value 参数,可以是 0 也可以是 1 。key不存在时生一个新的字符串值。
字符串会进行伸展(grown)以确保它可以将 value 保存在指定的偏移量上。当字符串值进行伸展时,空白位置以 0 填充。
offset 参数必须大于或等于 0 ,小于 2^32 (bit 映射被限制在 512 MB 之内)。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> setbit bit 1 1
(integer) 0
127.0.0.1:6379> setbit bit 3 1
(integer) 0
127.0.0.1:6379> setbit bit 5 1
(integer) 0
127.0.0.1:6379> setbit bit 7 0
(integer) 0
127.0.0.1:6379> setbit bit 9 0
(integer) 0
127.0.0.1:6379> getbit bit 1
(integer) 1
127.0.0.1:6379> getbit bit 7
(integer) 0
127.0.0.1:6379> getbit bit 2
(integer) 0
时间复杂度为O(1)。
成功返回0,offset有错或value有错时报错。
SETRANGE
SETRANGE key offset value:用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始。不存在的 key 当作空白字符串处理。
MSET 批量存入键值对
MSET key value [key value ...]:批量存储字符串键值对(同时设置一个或多个 key-value 对),如果某个给定 key 已经存在,那么mset会用新值覆盖原来的旧值。
127.0.0.1:6379> mset name 'xxjava' age 25 address '贵州'
OK
127.0.0.1:6379> mget name age address
1) "xxjava"
2) "25"
3) "\xe8\xb4\xb5\xe5\xb7\x9e"
注:mset 是一个原子性(atomic)操作,所有给定 key 都会在同一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况,不可能发生。
时间复杂度为O(N), N 为要设置的 key 数量。
MSET 不可能失败,所以总是返回OK。
MSETNX
MSETNX key value [key value ...]:同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
即使只有一个给定 key 已存在, MSETNX 也会拒绝执行所有给定 key 的设置操作。(MSETNX是原子性)
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> msetnx a 1 b 2 c 3 d 4
(integer) 1
127.0.0.1:6379> mget a b c d
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> msetnx a 1 e 5 f 6 g 7
(integer) 0
# 不成功是因为key为a 的已经厦
时间复杂度O(N),N为KEY的数量。
成功返回1,否则返回0(至少有一个key已经存在)。
PSETEX
PSETEX key milliseconds value:与 SETEX 命令相似。
不同之处
- SETEX是以秒为单位设置 key 的生存时间
- PSETEX是以毫秒为单位设置 key 的生存时间
BITCOUNT 计算值中1的数量
BITCOUNT key [start] [end]:计算给定字符串中,被设置为 1 的比特位的数量。
一般情况下,给定的整个字符串都会被进行计数,通过指定额外的 start 或 end 参数,可以让计数只在特定的位上进行。
start 和 end 可以是负数::比如 -1 表示最后一个位,而 -2 表示倒数第二个位,以此类推。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> setbit bit 1 1
(integer) 0
127.0.0.1:6379> setbit bit 3 1
(integer) 0
127.0.0.1:6379> setbit bit 5 1
(integer) 0
127.0.0.1:6379> setbit bit 7 0
(integer) 0
127.0.0.1:6379> setbit bit 9 0
(integer) 0
127.0.0.1:6379> getbit bit 1
(integer) 1
127.0.0.1:6379> getbit bit 7
(integer) 0
127.0.0.1:6379> getbit bit 2
(integer) 0
127.0.0.1:6379> bitcount bit
(integer) 3
时间复杂度为O(N)。
返回被设置为1的数量。
BITOP 与或非异或操作
BITOP operation destkey key [key ...]:对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。
有四种操作:
- AND: BITOP AND destkey key [key ...] ,对一个或多个 key 求逻辑并,并将结果保存到 destkey 。
- OR:BITOP OR destkey key [key ...] ,对一个或多个 key 求逻辑或,并将结果保存到 destkey。
- XOR:BITOP XOR destkey key [key ...] ,对一个或多个 key 求逻辑异或,并将结果保存到 destkey 。
- NOT:BITOP NOT destkey key ,对给定 key 求逻辑非,并将结果保存到 destkey。
注:多key的情况,短的key补0,空key全补0。
求逻辑并 AND操作 和 求逻辑或 OR 操作:
127.0.0.1:6379> flushdb
OK
# 设置xx1为1100
127.0.0.1:6379> setbit xx1 0 1
(integer) 0
127.0.0.1:6379> setbit xx1 1 1
(integer) 0
# 设置xx2为0011
127.0.0.1:6379> setbit xx2 2 1
(integer) 0
127.0.0.1:6379> setbit xx2 3 1
(integer) 0
# and 求逻辑并 xx1 and xx2 = 1100 and 0011 = 0000
127.0.0.1:6379> bitop and destkey xx1 xx2
(integer) 1
127.0.0.1:6379> getbit destkey 0
(integer) 0
127.0.0.1:6379> getbit destkey 1
(integer) 0
127.0.0.1:6379> getbit destkey 2
(integer) 0
127.0.0.1:6379>
127.0.0.1:6379> getbit destkey 3
(integer) 0
# or 求逻辑或 xx1 or xx2 = 1100 or 0011 = 1111
127.0.0.1:6379> bitop or destkey xx1 xx2
(integer) 1
127.0.0.1:6379> getbit destkey 0
(integer) 1
127.0.0.1:6379> getbit destkey 1
(integer) 1
127.0.0.1:6379> getbit destkey 2
(integer) 1
127.0.0.1:6379> getbit destkey 3
(integer) 1
求逻辑异或 XOR操作 和 求逻辑非 NOT 操作
127.0.0.1:6379> flushdb
OK
# 设置k1 为1001
127.0.0.1:6379> setbit k1 0 1
(integer) 0
127.0.0.1:6379> setbit k1 1 0
(integer) 0
127.0.0.1:6379> setbit k1 2 0
(integer) 0
127.0.0.1:6379> setbit k1 3 1
(integer) 0
# 设置k2 为0011
127.0.0.1:6379> setbit k2 0 0
(integer) 0
127.0.0.1:6379> setbit k2 1 0
(integer) 0
127.0.0.1:6379> setbit k2 2 1
(integer) 0
127.0.0.1:6379> setbit k2 3 1
(integer) 0
# XOR 求逻辑异或 k1 xor k2 = 1001 xor 0011 = 1010
127.0.0.1:6379> bitop xor destkey k1 k2
(integer) 1
127.0.0.1:6379> getbit destkey 0
(integer) 1
127.0.0.1:6379> getbit destkey 1
(integer) 0
127.0.0.1:6379> getbit destkey 2
(integer) 1
127.0.0.1:6379> getbit destkey 3
(integer) 0
# 对 k1 求逻辑非 not 1001 = 0110
127.0.0.1:6379> bitop not destkey k1
(integer) 1
127.0.0.1:6379> getbit destkey 0
(integer) 0
127.0.0.1:6379> getbit destkey 1
(integer) 1
127.0.0.1:6379> getbit destkey 2
(integer) 1
127.0.0.1:6379> getbit destkey 3
(integer) 0
时间复杂度为O(N),N为max(len(k1), len(k2))的值。
返回到destkey中。
DECR 减1
DECR key:将 key 中储存的数字值减一。
-
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。
-
若值不为数字类型,则返回错误。
-
本操作的值限制在 64 位(bit)有符号数字表示之内。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set age 100
OK
127.0.0.1:6379> decr age
(integer) 99
127.0.0.1:6379> get age
"99"key不存在
127.0.0.1:6379> decr name
(integer) -1key不为数字
127.0.0.1:6379> set name 'cxian'
OK
127.0.0.1:6379> decr name
(error) ERR value is not an integer or out of range
时间复杂度为O(1)。
返回执行命令DECR后的值。
当值不为数字则报错。
DECRBY
DECRBY key decrement:将 key 所储存的值减去减量 decrement 。
-
若key不存在,则新给key赋值为0,然后再执行DECRBY操作
-
若key的值不为数字,则返回错误;
-
本操作的值限制在 64 位(bit)有符号数字表示之内。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set age 100
OK
127.0.0.1:6379> DECRBY age 30
(integer) 70key不存在
127.0.0.1:6379> DECRBY name 30
(integer) -30
127.0.0.1:6379> set name 'cxian'
OKkey不为数字
127.0.0.1:6379> DECRBY name 30
(error) ERR value is not an integer or out of range
127.0.0.1:6379>
时间复杂度为O(1)。返回执行命令DECRBY后的值。当值不为数字则报错。
APPEND 追加
APPEND key value:如果 key 已经存在并且是一个字符串,APPEND 命令将 value 追加到 key 原来的值的末尾;如果 key 不存在,APPEND就简单地将给定 key 设为 value ,就像执行 SET key value 一样。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set name 'xiao'
OK
127.0.0.1:6379> APPEND name ' xian'
(integer) 9
127.0.0.1:6379> get name
"xiao xian"
时间复杂度为O(1)。
返回追加后字符串的长度。
相关命令:
- STRLEN key: 输出key的值的长度
- GETRANGE key start end:返回 key 中字符串值的子字符串,字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)。
- SETRANGE key offset value: 用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始
INCR 自增
INCR key:将 key 中储存的数字值增一。
-
若key不存在,则新给key赋值为0,然后再执行 INCR 操作
-
若key的值不为数字,则返回错误
-
本操作的值限制在 64 位(bit)有符号数字表示之内。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)key不存在
127.0.0.1:6379> incr age
(integer) 1key存在
127.0.0.1:6379> set age 100
OK
127.0.0.1:6379> incr age
(integer) 101
时间复杂度为O(1)。
返回INCR命令后key的值。
INCRBY
INCRBY key increment:所DECR相似,不同在于DECRBY是减,而INCRBY是相加。
INCRBYFLOAT
INCRBYFLOAT key increment:对key 对应的值转为浮点数加上浮点数增量 increment。
-
如果 key 不存在,那么 INCRBYFLOAT 会先给 key 赋值为0 ,再执行加法操作。
-
如果命令执行成功,那么 key 的值会被更新为(执行加法之后的)新值,并且新值会以字符串的形式返回给调用者。
-
key的值和increment都可以用指数符号形式表示(如2.0e7 、 3e5 、 90e-2等)
127.0.0.1:6379> flushdb
OKkey不存在
127.0.0.1:6379> incrbyfloat age 2.55
"2.55"key存在
127.0.0.1:6379> set age 100
OK
127.0.0.1:6379> incrbyfloat age 2.55
"102.55"key的值不为数字类型
127.0.0.1:6379> set name 'cxian'
OK
127.0.0.1:6379> incrbyfloat name 2.55
(error) ERR value is not a valid float
时间复试度O(1)。
返回执行INCRBYFLOAT命令后的值。
GET 取值
GET key:返回 key 所关联的字符串值。
-
key 不存在,返回nil
-
key 的值不为字符串,返回一个错误(GET只处理字符串)
127.0.0.1:6379> flushdb
OKkey不存在
127.0.0.1:6379> get age
(nil)
127.0.0.1:6379> set age '100'
OK
127.0.0.1:6379> get age
"100"key对应的值不为字符串get报错
127.0.0.1:6379> lpush fruits apple banana orange
(integer) 3
127.0.0.1:6379> get fruits
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度O(1)。
返回key对应的值。
GETBIT
GETBIT key offset:对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
-
当 offset 比字符串值的长度大,或者 key 不存在时,返回 0
127.0.0.1:6379> flushdb
OK设code的值为1001
127.0.0.1:6379> setbit code 0 1
(integer) 0
127.0.0.1:6379> setbit code 1 0
(integer) 0
127.0.0.1:6379> setbit code 2 0
(integer) 0
127.0.0.1:6379> setbit code 3 1
(integer) 0取位置3的值
127.0.0.1:6379> getbit code 3
(integer) 1取位置2的值
127.0.0.1:6379> getbit code 2
(integer) 0取位置1的值
127.0.0.1:6379> getbit code 1
(integer) 0取位置0的值
127.0.0.1:6379> getbit code 0
(integer) 1取offset比key的值长度大
127.0.0.1:6379> getbit code 64
(integer) 0取不存在的
key127.0.0.1:6379> get id
(nil)
127.0.0.1:6379> getbit id 0
(integer) 0
时间复杂度O(1)。
返回字符串值指定偏移量上的位(bit)
GETRANGE
GETRANGE key start end:返回 key 中字符串值的子字符串,字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)。
-
负数偏移量表示从字符串最后开始计数, -1 表示最后一个字符, -2 表示倒数第二个,以此类推
-
通过保证子字符串的值域(range)不超过实际字符串的值域来处理超出范围的值域请求。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> SET address "shuangshuangguiyang"返回过引0-3的字符串,包括3
127.0.0.1:6379> getrange address 0 3
"shua"返回-3~-1 即 倒数第三个~最后一个(属从左往右,正常返回)
127.0.0.1:6379> getrange address -3 -1
"ang"返回-1~-3 即 最后一个~倒数第三个(属从右往左,返回空串)
127.0.0.1:6379> getrange address -1 -3
""返回3~0 即 第四个~第一个(属从右往在,返回空串)
127.0.0.1:6379> getrange address 3 0
""不在key的值的长度范围之外的部分返回空串
127.0.0.1:6379> getrange address 10 100
"ngguiyang"
时间复杂度为O(N)(N为返回字符串的长度)。
返回截取得同的子字符串。
GETSET 取旧值赋新值
GETSET key value:将给定 key 的值设为 value ,并返回 key 的旧值。
-
若key不存在,则设置key的值为value,返回nil
-
若key存在且不为字符串,返回错误
127.0.0.1:6379> flushdb
OKkey不存在
127.0.0.1:6379> getset name 'cxian'
(nil)
127.0.0.1:6379> get name
"cxian"key存在且为字符串
127.0.0.1:6379> getset name lisi
"cxian"key存在且不为字符串
127.0.0.1:6379> lpush fruits apple banana orange
(integer) 3
127.0.0.1:6379> getset fruits 123
(error) WRONGTYPE Operation against a key holding the wrong kind of value
时间复杂度为O(1)。
返回给定key的旧值。
- 当key不存在返回nil
- 当key旧值不为字符串报错
MGET 批量取值
MGET key [key ...]:依次返回所有(一个或多个)给定 key 的值。
-
当key不存在 或key的值不为字符串,返回nil
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set age 88
OK
127.0.0.1:6379> lpush fruits apple banana orange pear
(integer) 4fruits为集合和name不存在,返回nil
127.0.0.1:6379> mget age fruits name
- "88"
- (nil)
- (nil)
时间复杂度O(N),N为key的数量。
返回一个包含所有给定 key 的值的列表。
STRLEN 计算值的长度
STRLEN key:返回 key 所储存的字符串值的长度。
-
当key不存在是,返回0
-
当key的值不为字符时报错
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set age 100
OK
127.0.0.1:6379> lpush fruits apple banana orange pear
(integer) 4key存在返回对应值的长度
127.0.0.1:6379> strlen age
(integer) 3key不存在返回0
127.0.0.1:6379> strlen name
(integer) 0key存在但不为字符串,报错
127.0.0.1:6379> strlen fruits
(error) WRONGTYPE Operation against a key holding the wrong kind of value