02-string类型
命令
get 和 set
除了基本的用法, set 还有一系列的参数:
NX/XX:NX如果没有那么就创建,有就不创建了,XX则相反。这个不需要背,要用的时候测试一下就可以EX: 设置有效时间,单位为秒
incr 和 decr
incr 是自增 1, decr 是自减 1 。
当然,它们还有衍生的,incrby/decrby 后面是添加数字的,如果这个 key 不存在,那么就默认是从 0 开始。
如果想要小数增加,那么就使用 incrbyfloat 来执行就可以了
append
用来追加字符串的
可以追加中文,但是保存的内容是 \xea 这样的16进制,
如果想要通过 get 获取到中文,那么就需要在连接服务器之前就需要添加
--raw这个参数命令
setrange 和 getrange
setrange 是表示设置一段范围内的内容
- key 不存在:那么就会在前面添加 \x00 用来占位
- value 长度过长:那么就会设置一段区间内
getrange 也是类似,获取一段范围内的内容,但是需要注意的是它是前闭后闭的,而且它像 Python 那样支持负数
strlen
返回的字符串的长度
编码方式
在 Redis 中 string 类型有三种编码方式:embstr, int 和 raw
int: 它是存储 8 字节 64 位的整数,等价于Java中的long类型embstr: 在小于 39 字节的情况下,是这个压缩的类型raw: 在大于 39 字节的情况下,会使用这个类型
不需要记住
39这个数字,而是要着重理解为什么是39这个数字,因为这个数字是可以配置的,在不同的场景下,配置的数字一般是不同的
应用场景
缓存
缓存不仅仅是 string 类型的应用场景,而且也是 hash/list 等主要的应用场景。Redis 主要的应用场景就是缓存
缓存一般存储的都是热点数据,这些热点数据可以通过一些方法来获取到:
- 存储最近从
MySQL中查询到的数据 - 通过统计,统计最近一段时间前 20% 的数据
- 通过实验来统计
为了防止数据过多导致 Redis 宕机,一般会给相关的值设置一定的过期时间,这样在存储一段时间后,如果不访问,没有更新 ttl, 那么就会自动删除
它们的执行逻辑基本如下:
- 从
Redis中获取 - 找不到的话那么就从
MySQL中获取,并且把查询到的对象序列化,存储到Redis中 - 找的到的话就直接从
Redis中获取,把获取到的字符串反序列化为对象
计数
计数是统计次数,比如播放数/点赞数/访问数等内容。
由于 Redis 是不擅长统计,因此一般会配合像 MySQL 这样的其他服务来统计内容。而由于这些内容相对来说对实时性要求没那么高,因此是采用异步同步的策略
异步同步是数据不会实施响应,不会像修改昵称那样修改完后就可以直接响应,一般会有一段时间后才会同步。
举一个比较经典的例子:B 站在某一个比较大的 UP 上传一个视频后,会出现点赞比播放数多很多的情况,通常是几十个点赞,然后1播放。这就是异步方式来同步
为了增加可靠性,一般情况下数据不会只存储在内存中或者只存储在 Redis 中,比如采用 “321”的备份策略,对数据经行持久化存储
Session 存储
在比较大的业务中,一般都是集群来部署服务器的,因此服务器是有很多台,如果像之前 Java 那样使用 Session,不同机器就会识别不了导致用户登录认证失败。
为了解决这个问题,就可以使用 Redis 来管理 Session 会话,这样不同机器只需要查询 Redis 上有没有相关的内容就可以知道登录状态
验证码
像验证码这样有时效性的内容就很适合使用 Redis 来存储
执行的步骤如下:
- 先获取当前验证码的执行次数,如果执行的次数过多,那么就不执行
- 如果满足条件,那么就生成相关的验证码,并且统计执行的次数,把这些内容存储在
Redis中,这些内容都要设置过期时间 - 校验验证码,根据用户 Id 查询到相关的内容,如果有验证码,校验一下,如果校验成功,生成
JWT令牌并且删除相关的验证码