缓存击穿 我们设置了过期时间的key,如果这些key可能在某些时间点被超高并发地访问,恰好在这个时间点某个key缓存过期,有大量的并发请求过来,这些请求发现缓存过期就会从后端DB加载数据并重新set到缓存中,这个时间大并发的请求可能会瞬间把后端DB压垮。 解决方案 我们的目标是:尽量少的线程去查询数据重新set到缓存中并且要满足数据一致性; 1.使用互斥锁:
实现方式如下:
public void get(String key) { String value = jedis.get(key); if (value == null) { if (jedis.setnx(key_nx, "1")) { jedis.expire(key_nx, 3 * 60); value = db.get(key); jedis.set(key, value); jedis.delete(key_nx); } else { //其他线程休息50毫秒后重试 Thread.sleep(50); get(key); } } }