【1年Java面试资料整理】Redis-数据缓存

一、持久化机制

  • 机制:通过持久化机制把内存中的数据同步到硬盘文件。
  • 持久化方式(默认RDB,两者同时开启时,优先选择AOF恢复)
    • RDB:按一定时间策略保存数据内存快照,dump.rdb
      • 工作原理
        • Redis forks
        • 子进程写数据到临时RDB文件中
        • 新文件替换老文件

0

    • AOF:将每一个写命令追加到文件最后,类似mysql的binlog

0

0

二、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内存淘汰机制

  1. volatile-lru:已设置过期的数据集中,挑选最近最少使用的数据淘汰
  2. volatile-ttl:已设置过期的数据集中,挑选将要过期的数据淘汰
  3. volatile-random:已设置过期的数据集中,任意选择数据淘汰
  4. allkeys-lru:内存不足写入数据时,移除最近最少使用的key
  5. allkeys-random:从数据集中任意选择数据淘汰
  6. 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写的压力

0

十二、一个字符串类型的值能存储最大容量是多少

512M

十三、redis如何做内存优化

  • 缩减key和value对象长度
  • 共享对象池[0-9999],尽量使用整数对象以节省内存
  • 字符串优化
  • 编码优化
  • 控制key数量

Redis入门教程

https://www.bilibili.com/video/BV1EJ411g7Dy

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值