电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

springboot中redis的緩存穿透問題實(shí)現(xiàn)

瀏覽:5日期:2023-03-25 17:00:02
什么是緩存穿透問題??

我們使用redis是為了減少數(shù)據(jù)庫(kù)的壓力,讓盡量多的請(qǐng)求去承壓能力比較大的redis,而不是數(shù)據(jù)庫(kù)。但是高并發(fā)條件下,可能會(huì)在redis還沒有緩存的時(shí)候,大量的請(qǐng)求同時(shí)進(jìn)入,導(dǎo)致一大批的請(qǐng)求直奔數(shù)據(jù)庫(kù),而不會(huì)經(jīng)過redis。使用代碼模擬緩存穿透問題如下:

首先是service里面的代碼:

@Servicepublic class NewsService { @Autowired private NewsDAO newsDAO; //springboot自動(dòng)初始化,不需要我們進(jìn)行配置,直接注入到代碼中使用 @Autowired private RedisTemplate<Object,Object> redisTemplate; public /*synchronized*/ List<News> getLatestNews(int userId,int offset,int limit){ //設(shè)置序列化方式,防止亂碼 redisTemplate.setKeySerializer(new StringRedisSerializer()); //第一步:查詢緩存 News news= (News) redisTemplate.opsForValue().get('newsKey'); //判斷是否存在緩存 if(null == news){//查詢數(shù)據(jù)庫(kù)news = newsDAO.selectByUserIdAndOffset(userId,offset,limit).get(0);//redisTemplate.opsForValue().set('newsKey',news);System.out.println('進(jìn)入數(shù)據(jù)庫(kù)。。。。。。。。'); }else{ System.out.println('進(jìn)入緩存。。。。。。。。。'); } return newsDAO.selectByUserIdAndOffset(userId,offset,limit); }}

然后是使用線程池在Controller里面對(duì)請(qǐng)求進(jìn)行模擬:

@Controllerpublic class HomeController { @Autowired UserService userService; @Autowired NewsService newsService; //遇到的坑,如果不加method,頁(yè)面啟動(dòng)不起來。 @RequestMapping(value = '/home',method = {RequestMethod.GET, RequestMethod.POST}) @ResponseBody public String index(Model model){ //這邊是可以讀出數(shù)據(jù)來的 //線程池------緩存穿透問題的復(fù)現(xiàn) ExecutorService executorService = Executors.newFixedThreadPool(8*2); for(int i = 0;i < 50000;i++){ executorService.submit(new Runnable() {@Overridepublic void run() { List<News> newsList = newsService.getLatestNews(0,0,10);} }); } List<News> newsList = newsService.getLatestNews(0,0,10); News news=newsList.get(0); return news.getImage(); }}

結(jié)果如圖:大量的請(qǐng)求進(jìn)入數(shù)據(jù)庫(kù),那么如何解決這個(gè)問題?

springboot中redis的緩存穿透問題實(shí)現(xiàn)

方法一、在方法上加鎖:

@Servicepublic class NewsService { @Autowired private NewsDAO newsDAO; //springboot自動(dòng)初始化,不需要我們進(jìn)行配置,直接注入到代碼中使用 @Autowired private RedisTemplate<Object,Object> redisTemplate; //第一種方式:方法加鎖 public synchronized List<News> getLatestNews(int userId,int offset,int limit){ //設(shè)置序列化方式,防止亂碼 redisTemplate.setKeySerializer(new StringRedisSerializer()); //第一步:查詢緩存 News news= (News) redisTemplate.opsForValue().get('newsKey'); //判斷是否存在緩存 if(null == news){//查詢數(shù)據(jù)庫(kù)news = newsDAO.selectByUserIdAndOffset(userId,offset,limit).get(0);//redisTemplate.opsForValue().set('newsKey',news);System.out.println('進(jìn)入數(shù)據(jù)庫(kù)。。。。。。。。'); }else{ System.out.println('進(jìn)入緩存。。。。。。。。。'); } return newsDAO.selectByUserIdAndOffset(userId,offset,limit); }}

直接在方法上加鎖,保證每次只有一個(gè)請(qǐng)求可以進(jìn)入。但是這個(gè)方法存在一個(gè)缺陷,每次只有一個(gè)請(qǐng)求可以進(jìn)入,請(qǐng)求處理的速度變得相當(dāng)?shù)穆?,不利于系統(tǒng)的實(shí)時(shí)性。

方法二、使用雙重校驗(yàn)鎖:

@Servicepublic class NewsService { @Autowired private NewsDAO newsDAO; //springboot自動(dòng)初始化,不需要我們進(jìn)行配置,直接注入到代碼中使用 @Autowired private RedisTemplate<Object,Object> redisTemplate; //第一種方式:方法加鎖 public /*synchronized*/ List<News> getLatestNews(int userId,int offset,int limit){ //設(shè)置序列化方式,防止亂碼 redisTemplate.setKeySerializer(new StringRedisSerializer()); //第一步:查詢緩存 News news= (News) redisTemplate.opsForValue().get('newsKey'); //判斷是否存在緩存 if(null == news){ //第二種方式:雙重檢測(cè)鎖 synchronized (this){//查詢數(shù)據(jù)庫(kù)news = newsDAO.selectByUserIdAndOffset(userId,offset,limit).get(0);//redisTemplate.opsForValue().set('newsKey',news);System.out.println('進(jìn)入數(shù)據(jù)庫(kù)。。。。。。。。'); } }else{ System.out.println('進(jìn)入緩存。。。。。。。。。'); } return newsDAO.selectByUserIdAndOffset(userId,offset,limit); }}

這個(gè)方法比較好,雖然不能保證只有一個(gè)請(qǐng)求請(qǐng)求數(shù)據(jù)庫(kù),但是當(dāng)?shù)谝慌?qǐng)求進(jìn)來,第二批之后的所有請(qǐng)求全部會(huì)在緩存取數(shù)據(jù)。

到此這篇關(guān)于springboot中redis的緩存穿透問題實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)springboot redis緩存穿透內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 北京网站建设-企业网站建设-建站公司-做网站-北京良言多米网络公司 | 彩信群发_群发彩信软件_视频短信营销平台-达信通 | 机制砂选粉机_砂石选粉机厂家-盐城市助成粉磨科技有限公司 | 袋式过滤器,自清洗过滤器,保安过滤器,篮式过滤器,气体过滤器,全自动过滤器,反冲洗过滤器,管道过滤器,无锡驰业环保科技有限公司 | 塑料检查井_双扣聚氯乙烯增强管_双壁波纹管-河南中盈塑料制品有限公司 | PE拉伸缠绕膜,拉伸缠绕膜厂家,纳米缠绕膜-山东凯祥包装 | 深圳VI设计-画册设计-LOGO设计-包装设计-品牌策划公司-[智睿画册设计公司] | 金属管浮子流量计_金属转子流量计厂家-淮安润中仪表科技有限公司 | 气弹簧定制-气动杆-可控气弹簧-不锈钢阻尼器-工业气弹簧-可调节气弹簧厂家-常州巨腾气弹簧供应商 | 不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰]-不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰] | 杜甫仪器官网|实验室平行反应器|升降水浴锅|台式低温循环泵 | 芝麻黑-芝麻黑石材厂家-永峰石业| 合肥汽车充电桩_安徽充电桩_电动交流充电桩厂家_安徽科帝新能源科技有限公司 | 硅胶布|电磁炉垫片|特氟龙胶带-江苏浩天复合材料有限公司 | 纸箱抗压机,拉力机,脂肪测定仪,定氮仪-山东德瑞克仪器有限公司 | 电磁流量计_智能防腐防爆管道式计量表-金湖凯铭仪表有限公司 | 翰墨AI智能写作助手官网_人工智能问答在线AI写作免费一键生成 | 武汉刮刮奖_刮刮卡印刷厂_为企业提供门票印刷_武汉合格证印刷_现金劵代金券印刷制作 - 武汉泽雅印刷有限公司 | HDPE土工膜,复合土工膜,防渗膜价格,土工膜厂家-山东新路通工程材料有限公司 | 代办建筑资质升级-建筑资质延期就找上海国信启航 | 无菌水质袋-NASCO食品无菌袋-Whirl-Pak无菌采样袋-深圳市慧普德贸易有限公司 | 深圳美安可自动化设备有限公司,喷码机,定制喷码机,二维码喷码机,深圳喷码机,纸箱喷码机,东莞喷码机 UV喷码机,日期喷码机,鸡蛋喷码机,管芯喷码机,管内壁喷码机,喷码机厂家 | 移动机器人产业联盟官网 | 工业硝酸钠,硝酸钠厂家-淄博「文海工贸」 | 车充外壳,车载充电器外壳,车载点烟器外壳,点烟器连接头,旅行充充电器外壳,手机充电器外壳,深圳市华科达塑胶五金有限公司 | 耐高温电缆厂家-远洋高温电缆| 立刷【微电签pos机】-嘉联支付立刷运营中心| 软瓷_柔性面砖_软瓷砖_柔性石材_MCM软瓷厂家_湖北博悦佳软瓷 | 多米诺-多米诺世界纪录团队-多米诺世界-多米诺团队培训-多米诺公关活动-多米诺创意广告-多米诺大型表演-多米诺专业赛事 | 宝元数控系统|对刀仪厂家|东莞机器人控制系统|东莞安川伺服-【鑫天驰智能科技】 | 临时厕所租赁_玻璃钢厕所租赁_蹲式|坐式厕所出租-北京慧海通 | 申江储气罐厂家,储气罐批发价格,储气罐规格-上海申江压力容器有限公司(厂) | 磁力加热搅拌器-多工位|大功率|数显恒温磁力搅拌器-司乐仪器官网 | 四川成都干燥设备_回转筒干燥机_脉冲除尘器_输送设备_热风炉_成都川工星科机电设备有限公司 | 杭州中策电线|中策电缆|中策电线|杭州中策电缆|杭州中策电缆永通集团有限公司 | 上海新光明泵业制造有限公司-电动隔膜泵,气动隔膜泵,卧式|立式离心泵厂家 | 福建珂朗雅装饰材料有限公司「官方网站」| 护腰带生产厂家_磁石_医用_热压护腰_登山护膝_背姿矫正带_保健护具_医疗护具-衡水港盛 | 招商帮-一站式网络营销服务|搜索营销推广|信息流推广|短视视频营销推广|互联网整合营销|网络推广代运营|招商帮企业招商好帮手 | 游泳池设备安装工程_恒温泳池设备_儿童游泳池设备厂家_游泳池水处理设备-东莞市君达泳池设备有限公司 | TPU薄膜_TPU薄膜生产厂家_TPU热熔胶膜厂家定制_鑫亘环保科技(深圳)有限公司 |