目录
2.4、incr、incrby、decr、decrby、incrbyfloat
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对应的值对比即可~
好啦,本期到这里咯,下期见~