缓存穿透
缓存穿透是指在缓存中查找一个不存在的值,由于缓存一般不会存储这种无效的数据,所以每次查询都会落到数据库上,导致数据库压力增大,严重时可能会导致数据库宕机。
解决方案:
1 缓存空值 (本文此方案)
2 布隆过滤器
3 增强id的复杂度
4 做好数据的基础格式校验
5 做好热点参数的限流
缓存击穿
缓存击穿是指一个被频繁访问(高并发访问并且缓存重建业务较复杂)的缓存键因为过期失效,同时又有大量并发请求访问此键,导致请求直接落到数据库或后端服务上,增加了系统的负载并可能导致系统崩溃
解决方案
1 互斥锁
2 逻辑过期
1 前提先好做redis与springboot的集成,redisson的集成【用于加锁解锁】【本文用的redisson】
另外用到了hutool的依赖
2 缓存对象封装的类,这里只是逻辑过期方案可以用上,你也可以自己改
/**
* 决缓存击穿--(设置逻辑过期时间)
*/
@Data
public class RedisData {
//逻辑过期时间
private LocalDateTime expireTime;
//缓存实际的内容
private Object data;
}
3 相关的常量
public class Constant {
//缓存空值的ttl时间
public static final Long CACHE_NULL_TTL = 2L;
//缓存时间,单位程序里参数传
public static final Long CACHE_NEWS_TTL = 10L;
//缓存前缀,根据模块来
public static final String CACHE_NEWS_KEY = "cache:news:";
//锁-前缀,根据模块来
public static final String LOCK_NEWS_KEY = "lock:news:";
//持有锁的时间
public static final Long LOCK_TTL = 10L;
}
4 缓存核心类
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import static org.example.service_a.cache.Constant.CACHE_NULL_TTL;
import static org.example.service_a.cache.Constant.LOCK_NEWS_KEY;
@Slf4j
@Component
//封装的将Java对象存进redis 的工具类
public class CacheClient {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Autowired
private RedissonClient redissonClient;
// 定义线程池
private static final ExecutorService CACHE_REBUILD_EXECUTOR = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
AtomicInteger atomicInteger = new AtomicInteger();
/**
* 设置TTL过期时间set
*
* @param key
* @param value
* @param time
* @param unit
*/
public void set(String key, Obj

最低0.47元/天 解锁文章
1995

被折叠的 条评论
为什么被折叠?



