标题:【Redis01】Redis基础:String相关操作
Redis基础学习:String相关操作
在 Redis 中,最基础,最简单的当然就是这个 String 数据类型了。简单地说,你就可以把它看成是 PHP 中的变量,或者你用过 Memcached ,那就再熟悉不过了。本身这种 k/v 形式的缓存也是我们日常使用最多的一种缓存形式,所以大家对于它的操作应该还是比较熟悉的,我们就简单的根据官方文档来学习巩固一下。
SET 命令
啥玩意,这个命令还用教?你以为 set 就是写一个 key 再赋值一个 value 嘛?没看文档之前我也是这么认为,但其实它还有很参数。正式的 SET 签名是下面这个样子的。
SET key value [EX seconds|PX milliseconds|EXAT timestamp|PXAT milliseconds-timestamp|KEEPTTL] [NX|XX] [GET]
还是比较好理解的吧,EX/PX/EXAT/PXAT/KEEPTTL 都是过期时间相关的,NX/XX 是根据原来键的存在情况有不同的处理表现的,最后一个 GET 则是 Redis6 新加的,我们一个一个来看。
EX/PX/EXAT/PXAT/KEEPTTL
都是和过期时间有关的设置,EX和PX是设置时间长度,一个是秒,一个是毫秒,这几个不能一起设置哦。
127.0.0.1:6379> set a b ex 10 px 10
(error) ERR syntax error
EXAT 和 PXAT 是到某个指定的时间戳之后过期,同样也是秒和毫秒的区别。
127.0.0.1:6379> set a b exat 1650614954
OK
127.0.0.1:6379> ttl a
(integer) 91
而 KEEPTTL 指的是,如果之前有设置了过期相关的参数,那么再次设置的时候,不影响之前设置的过期时间。
通过 set 进行修改设置的时候,会覆盖之前设置的过期时间信息,比如下面这样。
127.0.0.1:6379> set a b ex 1000
OK
127.0.0.1:6379> ttl a
(integer) 997
127.0.0.1:6379> set a c
OK
127.0.0.1:6379> ttl a
(integer) -1
一开始我们设置了过期时间为 1000 秒,然后我们再次给这个 a 赋值,这个时候没有带过期时间相关的设置,它就被覆盖成了永久的。而 KEEPTTL 指的是,如果之前有设置了过期相关的参数,那么再次设置的时候,不影响之前设置的过期时间。
127.0.0.1:6379> set a 123 ex 100
OK
127.0.0.1:6379> ttl a
(integer) 97
127.0.0.1:6379> set a 234 keepttl
OK
127.0.0.1:6379> ttl a
(integer) 88
NX/XX
这两个参数的意思其实很简单,NX 表示如果这个 key 存在,就不能设置,XX 正好反过来,如果这个 key 存在,就可以设置,如果不存在,就不能设置。NX 是神器,后面的进阶学习中有它的超级应用:分布式锁。
127.0.0.1:6379> set a b nx
(nil)
127.0.0.1:6379> set a b xx
OK
127.0.0.1:6379> set b a xx
(nil)
GET
这个 GET 参数是 Redis6 新增的,其实就是设置一个 key 的值之后,再把它之前的值返回回来。
127.0.0.1:6379> set a d get
"b"
GETSET 是之前的一个专门用于实现此类操作的命令,不过已经标记为过期了,如果是新项目用得比较新的 Redis 的话,就直接用 SET 的这个参数就好了。
此外的一些设置相关的命令,比如 SETNX, SETEX, PSETEX ,都和上面的 SET 命令中的参数的作用类似,只是属于独立的命令,毕竟我们的一些其它数据类型也会使用到过期时间设置之类的功能。这一块就不详细说了,因为都比较简单,大家可以自己去看一下。
GET
最基础的 GET 命令很简单,咱们也就不多说了,主要来看看两个 GET 的衍生命令,分别是 GETDEL 和 GETEX 。这两个命令也比较好理解,GETDEL 是返回值之后再把它删了,GETEX 则是返回值并且再给它设置一个过期时间。
127.0.0.1:6379> getdel a
hello,redisredisfff
127.0.0.1:6379> get a
127.0.0.1:6379> set b bbb
OK
127.0.0.1:6379> ttl b
-1
127.0.0.1:6379> getex b ex 100
bbb
127.0.0.1:6379> ttl b
98
SETRANGE和GETRANGE
这两个是范围相关的操作,也就是可以设置或者获取指定 key 中数据的一部分内容。
127.0.0.1:6379> set a hello,world
OK
127.0.0.1:6379> setrange a 6 redis
(integer) 11
127.0.0.1:6379> get a
"hello,redis"
上面的例子中,我们设置了一个 a ,内容是 hello,world 。然后使用 SETRANGE ,从第6个字符开始,将后面的值设置成 redis ,最后输出的结果就变成了 hello,redis 。如果我们指定的位置超过了原来字符的数量怎么办呢?
127.0.0.1:6379> setrange a 16 redis
(integer) 21
127.0.0.1:6379> get a
"hello,redis\x00\x00\x00\x00\x00redis"
可以看到,超过部分的内容会被替换成零值,注意哦,这个不是0,也不是空字符或者空格,就是个占位零值,大家可以自己试试,如果用PHP获取这条数据打印出来的就是连在一起的 hello,redisredis 。
获取数据的范围内容也很简单。
127.0.0.1:6379> getrange a 6 12
"redis\x00\x00"
127.0.0.1:6379> getrange a 6 10
"redis"
127.0.0.1:6379> getrange a 22 10
""
127.0.0.1:6379> getrange a 22 30
""
127.0.0.1:6379> getrange a 5 1
""
第一个参数是开始位置,也就是从第几个开始,第二个参数是结束位置。注意,第二个参数不是 MySQL 里面那种 limit ,而是确定的结束位置的下标。就像上面最后那条测试语句一样,第5个字符肯定是有内容的,但后面的结束位置给的是1,返回的还是空。
APPEND
追加数据,针对指定的 key ,向它的 value 中追加内容。如果指定的 key 不存在,则会创建这个 key 。这个比较好理解,大家看下面的代码即可。
127.0.0.1:6379> append a fff
24
127.0.0.1:6379> get a
hello,redisredisfff
127.0.0.1:6379> append c ccc // 不存在的
3
127.0.0.1:6379> get c
ccc
增减操作
原子增减操作相信也是不少同学经常使用的功能,没什么多说的,INCR 增1,INCRBY 指定增几。同样的,减1是 DECR ,指定减几就是 DECRBY 。
127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> incr a
2
127.0.0.1:6379> incrby a 2
4
127.0.0.1:6379> decr a
3
127.0.0.1:6379> decrby a 2
1
如果我们保存的类型不是数字,那么是无法进行这两个增减操作的,会直接报错。除了标准的数字类型外,还可以操作浮点类型。
127.0.0.1:6379> incrbyfloat a 2.5
3.5
127.0.0.1:6379> decrbyfloat a 1.5
ERR unknown command `decrbyfloat`, with args beginning with: `a`, `1.5`,
127.0.0.1:6379> incrbyfloat a -1.5
2
对于浮点类型的操作,只有 INCRBYFLOAT 这一个操作命令,没有 DECRBYFLOAT ,要进行减的操作其实也比较简单,给个负值就好啦。同样的,我们使用 INCRBY 并给负数的话,也是可以做减操作的。
批量操作
除了可以一个一个的添加以及获取数据外,我们也可以批量地添加或者获取数据。
127.0.0.1:6379> mset a aaa b bbb c ccc
OK
127.0.0.1:6379> mget a b c
aaa
bbb
ccc
对于批量操作来说,MSET 的参数就是一个 key 一个 value 的不停的向下添加。而获取就更简单了,直接写一排 key 就可以获取到这些 key 中的内容了。对于批量操作来说,只有一个额外的 MSETNX 命令,其实就和上面的 SET 命令中的 NX 参数一样,如果 key 存在,就不会修改添加。
127.0.0.1:6379> msetnx a aaaa b bbbb c cccc
0
127.0.0.1:6379> mget a b c
aaa
bbb
ccc
127.0.0.1:6379> msetnx d aaaa e bbbb f cccc
1
127.0.0.1:6379> mget d e f
aaaa
bbbb
cccc
127.0.0.1:6379> del a b c d e f
6
最后,DEL 这个删除 key 的命令本身就是支持放多个 key 的。
中文问题
默认情况下,redis-cli 客户端打开是以 utf-8 做为字符编码的,打印出来的效果是这样的。
127.0.0.1:6379> get a
"\xe4\xb8\xad\xe5\x9b\xbd\xe4\xba\xba"
如果我们想要看到真实的中文,可以在打开 redis-cli 时加一个参数。
redis-cli --raw
然后打开出来的内容就会显示正常的中文了。
127.0.0.1:6379> get a
中国人
另外还需要注意的,像是获取字符长度或者上面 GETRANGE 之类的函数,所针对的字符都是以 UTF-8 为标准的,也就是说,一个中文占三个字节。
127.0.0.1:6379> set a 中国人
OK
127.0.0.1:6379> get a
中国人
127.0.0.1:6379> strlen a
9
127.0.0.1:6379> getrange a 0 1
�
127.0.0.1:6379> getrange a 0 2
中
这个应该不用过多强调了,和 PHP 中原生的 strlen() 那些函数是一个概念。
总结
String 类型是最简单的,也是最常用的数据类型,没有什么别的好总结的,日常使用中肯定还是 SET 和 GET 用得最多,了解一下可以批量添加以及过期相关的设置就可以啦!
视频链接
微信文章地址:https://mp.weixin.qq.com/s/CBa7Kz5-u0LyFhX4zMNi0w