3.Redis数据类型之字符串String

Redis 字符串 string

​ 前面介绍了redis的五种数据类型以及一些通用的命令,从本文开始,我们分别来看一下这几种数据类型对应的命令操作。从字符串string开始。

append

使用append命令时,如果key已经存在,则会直接追加到value后面,如果key不存在,则会先创建一个value为空的key,然后再追加。

1
2
3
4
5
6
7
8
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不是数字,则会报错。实验如下:

1
2
3
4
5
6
7
8
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 可以指定步长。如下:

1
2
3
4
5

127.0.0.1:6379> get age
"19"
127.0.0.1:6379> decrby age 5
(integer) 14

get

get命令就是用来获取指定key的value。如果不存在则返回nil。如下:

1
2
3
4
127.0.0.1:6379> get age
"14"
127.0.0.1:6379> get newAge
(nil)

getset

getset命令可以用来获取key所对应的value,并对key进行重置。如下:

1
2
3
4
5
6
7
8
9
10
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不是数字,则会报错。如下:

1
2
3
4
5
6
7
8
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 功能类似,不同的是可以指定增长步长。如下:

1
2
3
4
5
6
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 命令可以用来增长浮点数。如下:

1
2
3
4
127.0.0.1:6379> get age
"11"
127.0.0.1:6379> incrbyfloat age 1.5
"12.5"

mget 与 mset

mget与mset分别用来批量设置值和批量获取值。如下:

1
2
3
4
5
6
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设置过期时间。如下:

1
2
3
4
5
6
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类似,不同的是,这里设置过期时间的单位是毫秒值。如下:

1
2
3
4
5
6
7
8
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命令。如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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存在,则所有的都不会执行。如下:

1
2
3
4
5
6
7
8
9
10
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。如下:

1
2
3
4
5
6
7
8
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来补齐。如下:

1
2
3
4
5
6
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的长度。如下:

1
2
3
4
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

#

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×