目录
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