it编程 > 数据库 > Redis

Redis的缓存机制用法及说明

6人参与 2026-03-17 Redis

redis缓存介绍

在高并发的场景下,直接使用传统的面向内存的数据库,资源开销会非常大,性能也非常低,数据库服务器很容易崩溃。因此可以把一些经常用到的数据(热数据:使用频率很高,但是占总数据量较少)统一放到redis中,当客户端查询时,先查询redis,查询不到,再去查询数据库。

这便是redis缓存,它就像一个保护罩,为数据库抵达掉了大部分请求:

那么问题就来了:

以上便是我们接下来要讨论的问题。

缓存策略

1)定期生成

每个一定的周期,对于访问数据库数据的频率进行统计,选出前n%的数据,放到redis缓存中。

这种方式操作最简单,对于数据的掌控也更加稳定。缺点也很明显,就是时效性非常低。

2)实时生成

先给缓存设定容量上限(可以通过 redis 配置⽂件的 maxmemory 参数设定)。

接下来按照这个流程执行:

  1. 先从redis中查询,查到了直接返回
  2. 查不到从数据库中查,返回结果的同时,把这个数据写入redis

当缓存达到上线,我们根据可靠的缓存淘汰策略,删除redis中相对不那么“热”的数据。以此达到热数据的动态平衡。

3)缓存淘汰策略

包括但不限于redis,缓存淘汰策略基本上涵盖了以下这四点:

  1. fifo (first in first out) 先进先出
    把缓存中存在时间最久的 (也就是先来的数据) 淘汰掉
  2. lru (least recently used) 淘汰最久未使用的
    记录每个 key 的最近访问时间. 把最近访问时间最老的 key 淘汰掉
  3. lfu (least frequently used) 淘汰访问次数最少的
    记录每个 key 最近⼀段时间的访问次数. 把访问次数最少的淘汰掉
  4. random 随机淘汰
    从所有的 key 中抽取幸运⼉淘汰掉

redis中提供的缓存淘汰策略:

redis中的缓存淘汰策略也都是围绕lcu,lfu来进行的,只不过分为allkeys(全部数据)和volatile(设置过期时间的数据)

缓存中需要考虑的问题

1)缓存预热

试想以下,加入redis刚启动,里面还没有任何数据写入,那么发过来的请求,直接就进入到了数据库中,数据库仍然会面临很大的压力。

解决办法很简单,就是按照定期生成热数据的方式,把热数据先写入redsi。即使时效性不高,能为数据库(如mysql)抵挡大部分请求就可以。

2)缓存穿透 (cache penetration)

定义:

产生原因:

解决办法:

布隆过滤器

3)缓存雪崩(cache avalanche)

定义:

出现原因:

解决办法:

4) 缓存击穿(cache breakdown)

定义:

简单来说,就是某一个热点 key(比如双 11 的秒杀商品)在过期的瞬间,同时有海量的请求打过来。因为缓存失效了,这些请求会像洪流一样直接冲向数据库,可能导致数据库瞬间宕机。

处理这个问题,核心思路只有两个:不让请求全都去查数据库,或者干脆不让热点 key 过期

1. 设置互斥锁 (mutex lock)

这是最常用的方案。当缓存失效时,不是每个请求都去查数据库,而是先让请求尝试获取一个“锁”(通常用 redis 的 setnx 命令)。

2. 热点数据“永不过期”

从物理上或者逻辑上让这个 key 永远存在。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

您想发表意见!!点此发布评论

推荐阅读

Redis在jwt中作用小结

03-17

基于Redis Set轻松实现简单的抽奖系统

03-17

详解Redis终端操作和Redis-plus-plus接口使用教程

03-18

Redis+MQ高并发秒杀的技术方案与实现

03-13

Redis缓存雪崩原理、防御策略与工程实践指南

03-19

redis多级缓存的用法及说明

03-12

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论