【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 用得最多,了解一下可以批量添加以及过期相关的设置就可以啦!

相关内容

热门资讯

高考作文范文【推荐6篇】 高考作文范文 篇一:《高考改革与教育公平》高考作文范文 篇二:《高考改革与素质教育》高考作文范文 篇...
高考作文题目预测:用心创造快... 高考作文题目预测:用心创造快乐 篇一快乐是一种心态,也是一种态度。在现代社会中,人们往往忽视了用心创...
广东高考英语作文题目【经典3... 广东高考英语作文题目 篇一Title: The Importance of Time Managem...
全国及11个省市高考作文题目... 全国及11个省市高考作文题目 篇一题目:如何适应高考改革的新形势近年来,高考改革取得了显著的进展,不...
高考议论文(经典6篇) 高考议论文 篇一:高考制度是否应该改革高考是中国教育体系中的重要组成部分,对于每一个学生来说都至关重...
关于2021高考作文范文【优... 关于2021高考作文范文 篇一2021高考作文范文:努力奋斗的力量在2021年的高考作文中,我选择了...
云南高考理科状元:成绩出乎意... 云南高考理科状元:成绩出乎意料 篇一近日,云南省高考理科状元的成绩出乎意料地引起了广泛关注。这位学生...
网络安全作文高考范文5篇(推... 网络安全作文高考范文5篇篇一:网络安全的重要性网络安全已经成为当今社会中一个非常重要的问题。随着互联...
语文高分作文范文高考【推荐6... 语文高分作文范文高考 篇一《文字的魅力》语文在高考中占据着重要的地位,其高分作文更是备受考生们的关注...
带着镣铐舞蹈高考满分作文(精... 带着镣铐舞蹈高考满分作文 篇一在人生道路上,我们经常会遭遇各种各样的困难和挑战。有时候,我们会觉得自...
全国高考语文作文(精彩6篇) 全国高考语文作文 篇一我与书的故事书是人类的良师益友,它陪伴着我度过了许多难忘的时光。我与书的故事始...
责任的高三作文800字【最新... 责任的高三作文800字 篇一责任的重要性责任是一种使命感和担当精神,是对自己和他人的承诺。对于高三学...
回到原点高考满分作文(最新4... 回到原点 高考满分作文 篇一走出误区,回到原点高考,是每个学生人生中的一次重要考试,也是一个人人都希...
浙江卷语文高考满分作文【精彩... 浙江卷语文高考满分作文 篇一:《传统与创新的融合》传统与创新一直是人们对于文化发展的两个关键词。传统...
高三作文生命是宝贵(实用6篇... 高三作文生命是宝贵 篇一生命是宝贵生命是宝贵的,它是我们存在于世界上的根本,无论是人类还是其他生物,...
全国各地高考语文作文汇总完整... 全国各地高考语文作文汇总完整版 篇一高考语文作文是考生们表达自己观点和思想的重要途径,也是考察他们语...
高考优秀范文及解析(实用6篇... 高考优秀范文及解析 篇一:如何提高高考英语作文得分高考英语作文是考生最容易失分的部分之一,但只要掌握...
浙江高考的状元总分为723理... 浙江高考的状元总分为723理综满分 篇一近日,浙江省高考成绩出炉,一位学子以723分的总分夺得了状元...
高三开学通知模板范文5篇【优... 高三开学通知模板范文5篇 篇一高三开学通知亲爱的同学们:大家好!经过漫长的暑假,新的学年即将开始。在...
仰望的高三作文(精选3篇) 仰望的高三作文 篇一我的高三生活即将结束了,回想起这段时光,我不禁感慨万分。这是一个充满挑战和压力的...