Redis 字符串 string
原文:https://ooyhao.github.io/categories/DB/Redis/
前面介绍了redis的五种数据类型以及一些通用的命令,从本文开始,我们分别来看一下这几种数据类型对应的命令操作。从字符串string开始。
append
使用append命令时,如果key已经存在,则会直接追加到value后面,如果key不存在,则会先创建一个value为空的key,然后再追加。
127.0.0.1:6379> append name hello
(integer) 5
127.0.0.1:6379> get name
"hello"
127.0.0.1:6379> append name redis
(integer) 10
127.0.0.1:6379> get name
"helloredis"
decr
decr命令可以实现对value的减一操作。如果key不存在,则key对应的初始值会被设置为0,如果key的value不是数字,则会报错。实验如下:
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> decr age
(integer) 19
127.0.0.1:6379> set nick tom
OK
127.0.0.1:6379> decr nick
(error) ERR value is not an integer or out of range
decrby
decrby 和 decr 类型,不同的是 decrby 可以指定步长。如下:
127.0.0.1:6379> get age
"19"
127.0.0.1:6379> decrby age 5
(integer) 14
get
get命令就是用来获取指定key的value。如果不存在则返回nil。如下:
127.0.0.1:6379> get age
"14"
127.0.0.1:6379> get newAge
(nil)
getset
getset命令可以用来获取key所对应的value,并对key进行重置。如下:
127.0.0.1:6379> set name ouYang
OK
127.0.0.1:6379> getset name ooyhao
"ouYang"
127.0.0.1:6379> get name
"ooyhao"
127.0.0.1:6379> getset newName zhangsan
(nil)
127.0.0.1:6379> get newName
"zhangsan"
由上面的执行结果可以看出,如果getset执行前,该key已经存在了,那么返回的是 oldValue, 并重置为newValue。如果该key不存在,则返回nil 并重置为newValue.
incr
incr 操作可以对指定key的value执行加1操作。如果指定的key不存在,那么在加1操作之前,会先将key对应的value设置为0,如果key的value不是数字,则会报错。如下:
127.0.0.1:6379> incr age
(integer) 1
127.0.0.1:6379> get age
"1"
127.0.0.1:6379> set newAge a
OK
127.0.0.1:6379> incr newAge
(error) ERR value is not an integer or out of range
incrby
incrby 和 incr 功能类似,不同的是可以指定增长步长。如下:
127.0.0.1:6379> get age
"1"
127.0.0.1:6379> incrby age 10
(integer) 11
127.0.0.1:6379> get age
"11"
incrbyfloat
incrbyfloat 命令可以用来增长浮点数。如下:
127.0.0.1:6379> get age
"11"
127.0.0.1:6379> incrbyfloat age 1.5
"12.5"
mget 与 mset
mget与mset分别用来批量设置值和批量获取值。如下:
127.0.0.1:6379> mset name ooyhao age 23 sex male
OK
127.0.0.1:6379> mget name age sex
1) "ooyhao"
2) "23"
3) "male"
setex
setex 用来给key设置value,同时设置过期时间,等效于先给key设置value,再给key设置过期时间。如下:
127.0.0.1:6379> setex name 30 zhangsan
OK
127.0.0.1:6379> get name
"zhangsan"
127.0.0.1:6379> ttl name
(integer) 24
psetex
psetex 的作用和setex类似,不同的是,这里设置过期时间的单位是毫秒值。如下:
127.0.0.1:6379> psetex age 30000 23
OK
127.0.0.1:6379> get age
"23"
127.0.0.1:6379> ttl age
(integer) 22
127.0.0.1:6379> pttl age
(integer) 17430
setnx
setnx 是set if not exists 的简写,set命令在执行时,如果key已经存在,则新值会覆盖掉旧值,而对于setnx来说,如果key已经存在,则不做任何操作,如果key不存在,则效果等同于set命令。如下:
127.0.0.1:6379> set name ooyhao
OK
127.0.0.1:6379> setnx name zhangsan
(integer) 0
127.0.0.1:6379> get name
"ooyhao"
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> get age
(nil)
127.0.0.1:6379> setnx age 23
(integer) 1
127.0.0.1:6379> get age
"23"
msetnx
msetnx 兼具了setnx和mset的特性,但是msetnx在执行时,如果有一个key存在,则所有的都不会执行。如下:
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set name ouYang
OK
127.0.0.1:6379> msetnx name ooyhao age 23
(integer) 0
127.0.0.1:6379> get name
"ouYang"
127.0.0.1:6379> get age
(nil)
由上面的例子可以看出,由于name之前已经存在了,所以在执行msetnx的时候。age没有设置成功。
setrange
setrange 用来覆盖一个已经存在的key的value。如下:
127.0.0.1:6379> set str helloworld
OK
127.0.0.1:6379> get str
"helloworld"
127.0.0.1:6379> setrange str 5 redis
(integer) 10
127.0.0.1:6379> get str
"helloredis"
但是如果已经存在的key所对应的value的长度小于offset。则不足的地方用0来补齐。如下:
127.0.0.1:6379> set newStr helloredis
OK
127.0.0.1:6379> setrange newStr 20 --java
(integer) 26
127.0.0.1:6379> get newStr
"helloredis\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00--java"
strlen
strlen 命令用来计算key的value的长度。如下:
127.0.0.1:6379> set name ouYangHao
OK
127.0.0.1:6379> strlen name
(integer) 9
关于redis的字符串类型就先介绍到这里,如果需要更加详细的文档,可以移步官方文档:
http://www.redis.cn/commands.html#generic
本文部分参考自:http://www.javaboy.org/2019/0615/redis-string.html