redis汇总
这里写自定义目录标题
1.数据类型
string
1. 命令
命令 | 介绍 |
---|---|
SET | $1600 |
SETNX | $12 |
SETEX | $1 |
GET | $1600 |
INCR | $12 |
MSET | $1 |
MGET | $1 |
MSETNX | 1 |
2. 使用场景
1. 缓存功能
2. 计数
3. 共享session
4. 限速
5.分布式锁
hash
list
set
zset
2.主从复制
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。
作用
1、数据冗余
2、故障恢复
3、负载均衡
4、读写分离
5、高可用基石
全量复制
部分复制
问题处理
3.持久化
持久化的功能:Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将Redis中的数据以某种形式(数据或命令)从 内存保存到硬盘。 当下次Redis重启时,利用持久化文件实现数据恢复。除此之外,为了进行灾难备份,可以将持久化文件拷贝到一个远程位置。Redis持久化分为 RDB持久化和AOF持久化,前者将当前数据保存到硬盘,后者则是将每次执行的写命令保存到硬盘。
RDB
RDB是一种快照存储持久化方式,具体就是将Redis某一时刻的内存数据保存到硬盘的文件当中,默认保存的文件名为dump.rdb,而在Redis服务器启动时,会重 新加载dump.rdb文件的数据到内存当中恢复数据。触发 RDB 持久化过程分为手动触发和自动触发。
手动
手动触发分别对应 save 和 bgsave 命令:
·save 命令:阻塞当前 Redis 服务器,直到 RDB 过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用。 ·
bgsave 命令:Redis 进程执行 fork 操作创建子进程,RDB 持久化过程由子进程负责,完成后自动结束。阻塞只发生在 fork 阶段,一般时间很短。 显然 bgsave 命令是针对 save 阻塞问题做的优化。因此 Redis 内部所有的涉及 RDB 的操作都采用 bgsave 的方式 除了执行命令手动触发之外,Redis 内部还存在自动触发 RDB 的持久化机制,例如以下场景:
1)使用 save 相关配置,如“save m n”。表示 m 秒内数据集存在 n 次修改时,自动触发 bgsave。
2)如果从节点执行全量复制操作,主节点自动执行 bgsave 生成 RDB 文件并发送给从节点。
3)执行 debug reload 命令重新加载 Redis 时,也会自动触发 save 操作。
4)默认情况下执行 shutdown 命令时,如果没有开启 AOF 持久化功能则自动执行 bgsave。
bgsave
bgsave 是主流的触发 RDB 持久化方式,根据下图了解它的运作流程
自动
除了通过客户端发送命令外,还有一种方式,就是在Redis配置文件中的save指定到达触发RDB持久化的条件,比如【多少秒内至少达到多少写操作】就开 启RDB数据同步。
例如我们可以在配置文件redis.conf指定如下的选项:
#900s内至少达到一条写命令
save 900 1
#300s内至少达至10条写命令
save 300 10
#60s内至少达到10000条写命令
save 60 10000
优点
AOF
自动
手动
持久化选择
4.内存优化
5.哨兵
6.集群
7.缓存优化
缓存击穿
描述:缓存击穿,是指某个极度“热点”数据在某个时间点过期时,恰好在这个时间点对这个 KEY 有大量的并发请求过来,这些请求发现缓存过期一般都会从 DB 加载 数据并回设到缓存,但是这个时候大并发的请求可能会瞬间 DB 压垮。
解决方案:
1、设置热点数据永远不过期。
2、接口限流与熔断,降级。重要的接口一定要做好限流策略,防止用户恶意刷接口,同时要降级准 备,当接口中的某些 服务 不可用时候,进行熔断,失败快速返回机制。
3、主动更新缓存:默认缓存是被动更新的。只有在终端请求发现缓存失效时,它才会去数据库查询新的数据。那么,如果我们把缓存的更新,从被动改为主 动,也就可以直接绕开缓存风 暴的问题了,
4、使用互斥锁:请求发现缓存不存在后,去查询 DB前,使用锁,保证有且只有一个请求去查询 DB ,并更新到缓存。
- 1、获取锁,直到成功或超时
- 2、再去缓存中。如果存在值,则直接返回;如果不存在,则继续往下执行如果成功获取到锁的 话,就可以保证只有一个请求去数据源更新数据,并更新到 缓存中了。
- 3、查询 DB ,并更新到缓存中,返回值。
缓存穿透
描述:缓存穿透是指查询一个一定不存在的数据,由于缓存不命中,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次 请求都要到存储层去查询,失去了缓存的意义。
解决方案:
1、缓存空对象
2、bloomfilter提前拦截
缓存雪崩
描述:缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
解决方案:
1、缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
2、如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
3、设置热点数据永远不过期。
缓存与db一致性
产生原因
主要有两种情况,会导致缓存和 DB 的一致性问题:
缓存和 DB 的操作,不在一个事务中,可能只有一个操作成功,而另一个操作失败,导致不一致
二种更新策略
先删缓存,再更新数据库
我们会基于这个方案去实现缓存更新,但是不代表这个方案在并发情况下没问题 该方案会导致不一致的原因是。同时有一个请求A进行更新操作,另一个请求B进行查询操作。
那么会出现如下情形:
(1)请求A进行写操作,删除缓存
(2)请求B查询发现缓存不存在
(3)请求B去数据库查询得到旧值
(4)请求B将旧值写入缓存
(5)请求A将新值写入数据库
上述情况就会导致不一致的情形出现
解决方案(数据库与缓存更新与读取操作进行异步串行化)
更新数据的时候,将操作任务,发送到一个队列中。
读取数据的时候,如果发现数据不在缓存中,那么将重新读取数据+更新缓存的操作任务,也发送同一个 队列中。
每个个队列可以对应多个消费者,每个队列拿到对应的消费者,然后一条一条的执行。