相对来说写入键值对要比读取稍微复杂一点,因为在写入的时候,可能准备写入的那个键已经存在了,下表中安全写入就为了应对这种情况,其功能是,只有当键不存在时,才执行写入操作;另一方面,也存在希望创建临时变量的情况,这时需要在创建时就指定一个过期时间
读取 | 写入 | 安全写入 | 临时变量 | |
---|---|---|---|---|
单值 | get | set | setnx | setEx/pSetEx |
多组值 | mget | mset | msetnx |
下面对其中一些指令进行测试,首先用mset创建了三组键值对,然后用setnx创建a为"aaa",但显然失败了,说明在a已经存在的情况下,setnx无法再创建一个a;但使用set后设置成功了,说明set可以修改键对应的值。
127.0.0.1:6379> mset a "a" b "b" c "c"
OK
127.0.0.1:6379> mget a b c
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> setnx a "aaa"
(integer) 0
127.0.0.1:6379> get a
"a"
127.0.0.1:6379> set a "aaa"
OK
127.0.0.1:6379> get a
"aaa"
setEx和pSetEx的区别为,前者以秒为单位,后者以毫秒为单位,下面创建一个10秒的临时变量,10秒后再查看其剩余时间时,变量已经不在了。
127.0.0.1:6379> setex s10 10 "10s"
OK
127.0.0.1:6379> ttl s10
(integer) 5
127.0.0.1:6379> ttl s10
(integer) -2
最后,Redis还提供了一个一边更改一边返回的指令getset,其功能是一边设置新值,一边返回旧值
127.0.0.1:6379> getset a asdf
"aaa"
127.0.0.1:6379> get a
"asdf"
字符串,首先就是一个字符数组,那么一方面必有长度,另一方面也应该可以对字符进行索引,而且也应该支持字符串的拼接
127.0.0.1:6379> strlen str
(integer) 11
127.0.0.1:6379> set str test_string
OK
127.0.0.1:6379> getrange str 1 5
"est_s"
127.0.0.1:6379> append str "_tail"
(integer) 16
127.0.0.1:6379> get str
"test_string_tail"
最后,通过setRange可以指定偏移量修改key中字符串的内容
127.0.0.1:6379> setrange str 4 -
(integer) 16
127.0.0.1:6379> get str
"test-string_tail"
127.0.0.1:6379> setrange str 12 head
(integer) 16
127.0.0.1:6379> get str
"test-string_head"
Redis中并没有数值,但可以把字符串解释为数值,从而也就有了数值操作指令,如下表所示。需要注意,其中只有incrByFloat可以操作浮点数,但其参数可以为负数
变化1 | 变化给定数值 | 变化给定浮点值 | |
---|---|---|---|
加 | incr | incrBy | incrByFloat |
减 | decr | decrBy |
示例如下
127.0.0.1:6379> set num "15"
OK
127.0.0.1:6379> incr num
(integer) 16
127.0.0.1:6379> incrby num 20
(integer) 36
127.0.0.1:6379> incrbyfloat num 25.5
"61.5"
127.0.0.1:6379> decrby num "10.5"
(error) ERR value is not an integer or out of range
127.0.0.1:6379> incrbyfloat num -25.5
"36"
127.0.0.1:6379> incrbyfloat num "-25.5"
"10.5"