JAVA面试(六)- 缓存
2026/9/19 13:08:06 网站建设 项目流程

缓存

  • Memcached
  • redis
    • Redis常见数据类型
    • Redis常见场景
    • Redis缓存持久化
      • RDB-快照
      • AOF-追加文件
    • Redis数据过期机制
      • 惰性删除
      • 定期删除
      • Redis缓存淘汰策略(8种)
        • 淘汰策略的算法
          • LRU (Least Recently Used):最近最少使用
          • LFU(Least Frequently Used):最近最少频率使用
        • 常见面试问题
    • Redis事务
    • Redis为什么要用分布式缓存
    • Redis集群
      • 主从模式 - 最简单的
      • 哨兵模式
      • Redis Cluster
    • Redis常见问题及解决方案
      • 缓存击穿
      • 缓存穿透
      • 缓存雪崩
      • bigKey
      • 热Key
      • ==慢查询命令==
      • 如何保障数据库和缓存数据的一致性
        • 延时双删
        • 异步更新缓存
      • 假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如果将它们全部找出来?
      • 什么情况下可能会导致 Redis 阻塞
      • 怎么提高缓存命中率
      • 怎么实现分布式锁
        • 基于redis命令
        • 基于redis Lua脚本
        • Redisson分布式锁
  • MongDB
  • 数据库点这里
  • 分布式点这里
  • 消息队列
  • Spring、SpringBoot、SpringCloud点这里

Memcached

简洁的key-value存储系统,其实是内存中维护一张巨大的Hash表。不支持集群,Memcached彼此之间不进行通信,所以,可能会造成数据丢失。
和redis对比

MemcachedRedis
数据类型只支持key-value
数据持久化Memcached 把数据全部存在内存之中Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
集群模式支持没有原生的集群模式3.0 版本起是原生支持集群模式的
线程模型多线程,非阻塞 IO 复用的网络模型单线程的多路 IO 复用模型
特性支持Redis 支持发布订阅模型、Lua 脚本、事务等功能
过期数据删除只用了惰性删除策略惰性删除策略、定期删除策略

redis

redis是一个缓存中间件。
数据基于内存,内存的访问速度比磁盘快很多
单线程,基于I/O多路复用

  • 6.0后支持多线程,但是命令执行还是单线程

Redis 除了可以用作缓存之外,还可以用于分布式锁、限流、消息队列、延时队列等>场景

  • 延时队列:Redisson 内置了延时队列(基于 Sorted Set 实现的)
  • 消息队列:Redis 自带的 List 数据结构可以作为一个简单的队列使用。(Rpush +Lpop)
    Redis 5.0 中增加的 Stream 类型的数据结构更加适合用来做消息队列。
  • 限流: 通过 Redis + Lua 脚本的方式来实现限流。key是ip,value是访问次数
  • redis搜索引擎:借助 RediSearch
  • redis延时任务

Redis常见数据类型

5 种基础数据类型

String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合)。

  • String,二进制安全的,可以存储图片或者序列化的对象,值最大存储为512M
    set key value
    get key
  • Hash
    hset key field value
    hget key field
  • List
    lpush key value [value ...]
    lrange key start end
  • Set(集合)
    sadd key element [element ...]
    smembers key
  • ZSet(有序集合)
    zadd key score member [score member ...]
    zrank key member

3 种特殊数据类型
HyperLogLog(基数统计)、Bitmap (位图)、Geospatial
(地理位置)。

除了上面提到的之外,还有一些其他的比如 Bloom filter(布隆过滤器)open in new
window、Bitfield(位域)。

Redis常见场景

应用:排行耪

选用ZSet,这是一个有序集合。根据score来排序
Zrange (从小到大排序)、 ZrevRange (从大到小排序)、ZrevRank (指定元素排名)。

Redis缓存持久化

注:Redis4.0版本之后,RDB 和 AOF 混合使用实现持久化

RDB-快照

定时将redis中的所有键值对数据保存到到一个临时文件中,这个文件就是dump.rdb文件。恢复时候将这个临时文件替换上次持久化的文件即可。

AOF-追加文件

每次操作命令时候,将这次的操作通过Write函数追加到文件中。恢复时候,会自动执行备份文件中的所有命令,达到恢复上次数据的效果。

总结:

  • RDB是默认持久化方式,当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。
  • 持久化机制: 当Redis重启后通过把硬盘文件重新加载到内存
  • 实现:单独创建fork()一个子进程,将当前父进程的数据库数据复制到子进程的内存中,然后由子进程写入到临时文件中,持久化的过程结束了,再用这个临时文件替换上次的快照文件,然后子进程退出,内存释放。

Redis数据过期机制

设置expire(过期时间)后才会触发。
Redis 采用的是 定期删除+惰性/懒汉式删除 结合的策略

惰性删除

当查询key时候,先看该key是否过期,没有过期就返回数据;负责,删除该key,且不返回数据

定期删除

在一定时间,随机抽取设置过期时间的key,若这些含的key大部分过期,就删除这些过期key

  • Redis 的定期删除过程是随机的(周期性地随机从设置了过期时间的 key 中抽查一批),所以并不保证所有过期键都会被立即删除。这也就解释了为什么有的 key 过期了,并没有被删除。

  • 并且,执行时间已经超过了阈值,那么就中断这一次定期删除循环,以避免使用过多的 CPU 时间

  • 可在配置文件中设置频率
    由 hz 参数控制的。hz 默认为 10,代表每秒执行 10 次

Redis缓存淘汰策略(8种)

当redis内存不够用的时候,当一个新key需要存放时候就会按某种规则将内存中的数据删掉,这个删除规则就是淘汰策略。

  • noeviction:默认策略。不删除任何key,新增的key也

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询