目录
SET 存入键值对
SETNX
SETEX
SETBIT
SETRANGE
MSET 批量存入键值对
MSETNX
PSETEX
BITCOUNT 计算值中1的数量
BITOP 与或非异或操作
DECR 减1
DECRBY
APPEND 追加
INCR 自增
INCRBY
INCRBYFLOAT
GET 取值
GETBIT
GETRANGE
GETSET 取旧值赋新值
MGET 批量取值
STRLEN 计算值的长度
SET key value [EX seconds | PX milliseconds | EXAT timestamp | PXAT milliseconds-timestamp | KEEPTTL ] [NX|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 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 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 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 key offset value:用 value 参数覆写(overwrite)给定 key 所储存的字符串值,从偏移量 offset 开始。不存在的 key 当作空白字符串处理。
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 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 key milliseconds value:与 SETEX 命令相似。
不同之处
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 operation destkey key [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 key:将 key 中储存的数字值减一。
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) -1
# key不为数字
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 key decrement:将 key 所储存的值减去减量 decrement 。
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) 70
# key不存在
127.0.0.1:6379> DECRBY name 30
(integer) -30
127.0.0.1:6379> set name 'cxian'
OK
# key不为数字
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 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)。
返回追加后字符串的长度。
相关命令:
INCR key:将 key 中储存的数字值增一。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> keys *
(empty array)
# key不存在
127.0.0.1:6379> incr age
(integer) 1
# key存在
127.0.0.1:6379> set age 100
OK
127.0.0.1:6379> incr age
(integer) 101
时间复杂度为O(1)。
返回INCR命令后key的值。
INCRBY key increment:所DECR相似,不同在于DECRBY是减,而INCRBY是相加。
INCRBYFLOAT key increment:对key 对应的值转为浮点数加上浮点数增量 increment。
127.0.0.1:6379> flushdb
OK
# key不存在
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 key:返回 key 所关联的字符串值。
127.0.0.1:6379> flushdb
OK
# key不存在
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 key offset:对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
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 key start end:返回 key 中字符串值的子字符串,字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)。
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 key value:将给定 key 的值设为 value ,并返回 key 的旧值。
127.0.0.1:6379> flushdb
OK
# key不存在
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的旧值。
MGET key [key ...]:依次返回所有(一个或多个)给定 key 的值。
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) 4
# fruits为集合和name不存在,返回nil
127.0.0.1:6379> mget age fruits name
1) "88"
2) (nil)
3) (nil)
时间复杂度O(N),N为key的数量。
返回一个包含所有给定 key 的值的列表。
STRLEN key:返回 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) 4
# key存在返回对应值的长度
127.0.0.1:6379> strlen age
(integer) 3
# key不存在返回0
127.0.0.1:6379> strlen name
(integer) 0
# key存在但不为字符串,报错
127.0.0.1:6379> strlen fruits
(error) WRONGTYPE Operation against a key holding the wrong kind of value