Java面试题 P17:Redis篇:Redis使用场景-缓存-缓存击穿
什么是缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把数据库压垮。
互斥锁代码:
1 package com.atguigu.boot00testredis.controller; 2 3 import com.atguigu.boot00testredis.utils.RedisUtil; 4 import org.springframework.beans.factory.annotation.Autowired; 5 import org.springframework.web.bind.annotation.GetMapping; 6 import org.springframework.web.bind.annotation.PathVariable; 7 import org.springframework.web.bind.annotation.RequestMapping; 8 import org.springframework.web.bind.annotation.RestController; 9 10 import java.util.concurrent.locks.Lock; 11 import java.util.concurrent.locks.ReadWriteLock; 12 import java.util.concurrent.locks.ReentrantReadWriteLock; 13 14 @RestController 15 @RequestMapping("/hello") 16 public class HelloController 17 { 18 /** 19 * 注入redis工具 20 */ 21 @Autowired 22 private RedisUtil redisUtil; 23 24 private final ReadWriteLock readWriteLock=new ReentrantReadWriteLock(); 25 //写锁 26 private final Lock writeLock=readWriteLock.writeLock(); 27 28 @GetMapping("/hi/{name}") 29 public String hi(@PathVariable("name") String name) 30 { 31 System.out.println("name="+name); 32 33 if(redisUtil.get(name)!=null) 34 { 35 return redisUtil.get(name).toString(); 36 } 37 else { 38 //加锁 39 writeLock.lock(); 40 System.out.println("readLock......."); 41 try{ 42 Thread.sleep(20*1000); 43 redisUtil.set(name,"My name is "+name+"!",60); 44 return redisUtil.get(name).toString(); 45 } 46 catch (Exception e) 47 { 48 return null; 49 } 50 finally { 51 //开锁 52 writeLock.unlock(); 53 } 54 } 55 } 56 }
分类:
Java / Java面试题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理