如果查询数据库也为空,直接设置一个默认值存放到缓存,这样第二次到缓存中获取就有值了,而不会继续访问数据库,这种办法最简单粗暴。
把空结果也给缓存起来,这样下次同让的请求就可以直接返回空了,既可以避免当查询的值为空时引起的缓存穿透。
同时也可以单独设置个缓存区域存储空值,对要查询的key进行预先校验,然后再放行给后面的正常缓存处理逻辑。
public String getByUsers2(Long id) {
// 1.先查询redis
String key = this.getClass().getName() + "-" + Thread.currentThread().getStackTrace()
[1].getMethodName()+ "-id:" + id;
String userName = redisService.getString(key);
if (!StringUtils.isEmpty(userName)) {
return userName;
}
System.out.println("######开始发送数据库DB请求########");
Users user = userMapper.getUser(id);
String value = null;
if (user == null) {
// 标识为null
value = "";
} else {
value = user.getName();
}
redisService.setString(key, value);
return value;
}
复制
对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常"热点"的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题,这个和缓存雪崩的区别在于这里针对某一个key缓存,前者则是很多key。
使用锁,单机使用synchronized,lock等,分布式用分布式锁。
缓存过期时间不设置,而是设置在key对应的value里。
如果检测到存的时间超过过期时间则异步更新缓存。
文章转载自东神殿下,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
国产非关系型数据库 Eloqkv 初体验
JiekeXu
132次阅读
2025-04-10 23:51:35
融合Redis缓存的PostgreSQL高可用架构
梧桐
86次阅读
2025-04-08 06:35:40
Redis概要
听溪
38次阅读
2025-04-11 10:23:10
安装与配置Redis
鲁鲁
33次阅读
2025-04-11 10:26:10
Redis数据库——Cluster集群模式
编程Cookbook
28次阅读
2025-04-16 15:34:44
使用Jedis访问Redis数据库
怀念和想念
27次阅读
2025-04-11 15:08:30
Redis geo 实战:“附近的人”实现,打造社交的新维度
老王两点中
26次阅读
2025-04-11 09:02:30
Redis改协议内幕曝光!核心开发者亲述被“踢出局”,外部贡献者几乎全跑光了!
老鱼笔记
24次阅读
2025-04-17 10:41:56
Redis提供的持久化机制
luyingjun
23次阅读
2025-04-11 15:11:05
Redis
鲁鲁
21次阅读
2025-04-07 20:14:35