【Redis01】​Redis基础:String相关操作
创始人
2024-05-29 21:21:50
0

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 a127.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,redisredisfff127.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
cccc127.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
9127.0.0.1:6379> getrange a 0 1
�
127.0.0.1:6379> getrange a 0 2
中

这个应该不用过多强调了,和 PHP 中原生的 strlen() 那些函数是一个概念。

总结

String 类型是最简单的,也是最常用的数据类型,没有什么别的好总结的,日常使用中肯定还是 SET 和 GET 用得最多,了解一下可以批量添加以及过期相关的设置就可以啦!

相关内容

热门资讯

运动会致辞 运动会致辞(精选5篇)  无论在学习、工作或是生活中,大家或多或少都用到过致辞吧,致辞要求风格的雅、...
六一儿童节的主持稿 六一儿童节的主持稿(精选8篇)  随着社会一步步向前发展,我们都不可避免地要接触到主持稿,主持稿是主...
元旦文艺汇演主持稿 元旦文艺汇演主持稿范文(通用5篇)  在当下社会,很多情况下我们需要用到主持稿,主持稿起到承上启下的...
颁奖主持词 颁奖主持词三篇  主持人在一场活动中是十分重要的,一个好的主持人是一直带动着活动过程中的气氛,让大家...
婚宴答谢宴简短主持词 婚宴答谢宴简短主持词  主持词要根据活动对象的不同去设置不同的主持词。在人们积极参与各种活动的今天,...
汽车公司庆典主持词 汽车公司庆典主持词  利用在中国拥有几千年文化的诗词能够有效提高主持词的感染力。现今社会在不断向前发...
古筝音乐会主持词 古筝音乐会主持词6篇  主持词要把握好吸引观众、导入主题、创设情境等环节以吸引观众。在一步步向前发展...
小学元旦联欢会主持词开场白和... 小学元旦联欢会主持词开场白和结束词  根据活动对象的不同,需要设置不同的主持词。随着社会一步步向前发...
知识竞赛主持词 知识竞赛主持词(精选6篇)  主持词的写作需要将主题贯穿于所有节目之中。在人们越来越多的参与各种活动...
小学家长会学生欢迎词 小学家长会学生欢迎词小学家长会学生欢迎词文章标题:小学家长会学生欢迎词家长会欢迎辞亲爱的叔叔阿姨,爷...
消夏晚会主持词 2017消夏晚会主持词  漫漫暑假,天气越来越燥热,不妨在炎热的午后,参加一场纳凉晚会,欣赏社区带来...
周立波脱口秀台词 周立波脱口秀台词集锦四十岁之前喝酒是为了别人的一句~~厉害!醉了!!四十岁以后喝酒是为了自己的一句~...
圣诞节活动主持词节目串词 圣诞节活动主持词节目串词3篇  根据活动对象的不同,需要设置不同的主持词。在人们积极参与各种活动的今...
生日华诞主持词 生日华诞主持词范文各位领导,各位朋友,各位来宾,女士们,先生们:  中午好。  今天是个喜庆的日子,...
学术会议主持词 学术会议主持词  什么是主持词  由主持人于节目进行过程中串联节目的串联词。如今的各种演出活动和集会...
订婚仪式及主持词 订婚仪式及主持词范文(通用3篇)  活动对象的不同,主持词的写作风格也会大不一样。在现在的社会生活中...
古剑奇谭欧阳少恭经典台词参考 古剑奇谭欧阳少恭经典台词参考  大型古装玄幻剧《古剑奇谭》正在湖南卫视热播,剧中,乔振宇饰演温文尔雅...
幼儿园晨会主持词 幼儿园晨会主持词  美好的一天从早上开始,从晨会开始,从大家的好的状态开始,从最好的开始。以下是小编...
诗文诵读展示主持词 诗文诵读展示主持词  主持词没有固定的格式,他的最大特点就是富有个性。在当今不断发展的世界,很多晚会...