Redis中的字符串直接按照二进制的数据存储,不会有任何的编码转换,因此存放什么样,取出来的时候就什么样。而MySQL默认的字符集是拉丁文,如果插入中文就会失败
Redis中的字符串类型不仅可以存放文本数据,还可以存放整数,JSON,xml,图片,视频,音频等等(但是音频视频的体积很大,Redis中对String类型限制大小为512mb)
通过自动补全可以看到set命令的完整语法
Redis文档中语法格式说明:
符号 | 解释 |
---|---|
[ ] | 代表可选项,[ ]和[ ]之间可以同时存在 |
| | 代表或者的意思,多个|只能出现一个 |
value后面的ex|px代表着过期时间
也就是说
set key value ex 10
等价于
set key value
expire key 10
通过简化代码数量,减少网络通信的次数,提升显效率
并且,一句代码还可以保证原子性,Redis分布式锁中会有所体现,后面的blog会详细讲解
除此以外,还可以这样写set命令
setnx
setex
如果key存在,新的value覆盖了旧的value,数据的类型可能会被改变,key的生存时间也会失效
setnx key seconds
setex key value seconds
psetex key millionseconds
获取key对应的value
需要注意的是,get只适用于字符串类型,如果是其他类型则会报错
一次插入多个键值对,key和value交替写,时间复杂度O(N),N是key的数量
一次获取多个value,时间复杂度O(N),N是key的数量
将string类型的value当作数字,进行加减操作,时间复杂度都是O(1)
命令 | 操作 |
---|---|
incr | value + 1 |
incrby | value + n |
decr | value - 1 |
decrby | value - n |
incrbyfloat | value +/- 小数 |
incr key
此时的key必须是一个64位内的整数,操作的返回值就是value+1后的结果(相当于++i)
如果key不是合理整数则报错
如果直接incr一个不存在的key,那么就会把这个key的value当作0
incrby key increment
同理,如果针对一个不存在的key进行incrby,那么会将这个key的value当作0处理
逻辑和incr一致
decr key
逻辑和incrby一致
decrby key decrement
其他逻辑和incrby一致,但是由于没有decrbyfloat,因此只能通过incrbyfloat key -n的操作来实现减法
incrbyfloat key increment
如果key存在,拼接key对应的value和给定字符串的内容,返回拼接完的字符串有多少个字节(utf8中的一个汉字通常是3个字节)
append key value
如果key不存在,那么和直接使用set一样
如果插入汉字,取出的时候客户端不会自动翻译二进制数据,而是将二进制转换为十六进制
可以在Redis启动的时候加上–raw的选项,就可以解决上述问题了,退出Redis使用ctrl + d
相当于Java中的substring,切分value中的部分字符串,范围由start和end确定(左闭右闭区间)
Redis中的下标从1开始,并且支持负数,如果是-1那就代表倒数第一个元素 = len - 1
getrange key start end
但是,由于中文一般是3个字节,那么在使用getrange后,切割的结果可能不是一个完整的汉字了
将字符串中的部分子串替换为别的内容,返回值是替换之后的字符串长度
setrange key offset value
其中的offset是从第几个字节开始替换,替换的长度就是value的长度
如果对一个不存在的key进行setrange,并不会报错,而是在偏移量之前添加空字节0x00
同样的,如果value是一段中文,那么setrange可能会出错
获取字符串的长度,单位是字节,如果value不是string类型,则报错,如果key不存在,返回0
strlen key
编码方式 | 说明 |
---|---|
int | 64位/8字节的整数 |
embstr | 压缩字符串 小于等于39个字节的字符串 |
raw | 普通字符串 大于39个字节的字符串 |
通过object encoding key可以查看对应key的编码方式
在Redis中,存储小数其实和存储一个字符串一样,因此每次对小数进行算数操作,都需要把字符串转换为小数,然后再进行计算,算完再转为小数
上述策略中,随着时间推移,越来越多的key从mysql中存入Redis,使Redis的数据变得过多,那么有如下两种解决方案
Redis中只记录视频的播放次数,并且异步同步数据到统计数据的数据库
http中的cookie是用来实现用户信息的保存的,其需要session的配合完成。服务器这边存储了用户的数据,而cookie是让浏览器存储用户的身份标识(sessionId)
但如果应用了分布式系统,存在多个应用服务器。与用户登录时可能将用户会话信息存储在a服务器中,但是用户下次访问请求可能发送到c服务器中,而c服务器中没有用户的会话信息
解决方法是:所有的服务器都把用户的会话信息存放在Redis中
服务器将用户的手机号当作key,验证码当作value存放在Redis中,并设置过期时间,用户在指定时间内提交验证码给服务器,服务器通过手机号向Redis获得正确的验证码,并与用户发送过来的进行比对,返回true或false