redis的String类型介绍

发布于:2025-03-28 ⋅ 阅读:(24) ⋅ 点赞:(0)

一.String类型

redis中的字符串直接就是按照二进制数据的方式进行存储的(不会做任何的编码转化,存的是什么,取出来还是什么)

redis的字符串不仅仅可以存储文本数据,整数,普通的文本字符串,JSON,XML,二进制数据(图片,视频,音频…)

redis给String类型限制了大小是512M,希望的是redis这个单线程模型,进行的操作都是比较快速的

1.SET

redis文档给出的语法格式说明:
[ ] 相当于一个独立的单元,表示可选项(可有可无的)

其中 | 表示“或者”的意思,则代表在多个选项中,只能选择其中一个。

[ ] 和 [ ] 之间是可以同时存在的,也就是说下面的EX | PX和 NX | XX可以两两组合,比如EX 和 NX 或者 EX 和 XX……

EX: 设置过期时间(单位s)

PX: 设置过期时间(单位ms)

NX: 如果key不存在,才设置;如果key存在,则不设置(返回nil)

XX: 如果key存在,才设置(相当于更新key的value);如果key不存在,则不设置(返回nil)

如果key不存在,创建新的键值对;如果key存在,则让新的value覆盖旧的value,这个过程可能改变原来的数据类型

原来的这个key的ttl(过期时间)也会失效

一个失去年终奖的小技巧(删除redis上的所有数据,删库):FLUSHALL
在这里插入图片描述

EX:在这里插入图片描述

NX:在这里插入图片描述

XX:
在这里插入图片描述

2.GET

对于GET来说,只是支持字符串类型的value,如果value是其他类型,使用GET获取就会报错!!
在这里插入图片描述

3.MSET和MGET

两个命令都是一次操作多组键值对。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.SETNX SETEX PSETEX

SETNX:在这里插入图片描述

SETEX:
单位为秒过期时间
在这里插入图片描述

PSETEX:
单位为毫秒过期时间
在这里插入图片描述

5.value加减命令

incr: 针对value+1

需要注意的是,只能给整数进行+1操作,但是如果这个整数超过了8字节整数,则进行+1操作也无法进行。
在这里插入图片描述
在这里插入图片描述

incr操作的这个key不存在,会把这个key的value值作为0来使用,+1操作后 ,key的value就为1了,并且也创建了一个key。
在这里插入图片描述

incrby: 针对value + n

需要注意的事项和incr一样
在这里插入图片描述
decr: 针对value - 1

key对应的value也必须是整数,在8个字节的整数范围内,如果这个key的value值不存在,也当做0处理
在这里插入图片描述
在这里插入图片描述

decrby: 针对value - n

需要注意的事项和incrby差不多
在这里插入图片描述

incrbyfloat: 针对value + / - 小数

减法的运算通过加一个负数来进行操作:
在这里插入图片描述

6.字符串拼接,获取和修改等操作

(1)append

在字符串后进行拼接

在这里插入图片描述

需要注意的是:append返回值的长度单位是字节。

在这里插入图片描述

redis的字符串不会对字符编码做任何处理(redis只认字节),当前使用的Xshell终端默认的字符编码是UTF8,在终端输入汉字之后,也就是按照UTF8进行编码的,一个汉字在UTF8字符集中,通常是3个字节。

此处get获取的value值,是 “你好” 在UTF8中的编码形式,redis并不会返回汉字,只会返回二进制。
在这里插入图片描述

如果需要redis客户端返回汉字,就需要在启动客户端时,加上一个 --raw 的选项,这样redis客户端才会自动的把二进制数据尝试进行翻译。

在这里插入图片描述

(2)getrange

在java中和substring的作用类似

在这里插入图片描述

需要注意的是,上述start和end都是闭区间,并且上述也说了,-1代表倒数第一个字符,也就是length() - 1下标,其他下标以此类推
在这里插入图片描述

如果字符串中保存的是汉字,此时进行分子串切分,很可能切出不完整的汉字,或者是一些看不懂的字符串。
在这里插入图片描述

(3)setrange

通过偏移量找到需要改变字符串的起始下标,通过用户设置的新的value来进行覆盖

在这里插入图片描述
在这里插入图片描述

演示:
在这里插入图片描述

如果此时这个key的value值是一个中文字符串,进行setrange时,是可能会搞出问题的:
在这里插入图片描述

对于不存在的key值,setrange会把offset之前填充为十六进制的\x00:在这里插入图片描述

(4)strlen

获取到字符串的长度(单位是字节)

在这里插入图片描述

演示:
在这里插入图片描述在这里插入图片描述

二.String内部编码

1.int
8字节的整数

2.embstr
压缩字符串,使用于表示比较短的字符串

3.raw
普通字符串,使用于表示更长的字符串,只是单纯的持有字节数组在这里插入图片描述

redis存储小数和整数使用的类型也是不一样的,小数是通过字符串来进行存储的,如果每次进行小数的算数运算,都需要把小数这个字符串转换成小数,进行运算后,结果再转换回字符串保存。在这里插入图片描述

三.String类型的运用场景

1.缓存运用

在这里插入图片描述

整体思路:
应用服务器访问数据的时候,先查询redis,如果redis上数据存在了,就直接从redis取数据交给应用层服务器,如不再进行访问数据库了。

如果redis上数据不存在,再读取数据库(MySQL),把读到的数据返回给应用服务器的同时,也同步把数据写入到redis当中。

redis这样的缓存,经常用来存储热点数据,所谓的热点数据就是高频被使用的数据,这个定义方式根据不同的业务场景来进行定义。

但是上述这个策略存在一个问题:

随着时间的推移,肯定是会有越来越多的key在redis上访问不到,因为数据在不断变多,此时又需要从MySQL读取数据并写入redis中,这样redis中的数据会变的更多,此时redis就无法承受这样的数据量。

解决办法:

1)把数据写入redis时,增加一个过期时间;
2)redis也在内存不足时,提供了淘汰策略(后续会详细讲解)

2.计数功能

在这里插入图片描述

3.共享会话

如果每个应用服务器,只维护自己的会话数据,彼此之间不进行共享,用户请求访问到不同的服务器上,就可能出现一些不正确的处理情况

在这里插入图片描述

此时通过redis服务器将所有的会话数据对各个服务器进行了共享

在这里插入图片描述

4.手机验证码

(1)生成验证码

用户在获取验证码的页面中进行点击获取验证码的请求框,但是需要注意的是,获取验证码这个操作会有限制。

比如限制1分钟之内最多获取5次验证码,或者每次获取验证码的时间必须超过1分钟。

进行限制是为了防止用户获取验证码时,多次发送获取验证码的请求,给服务器造成过大的压力。

获取了验证码之后,就会给这个验证码设置一个有效时间,在redis中就是设置一个过期时间。

(2)校验验证码

用户将短信收到的验证码输入对话框中,此时系统会对这个验证码进行校验,校验当前这个验证码是否正确。