Redis中,带你深入了解数据类型string!!!

目录

1、Redis中string的存储方式

2、相关命令

2.1、set、setNX、setEX、setPX

2.2、Mset、 Mget

2.3、setNX、setEX、PsetEX

2.4、incr、incrby、decr、decrby、incrbyfloat

2.5、append

2.6、getrange

 补充:中文处理

2.7、setrange

 2.8、strlen

3、redis中string类型 的应用场景

3.1、缓存功能

3.2、计数功能

3.3、共享回话-Session

3.4、手机验证码


1、Redis中string的存储方式

        Redis中的字符串,是直接按照二进制数据的方式进行存储的。对比MySQL来说有什么不同呢?MySQL默认的字符集是拉丁文,也就是我们以前在使用MySQL时会遇到的问题-插入中文时会失败。

        而在redis中,就不会存在这些问题,因为Redis中不会进行任何的编码转换,存什么就是什么,例如可以存整数,字符串,JSON等都是支持的~

        这种方式带来的好处就是遇到乱码的概率变小了,因为不用进行编码转换,相当于是少了一层检查~

        但同时这里也要注意一个问题,在redis中存储二进制数据时,要注意他的大小,尽量不要太大,redis中自身也做了限制string类型的大小最大是512M。这样做的原因是redis是单线程模型,每个操作要保证是短平快~


2、相关命令

2.1、set、setNX、setEX、setPX

语法格式:set key value [expiration EX seconds | PX millisecconds] [NX | XX]

这语法格式给,看着有点蒙,我们看个示例来帮助理解一下:

        看这个图片就是帮助熟悉一下语法使用,不知道什么意思也没关系,接下来就详细说明一下,这些是什么意思呢~

  • 第一:[ ]是什么意思:相当于是一个独立的单元,表示可选项,可有可无,两个[ ] 之间是可以同时存在的
  • 第二:expiration,翻译:到期。大概猜到后面的指到期时间设置相关的呗~
  • 第三个:EX ,后面跟了一个seconds,意思就是EX后面设置的时间是以秒为单位的;PX后面跟了一个millisecconds,意思就是PX后面设置的时间是以毫秒为单位的~
  • 第三个是一个竖杠,意思是或者的意思,这里的意思就是前面这种时间单位设置或者是后面这种,二者不能共存~
  • 第四: NX | XX  ,这里的竖杠同上述意思相同; NX指的是如果key存在,则不设置返回nil,如果key不存在,则存入key value值,并以前面的到期参数为该key的到期时间;XX指的是如果key存在则做出相应设置,如果key不存在则不设置返回nil

        看了这些介绍后,再看上面的截图,就清晰了不少~

2.2、Mset、 Mget

  • Mset:可用该命令,同时存入多组key value
  • Mget:可用该命令,同时取出多个key对应的多个value
  • 存在的意义:多次使用get和set方法,产生多次网络传输所消耗的时间,用一次网络传输进入多组的操作,提升效率~
  • 时间复杂度:O(N),此处的n指的是key的数量
  • Mget语法格式:Mget key [key...]
  • Mset语法格式:Mset key value [key value ...]
  • 注意的点:也不要一次执行太多,有可能会把redis给阻塞住~

示例:

补充:flushall指的是将所有的key全部删除~

2.3、setNX、setEX、PsetEX

  • setNX:不存在才能设置,存在即设置失败~
  • setEX:设置key的过期时间,单位:秒redis客户端在你敲完命令后会提示后面语法,根据他的提示来设置值就好了~
  • PsetEX:设置key的过期时间,单位:毫秒key 存在或者是不存在都不会报错~

2.4、incr、incrby、decr、decrby、incrbyfloat

  • incr:针对value+1,此时value必须是一个整数
  • incrby:针对value + n,value必须是整数
  • decr:针对value - 1,value是整数
  • decrby:针对value - n,value是整数
  • incrbyfloat:针对value 加 或者是 减 小数

注意的点:

  • 上述所说的value必须是整数,这个整数范围是8字节,即java中的long
  • 如果上述操作中,key还不存在,就是立即存入一个key,value为 0
  • incrbyfloat中使用负数的形式实现减法
  • 上述操作的时间复杂度都是O(1)
  • 因为redis是单线程模型,所以在自增时不会引起线程安全问题~

示例:

2.5、append

  • append:字符串拼接,加在原字符串的结尾
  • 时间复杂度:O(1)
  • 语法:append key value
  • 返回值:拼接后字符串的长度,单位:字节

举例:

 

2.6、getrange

  • getrange:获取字符串的部分内容
  • 时间复杂度:O(1)
  • 语法格式:getrange key start end
  • 说明:上述的start指的是所取值的开始位置,end为结束位置,区间为前闭后开
  • redis中start end的下标可以为负数,负数表示为倒数第几个元素~
  • 返回值:该字符串对应的部分内容

举例:

 补充:中文处理

未处理前:

         当存入中文时,取出key对应的value,对应的值是一个用十六进制表示的二进制数据,如果我们想要让redis返回值时,自动翻译,则需要在启动redis客户端时加上--raw的选项

处理后:

未处理前,使用getrange进行操作:

处理后:

处理后,获取中文时,可能会出现乱码现象:

因为可能是切出来的不是完整的汉字~

2.7、setrange

  • setrange:修改字符串的部分内容
  • 时间复杂度:O(1)
  • 语法格式:setrange key offset value
  • 说明:offset指的是偏移量,也就是在偏移量第几个元素开始进行替换为value,具体替换多少个元素,要看value值对应的是多少个元素
  • 返回值:该字符串修改后的长度

举例:

同上述一样,如果value是中文,很可能就会出现问题,偏移量所在的位置可能刚好是一个中文字的中间:

 

 2.8、strlen

  • strlen:获取字符串的长度,单位:字节-一个汉字占3个字节-utf8编码方式
  • 时间复杂度O(1)
  • 语法格式:strlen key

举例:

 


3、redis中string类型 的应用场景

3.1、缓存功能

示图:

         总的来说就是将热点数据在redis中存一份,业务层查找数据时,先在redis中查找,效率高,但redis没有对应数据时,再去MySQL中查找,将读取的数据返回给业务层,并写入redis中~

3.2、计数功能

        redis可以实现快速计数,但由于redis存储数据不便于统计,所以在redis进行计数时,可能会同时将数据同步到其他的统计数据仓库中,例如在我的实习中,经常要统计热门使用的前一百张单据,此时使用redis,就很难统计出来,但使用MySQL就会很方便了~

        这里的同步数据,并不是说,redis中数据发生变化,会立即同步到统计数据仓库中,而是通过异步方式来进行同步数据,例如在请求量比较少时进行同步数据~

3.3、共享回话-Session

        实际工作中,一个web应用可能是存在多个应用服务器的,如果说每个应用服务器都各个存储自己的session,那如果一个用户发送1个请求前,进行了登录信息验证,而后续又发送了三个请求,但这三个请求恰巧被发送到了另外3台应用服务器中,那这三个应用服务器都是没有改用户的session的,就会让用户进行登录操作,此时就是出现一个用户需要返回多次登录,用户的体验感非常不好~

        因此,将session存在redis中,每次发送请求时,各个应用服务器都从redis中获取用户信息,实现了回话数据共享,有效解决了上述问题~

3.4、手机验证码

  • 生成验证码:有效使用了redis中按时过期相关命令
  • 检查验证码:取出redis中key对应的值对比即可~

好啦,本期到这里咯,下期见~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙洋静

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值