【1年Java面试资料整理】Redis-数据缓存
一、持久化机制
- 机制:通过持久化机制把内存中的数据同步到硬盘文件。
- 持久化方式(默认RDB,两者同时开启时,优先选择AOF恢复)
- RDB:按一定时间策略保存数据内存快照,dump.rdb
- 工作原理
- Redis forks
- 子进程写数据到临时RDB文件中
- 新文件替换老文件
- 工作原理
- RDB:按一定时间策略保存数据内存快照,dump.rdb
-
- AOF:将每一个写命令追加到文件最后,类似mysql的binlog
二、redis数据结构
- String:set、get、decr、incr、mget
- Hash:hget、hset、hgetall
- List:lpush、rpush、lpop、rpop、lrange【双向链表】【可用于做高性能分页】
- Set:sadd、spop、smenmber、sunion
- Sorted Set:zadd、zrange、zrem、zcard【与set相比,增加了一个权重参数score】
三、redis设置过期时间
set key时,可以给个expire time,redis对这些key进行删除的方式:
- 定时删除:redis每隔100ms随机抽取一些设置了过期的key,进行过期删除。
- 惰性删除:定时删除策略可能会导致已过期的key并未删除,除非系统查一下这个key,才会被redis删除。
针对大量过期key堆积在内存中问题,引出redis内存淘汰机制
- volatile-lru:已设置过期的数据集中,挑选最近最少使用的数据淘汰
- volatile-ttl:已设置过期的数据集中,挑选将要过期的数据淘汰
- volatile-random:已设置过期的数据集中,任意选择数据淘汰
- allkeys-lru:内存不足写入数据时,移除最近最少使用的key
- allkeys-random:从数据集中任意选择数据淘汰
- no-eviction:禁止驱逐数据,当内存不足写入数据时,报错
四、redis事务
通过MULTI、EXEC、WATCH实现事务功能
五、缓存雪崩、缓存穿透、缓存击穿
- 缓存雪崩
- 描述:指缓存中大批量到期时间key,查询数据量巨大,引得数据库压力大
- 解决方案
- 缓存数据过期时间设置随机
- 热点数据均匀分布在不同的缓存数据库中
- 设置热点数据【频繁查询的数据】永不过期
- 缓存穿透
- 描述:指缓存和数据库都没有的数据,用户不断发起请求这些不存在的数据
- 解决方案
- 接口层增加校验
- 第一次请求的数据在缓存和数据库都不存在,设置一个key到缓存30秒,避免同一个id暴力**
- 缓存击穿
- 描述:缓存中没有数据,但是数据库中有,并发数大,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力增大。
- 解决方案
- 设置热点数据永不过期
- 加互斥锁
- 拿缓存数据
- 不存在则拿锁,拿缓存数据,更新数据,释放锁
- 拿不到锁,先停下来冷静下为啥自己拿不到
- 拿缓存数据
六、redis并发竞争key
- 描述:多个系统同时对一个key操作,最后执行的顺序与期望的顺序不一样
- 解决方法:分布式锁【不存在并发竞争key时,不建议使用,会影响性能】,实践中,推荐Zookeeper
七、如何保证缓存与数据库双写时的数据一致性
经典:缓存+数据库读写模式,即Cache Aside Pattern(边缘缓存模式)
- 读的时候,先读缓存,缓存没有再读数据库,取出数据更新到缓存
- 更新的时候,先更新数据库,然后再删除缓存
剖析:为什么是删除缓存,而不是更新缓存?
复杂缓存场景,缓存不仅仅是数据库直接取出的值,另外,也许1分钟更新100次数据,但只获取了1次数据,那每次都更新缓存,会造成资源的浪费
八、redis适用场景
- 会话缓存(Session Cache)
- 登录态、购物车
- 全页缓存(FPC)
- 队列
- 排行榜/计数器
- 发布/订阅
- 分布式锁
九、redis支持的Java客户端
Redisson【官方推荐】、Jedis、lettuce
十、redis单线程还是多线程
必须的单线程,那为啥这么快?
- 完全基于内存
- 数据结构简单
- 采用单线程,避免了不必要的上下文切换和竞争条件
- 采用多路IO复用模型,非阻塞IO
- redis直接构建了VM机制
十一、redis主从架构
这里只记住哨兵先,后续学集群再回来补全。
Redis sentinel(哨兵):监控redis主从服务器,并在中服务器下线时自动进行故障转移
- 监控:sentinel会不断检查主服务器和从服务器是否正常
- 提醒:当监控某个redis服务器出现问题时,通向管理员或其他应用程序发送通知
- 自动故障迁移:当主服务不能正常工作时,sentinel开始一次自动故障迁移操作
优点和缺点
- 优点
- 保证高可用
- 监控每个节点
- 自动故障迁移
- 缺点
- 主从模式切换需要时间
- 没有解决master写的压力
十二、一个字符串类型的值能存储最大容量是多少
512M
十三、redis如何做内存优化
- 缩减key和value对象长度
- 共享对象池[0-9999],尽量使用整数对象以节省内存
- 字符串优化
- 编码优化
- 控制key数量
Redis入门教程