使用Redis实现缓存穿透的解决方案

简介: 使用Redis实现缓存穿透的解决方案
使用Redis实现缓存穿透的解决方案

缓存系统中,缓存穿透是指访问不存在的数据,导致请求直接穿透缓存层,直接访问数据库,造成数据库压力过大,甚至影响系统稳定性。本文将深入探讨如何使用Redis实现有效的缓存穿透解决方案。

1. 基本概念和问题背景

缓存穿透通常发生在恶意攻击或者大量请求查询不存在的数据时。例如,某些恶意用户不断查询不存在的用户信息,导致每次请求都要访问数据库,严重影响系统性能。为了解决这个问题,我们可以引入布隆过滤器和空值缓存等技术手段。

2. 使用布隆过滤器过滤无效请求

布隆过滤器是一种高效的数据结构,用于快速判断一个元素是否存在于集合中。在缓存层加入布隆过滤器,可以快速过滤掉不存在的请求,避免对数据库的直接查询。

package cn.juwatech.example;
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
@Service
public class BloomFilterService {
    @Autowired
    private RedisService redisService;
    private BloomFilter<String> bloomFilter;
    @PostConstruct
    public void init() {
        int expectedInsertions = 1000000;
        double fpp = 0.01; // False Positive Probability
        bloomFilter = BloomFilter.create(Funnels.stringFunnel(), expectedInsertions, fpp);
    }
    public boolean mightContain(String key) {
        return bloomFilter.mightContain(key);
    }
    public void put(String key) {
        bloomFilter.put(key);
    }
}
3. 空值缓存策略

当查询的数据确实不存在时,不直接访问数据库,而是将空结果设置到缓存中,设置合理的过期时间,避免空值缓存过久占用内存资源。

package cn.juwatech.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
@Service
public class CacheService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    public Object get(String key) {
        return redisTemplate.opsForValue().get(key);
    }
    public void set(String key, Object value, long timeout, TimeUnit unit) {
        redisTemplate.opsForValue().set(key, value, timeout, unit);
    }
    public void setNull(String key, long timeout, TimeUnit unit) {
        redisTemplate.opsForValue().set(key, "", timeout, unit); // Placeholder for null value
    }
    public boolean exists(String key) {
        return redisTemplate.hasKey(key);
    }
}
4. 实现缓存穿透解决方案

结合布隆过滤器和空值缓存策略,实现完整的缓存穿透解决方案。在查询前先通过布隆过滤器判断是否存在于缓存中,如果存在则直接返回缓存数据;如果不存在,则进行数据库查询,查询结果为空时设置空值缓存,并设置较短的过期时间,避免重复查询。

package cn.juwatech.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
@Service
public class DataService {
    @Autowired
    private CacheService cacheService;
    @Autowired
    private DatabaseService databaseService;
    @Autowired
    private BloomFilterService bloomFilterService;
    public Object getData(String key) {
        if (bloomFilterService.mightContain(key)) {
            if (cacheService.exists(key)) {
                return cacheService.get(key);
            } else {
                Object data = databaseService.getData(key);
                if (data != null) {
                    cacheService.set(key, data, 10, TimeUnit.MINUTES); // Example: cache for 10 minutes
                    return data;
                } else {
                    cacheService.setNull(key, 1, TimeUnit.MINUTES); // Example: cache null value for 1 minute
                    return null;
                }
            }
        } else {
            return null; // Request not in bloom filter, likely invalid
        }
    }
}

通过以上实现,我们能够有效地解决缓存穿透问题,提升系统的性能和稳定性,确保对数据库的请求能够得到有效地缓存和利用。

相关文章
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
10月前
|
缓存 负载均衡 监控
135_负载均衡:Redis缓存 - 提高缓存命中率的配置与最佳实践
在现代大型语言模型(LLM)部署架构中,缓存系统扮演着至关重要的角色。随着LLM应用规模的不断扩大和用户需求的持续增长,如何构建高效、可靠的缓存架构成为系统性能优化的核心挑战。Redis作为业界领先的内存数据库,因其高性能、丰富的数据结构和灵活的配置选项,已成为LLM部署中首选的缓存解决方案。
928 25
|
11月前
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
419 1
Redis专题-实战篇二-商户查询缓存
|
10月前
|
缓存 运维 监控
Redis 7.0 高性能缓存架构设计与优化
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Redis 7.0高性能缓存架构,探索函数化编程、多层缓存、集群优化与分片消息系统,用代码在二进制星河中谱写极客诗篇。
1845 3
|
11月前
|
缓存 NoSQL 关系型数据库
Redis缓存和分布式锁
Redis 是一种高性能的键值存储系统,广泛用于缓存、消息队列和内存数据库。其典型应用包括缓解关系型数据库压力,通过缓存热点数据提高查询效率,支持高并发访问。此外,Redis 还可用于实现分布式锁,解决分布式系统中的资源竞争问题。文章还探讨了缓存的更新策略、缓存穿透与雪崩的解决方案,以及 Redlock 算法等关键技术。
|
存储 缓存 NoSQL
Spring Boot2.5 实战 MongoDB 与高并发 Redis 缓存|学习笔记
快速学习 Spring Boot2.5 实战 MongoDB 与高并发 Redis 缓存
Spring Boot2.5 实战 MongoDB 与高并发 Redis 缓存|学习笔记
|
缓存 NoSQL 安全
6.0Spring Boot 2.0实战 Redis 分布式缓存6.0|学习笔记
快速学习6.0Spring Boot 2.0实战 Redis 分布式缓存6.0。
701 0
6.0Spring Boot 2.0实战 Redis 分布式缓存6.0|学习笔记
|
缓存 NoSQL Redis
首页数据显示-添加 redis 缓存(3)| 学习笔记
快速学习 首页数据显示-添加 redis 缓存(3)
338 0
首页数据显示-添加 redis 缓存(3)| 学习笔记
|
缓存 NoSQL Java
首页数据显示-添加 redis 缓存(1) | 学习笔记
快速学习 首页数据显示-添加 redis 缓存(1)
423 0
首页数据显示-添加 redis 缓存(1) | 学习笔记
|
存储 缓存 NoSQL
Redis 缓存|学习笔记
快速学习Redis 缓存
297 0