redis缓存
1.Redis 持久化机制
Redis 有两种持久化机制:RDB和AOF
Redis 的持久化是可以禁用的,就是说你可以让数据的生命周期只存在于服务器的运行时间里。两种方式的持久化是可以同时存在的,但是当 Redis 重启时,AOF 文件会被优先用于重建数据。
(1)RDB
RDB 持久化方式会在一个特定的间隔保存那个时间点的一个数据快照
(2)AOF
AOF 持久化方式则会记录每一个服务器收到的写操作。在服务启动时,这些记录的操作会逐条执行从而重建出原来的数据。写操作命令记录的格式跟 Redis 协议一致,以追加的方式进行保存
2.Redis 集群方案与实现
- 客户端分片
- 基于代理的分片
- 路由查询
- 客户端分片
- 由客户端决定 key 写入或者读取的节点
- 包括 Jedis 在内的一些客户端,实现了客户端分片机制
3.Redis 内部结构
Redis 内部使用一个 redisObject 对象来表示所有的 key 和 value。
4.Redis 内存淘汰机制
可以设置内存最大使用量,当内存使用量超出时,会施行数据淘汰策略。
Redis 具体有 6 种淘汰策略:
策略 | 描述 |
volatile-lru | 从已设置过期时间的数据集中挑选最近最少使用的数据淘汰 |
volatile-ttl | 从已设置过期时间的数据集中挑选将要过期的数据淘汰 |
volatile-random |
从已设置过期时间的数据集中任意选择数据淘汰 |
allkeys-lru | 从所有数据集中挑选最近最少使用的数据淘汰 |
allkeys-random | 从所有数据集中任意选择数据进行淘汰 |
noeviction | 禁止驱逐数据 |
5.Redis 为什么是单线程的
因为 CPU 不是 Redis 的瓶颈。Redis 的瓶颈最有可能是机器内存或者网络带宽。(以上主要来自官方 FAQ)既然单线程容易实现,而且 CPU 不会成为瓶颈,那就顺理成章地采用单线程的方案了。
6.Redis 有哪些类型
在 Redis 中有五种数据类型
- String:字符串
- Hash:字典
- List:列表
- Set:集合
- Sorted Set:有序集合
7.缓存崩溃
- 碰到这种情况,一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。
- 加锁排队只是为了减轻数据库的压力,并没有提高系统吞吐量。假设在高并发下,缓存重建期间 key 是锁着的,这时过来 1000 个请求 999 个都在阻塞的。同样会导致用户等待超时。
8.缓存降级
(1)页面降级
在大促或者某些特殊情况下,某些页面占用了一些稀缺服务资源,在紧急情况下可以对其整个降级,以达到丢卒保帅;
(2)页面片段降级
比如商品详情页中的商家部分因为数据错误了,此时需要对其进行降级;
(3)页面异步请求降级
比如商品详情页上有推荐信息/配送至等异步加载的请求,如果这些信息响应慢或者后端服务有问题,可以进行降级;
(4)服务功能降级
比如渲染商品详情页时需要调用一些不太重要的服务:相关分类、热销榜等,而这些服务在异常情况下直接不获取,即降级即可;
(5)读降级
比如多级缓存模式,如果后端服务有问题,可以降级为只读缓存,这种方式适用于对读一致性要求不高的场景;
(6)写降级
比如秒杀抢购,我们可以只进行Cache的更新,然后异步同步扣减库存到DB,保证最终一致性即可,此时可以将DB降级为Cache。
(7)爬虫降级
在大促活动时,可以将爬虫流量导向静态页或者返回空数据,从而保护后端稀缺资源。
(8)自动开关降级
自动降级是根据系统负载、资源使用情况、SLA等指标进行降级。
(9)超时降级
当访问的数据库/http服务/远程调用响应慢或者长时间响应慢,且该服务不是核心服务的话可以在超时后自动降级;如果是调用别人的远程服务,和对方定义一个服务响应最大时间,如果超时了则自动降级。
9.使用缓存的合理性问题
- 热点数据,缓存才有价值
- 频繁修改的数据,看情况考虑使用缓存
- 数据不一致性
- 缓存更新机制
- 缓存可用性
- 缓存服务降级
- 缓存预热
- 缓存穿透
10.聊聊 Redis 使用场景
- 缓存
- 会话缓存
- 时效性
- 访问频率
- 计数器
- 社交列表
- 记录用户判定信息
- 交集、并集和差集
- 热门列表与排行榜
- 最新动态
- 消息队列