目录
1、set命令
SET key value [NX | XX] [GET] [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | KEEPTTL]
set命令有8个可选参数:ex、px、nx、xx、keepttl、exat、pxat,中括号包裹在一起的可选参数不能同时出现,下面单独提出每一个可选参数的作用并举例说明:
(1)ex seconds:以秒为单位设置过期时间
127.0.0.1:6379> set k1 v1 ex 10
OK
127.0.0.1:6379> ttl k1
(integer) 7
在插入k1键值对时,设置其过期时间为10秒。
(2)px milliseconds:以毫秒为单位设置过期时间
127.0.0.1:6379> set k1 v1 px 10000
OK
127.0.0.1:6379> ttl k1
(integer) 2
在插入k1键值对时,设置其过期时间为10000毫秒,即10秒。
(3)exat timestamp:设置以秒为单位的UNIX时间戳所对应的时间为过期时间
UNIX时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。UNIX时间戳可用java代码获取,这里在获取当前的时间戳基础上增加15秒,用于测试。
//获取当前UNIX时间戳(秒)
System.out.println(System.currentTimeMillis()/1000L + 15L);
127.0.0.1:6379> set k1 v1 exat 1680833700
OK
127.0.0.1:6379> ttl k1
(integer) 4
127.0.0.1:6379> ttl k1
(integer) -2
(4)pxat milliseconds-timestamp:设置毫秒为单位的UNIX时间戳所对应的时间为过期时间
在获取当前毫秒值时添加15000毫秒,用于测试。
//获取UNIX时间戳(毫秒)
System.out.println(System.currentTimeMillis() + 15000L);
127.0.0.1:6379> set k1 v1 pxat 1680834152064
OK
127.0.0.1:6379> ttl k1
(integer) 4
(5)nx:键不存在的时候设置键值
127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> set k1 v1 nx
(nil)
127.0.0.1:6379> set k2 v2 nx
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
数据库中存在k1时,使用set命令带上nx参数,再次创建k1失败,创建k2时成功。
(6)xx:键存在的时候设置键值(覆盖)
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> set k1 vv1 xx
OK
127.0.0.1:6379> get k1
"vv1"
127.0.0.1:6379> set k3 vv1 xx
(nil)
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
获取数据库k1键对应的值,使用带xx参数的set命令修改键为k1对应的值v1为vv1,发现修改成功。插入数据库没有的键k3时失败。
(7)keepttl:保留设置前已指定的键的生存时间
127.0.0.1:6379> set k1 v1 ex 20
OK
127.0.0.1:6379> ttl k1
(integer) 18
127.0.0.1:6379> set k1 vv1 keepttl
OK
127.0.0.1:6379> ttl k1
(integer) 12
127.0.0.1:6379> get k1
"vv1"
设置键值对 k1 v1 的过期时间为20s,之后带上 keepttl 参数再次设置 k1 修改值 v1 为vv1,发现过期倒计时仍在继续,值已经修改为vv1。
(8)get:返回指定键原本的值,若键不存在则返回nil
127.0.0.1:6379> keys *
1) "k2"
127.0.0.1:6379> get k2
"v2"
127.0.0.1:6379> set k2 vv2 get
"v2"
127.0.0.1:6379> get k2
"vv2"
127.0.0.1:6379> set k1 v1 get
(nil)
127.0.0.1:6379> get k1
"v1"
查看数据库存在的键,使用 set 命令带上 get 参数修改 k2 的值 v2 为 vv2,返回原来的值 v2,再次查询 k2 发现修改成功。使用同样的方法,设置不存在的 k1 键值对,值为 v1,返回 nil,查询 k1 发现设置成功。
2、批量添加/查询命令
(1)mset:批量添加,可覆盖
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> get k2
"vv2"
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> mset k1 vv1 k2 vvvv2 k3 v3 k4 v4
OK
127.0.0.1:6379> keys *
1) "k4"
2) "k2"
3) "k3"
4) "k1"
127.0.0.1:6379> get k1
"vv1"
127.0.0.1:6379> get k2
"vvvv2"
127.0.0.1:6379> get k3
"v3"
查看数据库存在的键和值,使用 mset 指令批量添加,之后再次查询键,发现添加成功,查询原来存在的键 k1 和 k2 的值,发现原来的值被覆盖。
(2)msetnx:批量添加不存在的值,不可覆盖(如果添加键存在,则全部添加失败)
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> get k1
"vv1"
127.0.0.1:6379> msetnx k1 v1 k2 v2 k3 v3 k4 v4
(integer) 0
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> get k1
"vv1"
127.0.0.1:6379> msetnx k3 v3 k4 v4
(integer) 1
127.0.0.1:6379> keys *
1) "k4"
2) "k2"
3) "k3"
4) "k1"
127.0.0.1:6379> get k3
"v3"
先查询数据库已存在的数据,使用 msetnx 添加数据,里面包含已存在的数据,发现添加失败,添加不存在的数据,添加成功。
(3)mget:批量查询,不存在的键返回nil
127.0.0.1:6379> keys *
1) "k4"
2) "k2"
3) "k3"
4) "k1"
127.0.0.1:6379> mget k1 k2 k3 k5
1) "vv1"
2) "vvvv2"
3) "v3"
4) (nil)
3、获取/修改指定范围内的值
(1)getrange key start end:从指定的key中截取 start 到 end 的值,可以使用负偏移量,-1表示最后一个字符,-2表示倒数第二个字符,依此类推。
127.0.0.1:6379> set num 0123456789
OK
127.0.0.1:6379> get num
"0123456789"
127.0.0.1:6379> getrange num 2 4
"234"
127.0.0.1:6379> getrange num 2 -3
"234567"
设置键 num,值为 0123456789,可以跟方便理解,截取下标2到4,结果为 234。负数情况,截取下标2到-3时,从右往左数第三个值为 7,所以结果为 234567。
(2)setrange key offset value:将key的值从指定下标开始,替换为value的值,offset不能为负数
127.0.0.1:6379> get k1
"0123456789"
127.0.0.1:6379> setrange k1 2 aaaa
(integer) 10
127.0.0.1:6379> get k1
"01aaaa6789"
127.0.0.1:6379> setrange k1 8 aaaa
(integer) 12
127.0.0.1:6379> get k1
"01aaaa67aaaa"
将k1值从第二位开始替换为 aaaa,若替换长度超过数据长度,多出的部分会补在后面。
127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> setrange k3 0 aaaa
(integer) 4
127.0.0.1:6379> get k3
"aaaa"
127.0.0.1:6379> setrange k2 2 aaaa
(integer) 6
127.0.0.1:6379> get k2
"\x00\x00aaaa"
127.0.0.1:6379> getrange k2 0 2
"\x00\x00a"
若替换一个不存在的键,偏移量为0,则相当于执行set key value,若偏移量不为0,则缺少的位置使用 \x00 十六进制数代替,一个数占一个位置。
4、数值增减(一定要数字才能进行加减)
(1)incr key:递增数值,返回增加后的值
127.0.0.1:6379> get k2
"5"
127.0.0.1:6379> incr k2
(integer) 6
127.0.0.1:6379> get k2
"6"
(2)incrby key increment:按指定的整数增加,返回增加后的值
127.0.0.1:6379> get k2
"6"
127.0.0.1:6379> incrby k2 10
(integer) 16
127.0.0.1:6379> get k2
"16"
(3)decr key:递减数值,返回减少后的值
127.0.0.1:6379> get k2
"16"
127.0.0.1:6379> decr k2
(integer) 15
127.0.0.1:6379> get k2
"15"
(4)decrby key decrement:按指定的整数减少,返回减少后的值
127.0.0.1:6379> get k2
"15"
127.0.0.1:6379> decrby k2 11
(integer) 4
127.0.0.1:6379> get k2
"4"
5、获取字符串长度和内容追加
(1)strlen key:获取字符串长度
127.0.0.1:6379> get k3
"aaaa"
127.0.0.1:6379> strlen k3
(integer) 4
(2)append key value:字符串追加
127.0.0.1:6379> keys *
1) "k2"
2) "k3"
3) "k1"
127.0.0.1:6379> get k3
"v3"
127.0.0.1:6379> append k3 vv3
(integer) 5
127.0.0.1:6379> get k3
"v3vv3"
127.0.0.1:6379> append k4 vv
(integer) 2
127.0.0.1:6379> get k4
"vv"
若追加键不存在,则命令效果相当于 set key value。
6、部分过时命令(虽过时,但也可以使用)
(1)getset key value:添加或覆盖键对应的值后返回旧值,没有旧值返回nil
于Redis version 6.2.0 过期,可替换命令:set key value get
(2)setnx key value:当key不存在时添加
于Redis version 2.6.12 过期,可替换命令:set key value nx
(3)setex key seconds value:添加key值的同时指定过期时间(秒)
于Redis version 2.6.12过期,可替换命令:set key value ex seconds
(4)psetex key milliseconds value:psetex的工作原理与setex完全相同,唯一的区别是过期时间是以毫秒而不是秒为单位指定的。
于Redis version 2.6.12过期,可替换命令:set key value px milliseconds
7、String类型使用案例
视频或文章点赞:
127.0.0.1:6379> set items:001 0
OK
127.0.0.1:6379> get items:001
"0"
127.0.0.1:6379> incr items:001
(integer) 1
127.0.0.1:6379> incr items:001
(integer) 2
说明:建立一个商品key:items:001,其中items表示为商品类型的key,001表示商品序号,初始值设置为0,当用户点击喜欢,执行 incr 指令,将喜欢人数的统计数量加一