解决 Redis 缓存穿透的常见方法

阅读时长 3 分钟读完

什么是缓存穿透

缓存穿透指的是访问不存在的数据,导致大量请求落到了数据库上,造成数据库压力过大,甚至宕机。

攻击者可以利用这个漏洞进行大量恶意请求,对网站造成严重威胁。

Redis 的解决方案

为了避免缓存穿透,我们可以把 Redis 作为我们的一级缓存。当需要查询某个 key 的时候,先在 Redis 中查询,如果其不存在,则去查询数据库。

在这个过程中我们可以使用以下几个方法:

1. 布隆过滤器

布隆过滤器是一种简单、高效的数据结构,其可以用来判断一个元素是否存在于一个集合中。

通过使用布隆过滤器,我们可以在查询前判断该 key 是否存在于 Redis 中,如果不存在就直接返回,避免去查询数据库。

以下是示例代码:

-- -------------------- ---- -------
------ -----
---- ----------- ------ -----------

- - ----------------------------- ---------- -----

----- - --------------------------------- ----------------

--- --------------
    -- ------------------
        ------ ----------
    -----
        ----- - ----------------
        -- ----- -- --- -----
            ---------- ------
            --------------
        ------ -----

2. 缓存空值

当查询一个不存在的 key 时,我们可以在 Redis 中存储一个空值占位符,这样下次再查询这个 key 的时候就可以直接从缓存中返回。

以下是示例代码:

-- -------------------- ---- -------
--- --------------
    ----- - ----------
    -- ----- -- --- -----
        ------ -----
    ---- ----- -- ----
        ------ ----
    -----
        ----- - ----------------
        -- ----- -- --- -----
            ---------- ------
        -----
            ---------- ---
        ------ -----

3. 缓存雪崩

缓存雪崩指的是当缓存中大量的 key 同时过期导致的一种连锁反应,大量请求直接落到了数据库上,导致宕机。

为了避免缓存雪崩,我们可以给每个 key 设置一个不同的过期时间,这样可以避免在同一时间大量的 key 过期。

以下是示例代码:

-- -------------------- ---- -------
--- --------------
    ----- - ----------
    -- ----- -- --- -----
        ------ -----
    -----
        ----- - ----------------
        -- ----- -- --- -----
            ------------ ------------------ ---- ------
        ------ -----

总结

Redis 作为一级缓存可以有效避免缓存穿透的问题,但是在使用过程中还是需要注意缓存雪崩的问题。通过使用布隆过滤器、缓存空值和设置不同的过期时间等方法,可以大大提高应用系统的稳定性和安全性。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64670996968c7c53b07729a7

纠错
反馈