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

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...