最新要闻
- 百事通!河南安阳一楼盘推出0首付0月供购房,这是什么操作?
- 交个朋友陷恶意裁员风波 没有了罗永浩还能走多远
- 世界快资讯丨口碑又崩了 漫威大片《蚁人3》豆瓣开分6.4:量子力学也带不动
- 【世界快播报】红旗接入百度AI文心一言 打造国产豪车品牌标杆
- 【当前独家】物理老师用《塞尔达传说:荒野之息》讲解小船过河原理:林克听了都说好!
- 世界头条:144MB缓存游戏神U!锐龙9 7950X3D跑分首曝:果然不出所料
- 每日热门:小米13 Ultra渲染图曝光:中分造型四摄
- 千万小心二手RTX 20显卡!新套路出现:黑片秒变白片
- 日本MRJ刚失败 印度也要自研国产飞机:可载100人
- 女子第一次打到无人驾驶网约车:十分激动
- 每日热门:支持30+种中外语言!搜狗输入法力挺麒麟OS
- 世界微头条丨网站设计师招聘_网站设计师
- 每片5.5元!绿联苹果钢化膜促销:适用iPhone 14/13/12系列
- 每日视讯:河南发布电动车佩戴头盔规定草案:未戴拒不改正罚20元
- 全球观天下!苦等3年微软终于点头:苹果M1/M2 Mac正式支持运行Win11
- 天天短讯!李荣浩新歌《乌梅子酱》火了!乌梅子酱淘宝搜索量暴涨200倍
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
自命为缓存之王的Caffeine(6)
您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~
之前用Caffeine替代Redis的时候,发现先保存KV,再获取key,过期时间为3秒。但即使过了3秒,还是能获取到保存的数据。这是为什么呢?因为之前在整合SpringBoot时,使用的是注解方式,在配置文件中已经定死了Caffeine的过期时间。
## Caffeine
(资料图片仅供参考)
spring.cache.cache-names=test
spring.cache.type=caffeine
spring.cache.caffeine.spec=initialCapacity=50,maximumSize=500,expireAfterWrite=300s
就是因为这里的expireAfterWrite=300s导致数据3秒后不能清除。经过测试,发现果然是300秒后Caffeine过期。
使用注解式的Caffeine,应用一旦启动,是无法动态调整过期时间的,必然与MongoDB时间不同步。
进一步延伸思考:Caffeine是没有持久化功能的,所以当应用重新启动的时候,上一次为Caffeine设置的过期时间会被重置。因此Caffeine + MongoDB替代Redis存储Token其实需要解决一个很关键的问题:MongoDB和Caffeine过期时间的同步问题,也就是Caffeine的过期时间要能够灵活调整的问题。
所以,需要放弃注解式Caffeine,使用自定义LoadingCache。当MongoDB保存时,就要同步到Caffeine。而当应用重启时,就要重新同步Caffeine。
修改CacheDao,增加LoadingCache定义:
1 private static LoadingCacheloadingCache = null; 2 3 /** 4 * 自定义LoadingCache,指定过期时间expiretime 5 * 6 */ 7 private LoadingCache initCache(long expiretime) { 8 return Caffeine.newBuilder() 9 .initialCapacity(1)10 .maximumSize(100)11 .expireAfterWrite(expiretime, TimeUnit.MILLISECONDS)12 .build(key -> {13 // 没有数据或过期时返回null14 return null;15 });16 }
注意:时间单位是TimeUnit.MILLISECONDS,搞错了就看不到效果了。
修改saveObject()方法:
1 /** 2 * 保存时,需要增加过期时间,方便同步到Caffeine 3 * 4 * @param key 5 * @param value 6 * @param expiretime 7 * @return 8 */ 9 public boolean saveObject(final String key, final String value, final long expiretime) {10 Query query = new Query(Criteria.where("key").is(key));11 Update update = new Update();12 long time = System.currentTimeMillis();13 update.set("key", key);14 update.set("value", value);15 update.set("time", time);16 try {17 UpdateResult result = mongoTemplate.upsert(query, update, Cache.class);18 if (result.wasAcknowledged()) {19 // 同步到Caffeie20 loadingCache = initCache(expiretime * 1000);21 loadingCache.put(key, value);22 return true;23 }24 } catch (Exception e) {25 e.printStackTrace();26 }27 return false;28 }
注意其中的同步到Caffeine那两行。
最后,修改getObject()——重点来了!这是最关键的一步,应用重启之后还能否和MongoDB保持时间同步,就在于它了:
1 // expiretime指的是从存储到失效之间的时间间隔,单位毫秒 2 public String getObject(final String key, final long expiretime) { 3 String result = null; 4 // loadingCache不为空说明之前已经同步过了,可以直接读取它的值 5 if (null != loadingCache) { 6 result = loadingCache.get(key); 7 if (null != result) { 8 // 读取到值时,直接返回,读取不到就去mongodb读取 9 return result;10 }11 }12 Query query = new Query(Criteria.where("key").is(key));13 Cache cache = (Cache) mongoTemplate.findOne(query, Cache.class);14 System.out.println("getObject(" + key + ", " + expiretime + ") from mongo");15 16 if (null != cache) {17 // -1表示永不过期18 if (-1 == expiretime) {19 return cache.getValue();20 }21 // 如果当前时间 - 存储cache时的时间 >= 过期间隔22 long currentTtime = System.currentTimeMillis();23 if (currentTtime - cache.getTime() >= expiretime * 1000) {24 // 删除key,并返回null25 removeObject(key);26 } else {27 /**28 * 需要计算出当前时间与过期时间之间的差值,并赋予Caffeine的失效时间29 * 计算过程分析:30 * 保存时间:00:0031 * 当前时间:00:0332 * 过期时间:10秒33 * 那么第一次读取时需要将剩余的7秒赋给Caffeine34 */35 if (null == loadingCache) {// loadingCache==null说明loadingCache需要同步36 loadingCache = initCache(expiretime * 1000 - (currentTtime - cache.getTime()));37 loadingCache.put(key, cache.getValue());38 }39 return cache.getValue();40 }41 }42 return null;43 }
由于保存时增加了过期时间,Service和Controller也要修改:
1 /** 2 * 缓存Service接口 3 * 4 * @author 湘王 5 */ 6 @Service 7 public class CacheService { 8 @Autowired 9 private CacheDaocacheDao;10 11 public String getObject(final String key, final long expiretime) {12 return cacheDao.getObject(key, expiretime);13 }14 15 /**16 * 增加了过期时间expiretime17 *18 * @param key19 * @param value20 * @param expiretime21 * @return22 */23 public boolean saveObject(final String key, final String value, final long expiretime) {24 return cacheDao.saveObject(key, value, expiretime);25 }26 27 public boolean removeObject(final String key) {28 return cacheDao.removeObject(key);29 }30 }
1 /** 2 * Cache控制器 3 * 4 * 湘王 5 */ 6 @RestController 7 public class CacheController { 8 @Autowired 9 private CacheService cacheService;10 11 /**12 * 增加了过期时间expiretime13 *14 * @param key15 * @param value16 * @param expiretime17 */18 @GetMapping("/cache/save")19 public void save(final String key, final String value, final int expiretime) {20 cacheService.saveObject(key, value, expiretime);21 }22 23 // 获取数据,过期时间为秒(会转换为毫秒)24 @GetMapping("/cache/get")25 public String get(final String key, final int expiretime) {26 String result = cacheService.getObject(key, expiretime);27 if (null == result) {28 return "expire value";29 }30 return result;31 }32 }
修改后测试:
1、启动应用,通过save()保存,再通过get()读取,有效;
2、启动应用,通过get()读取,读取不到值(因为未设置),有效;
3、启动应用,通过save()保存,停止服务并稍后重启(可以在过期时间内重启,也可以在过期时间外重启):
3.1、通过get()读取,如果是在有效期内,能够读取到值,有效;
3.2、通过get()读取,如果超过有效期,就读取不到值了,有效。
感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~
-
MyBatis-Plus (SpringBoot2 版) Learning Day01
Day01学习任务了解Mybatis-Plus整合Mybatis-Plus通用CRUDMybatis-Plus的配置条件构造器1、了解Mybatis-plus1 1、Mybatis
来源: 自命为缓存之王的Caffeine(6)
MyBatis-Plus (SpringBoot2 版) Learning Day01
百事通!河南安阳一楼盘推出0首付0月供购房,这是什么操作?
交个朋友陷恶意裁员风波 没有了罗永浩还能走多远
世界快资讯丨口碑又崩了 漫威大片《蚁人3》豆瓣开分6.4:量子力学也带不动
【世界快播报】红旗接入百度AI文心一言 打造国产豪车品牌标杆
【当前独家】物理老师用《塞尔达传说:荒野之息》讲解小船过河原理:林克听了都说好!
世界头条:144MB缓存游戏神U!锐龙9 7950X3D跑分首曝:果然不出所料
每日热门:小米13 Ultra渲染图曝光:中分造型四摄
世界观热点:剪绳子问题 之动态规划 及 大数越界情况下的求余问题
千万小心二手RTX 20显卡!新套路出现:黑片秒变白片
日本MRJ刚失败 印度也要自研国产飞机:可载100人
女子第一次打到无人驾驶网约车:十分激动
每日热门:支持30+种中外语言!搜狗输入法力挺麒麟OS
世界微头条丨网站设计师招聘_网站设计师
世界热点!3、TreeMap源码解析
每片5.5元!绿联苹果钢化膜促销:适用iPhone 14/13/12系列
每日视讯:河南发布电动车佩戴头盔规定草案:未戴拒不改正罚20元
全球观天下!苦等3年微软终于点头:苹果M1/M2 Mac正式支持运行Win11
天天短讯!李荣浩新歌《乌梅子酱》火了!乌梅子酱淘宝搜索量暴涨200倍
新资讯:1999元!小米米家智能除湿机50L发布:100平除湿 梅雨季不怕了
当前信息:阿里一面:谈一下你对DDD的理解?2W字,帮你实现DDD自由
看热讯:关于ChatGPT,我们到底在担心什么?
【世界新要闻】在centos stream 9上搭建k8s最新版本(当前:v1.26.1)集群环境
【环球热闻】云原生学习作业8
天天新消息丨本周盘点(2.13-2.17):永吉股份周跌2.30%,主力资金合计净流出1796.91万元
每日看点!三年之期已到 不换APP享受自由音乐的理想国还有多远?
诗与远方
天天快消息!男子初到上海见转弯扶梯被震撼 网友看呆:同没见过
6999元!爱玛联名雷神发布HERO限量款机车:2500W电机 一键弹射
张纪中回应张颂文沙漠捡垃圾被剧组丢下:请理性看待
ESXi Args勒索病毒来袭,VMware ESXi用户需提高警惕
2、HashMap源码分析
观热点:使用springboot cache + redis缓存时使用gzip压缩以提升性能
天天最新:微凸铜底设计!微星CORELIQUID M360散热器图赏
当前视讯!美俄亥俄州居民嘴唇变色脸上起红斑 官方称空气水质安全:小溪全是死鱼 污染超百公里
全球快资讯丨iPhone 15 Pro外观无悬念了!关键是价格会更贵
《生化危机4:重制版》新细节:艾达王将扮演重要角色
蚌埠住了!iPhone 18 Pro背面设计来了 堪称行星发动机
世界今日报丨2023湖南新能源汽车置换促销补贴怎么领取
如何用chatGPT、代理IP和网络爬虫,打造一个智能有趣的聊天机器人?
环球新动态:数据结构刷题2023.02.17小记
分享7个刺激的老司机网站,别轻易点开
天天观察:乐维百科:什么是IT监控?为什么运维需要监控?
今日最新!正式抛弃 Feign!Spring 6 推出新特性:HTTP Interface,这波太秀了!
环球速看:2023年保定住房贷款利息个税专项附加扣除政策
《中国乒乓之绝地反击》今日正式上映:邓超、吴京演绎男乒至暗时刻
【世界聚看点】0脂无糖 舌里全麦面包14.9元2斤40片大促
你还会吃吗?女子用1元成本做出即食燕窝:呼吁别被智商税
今日热搜:车厂突然破产 几十万车主有点慌:修车配件全国找
真我GT Neo5 1TB版秒罄!徐起否认饥饿营销:需求量太大
天天微速讯:常见的个人博客搭建部署方案
焦点速递!SpringBoot
2023年跳槽,.NET工程师们,准备好了吗?
徐鸿平
快看点丨努比亚首款AR眼镜官宣:将亮相MWC 2023
全球动态:更耐摔?苹果上架iPhone 14 Pro屏幕保护膜:348元买吗
焦点快播:女车主买奇瑞QQ冰淇淋电动车一天坏3次!4S店承认故障 退车
天天速读:3月见!魅族20系列宣布首发无界生态系统Flyme 10
Reno时隔4年再度回归潜望长焦!OPPO Reno 10系列曝光
有个n字的鞋子是什么牌子?国产运动品牌有哪些?
贡菜是什么菜?贡菜的功效与作用是什么?
四王下山管天下是哪四个王?四王下山管天下是什么生肖?
春雨贵如油是什么节气?密密的春雨像什么比喻?
二十不惑人物关系是什么?二十不惑2演员表
iphone屏幕分辨率是多少?iphone屏幕分辨率怎么调?
天天热推荐:[django]钩子函数的一些细节(clean)
环球短讯!火山引擎入选《2022 爱分析 · DataOps 厂商全景报告》,旗下 DataLeap 产品能力获认可
快播:ETL的系统核心特征
环球热议:SQL Server创建Oracle链接服务器
电脑自动重启是什么原因?电脑自动重启频繁怎么解决?
CAD布局怎么使用?cad布局背景怎么调成黑色?
gta5怎么切换角色?GTA5怎么刷钱?
deb是什么意思?deb怎么安装?
世界热讯:BBA直呼内行!吉利“仰望银河”出圈:多家国产品牌跟风“望天”
天天时讯:首发1399元!小米小顽智能全自动猫砂盆开售:14天不用管
苹果iOS 16.4首个测试版发布 新增15个表情符号被吐槽太丑
今日热文:网传杭州取消限行 官方辟谣:假的、Chatgpt撰写生成
《狂野之心》IGN 8分:足以媲美《怪猎》狩猎大作
天天视讯!银河麒麟V10系统安装步骤
Java 文件上传
世界新动态:机器学习-集成学习GBDT
如何压缩图片大小?简单的图片压缩方法分享
世界视点!一降再降!一汽丰田首款纯电SUV大促:优惠6万到手13.98万起
祈福者放生2.5万斤鲇鱼被追责:属外来物种 危害极大
合资燃油车危险了!比亚迪秦PLUS DM-i冠军版上市7天订单超3.2万
当前动态:促销“狂飙”结束 特斯拉Model Y全系已上涨2000元
微软进一步拥抱AI:Win11新功能“记住”用户常用窗口布局
世界热点!《分布式技术原理与算法解析》学习笔记Day14
环球最新:Django Cannot assign "A1": "B1" must be a "C1" instance.
把选择语句和重复语句视为块
营收创6年最大跌幅!苹果被曝裁员外包员工 库克最后手段?
时隔3年半漫威重返内地!《蚁人与黄蜂女:量子狂潮》今日上映
天天热头条丨《星际争霸2》世界冠军李培楠回国:黄旭东等为其接风
当前视讯!三亚3米长搁浅抹香鲸救治无效不幸死亡:或被鲨鱼咬伤
全球看热讯:干货分享丨店长管理的五大核心你抓住了吗!
当前要闻:没买车的等等党们:赢了
每日看点!男子购买1200元年货32天快递仍未送达 邮政客服:车还在路上
每日动态!注意!特斯拉宣布召回超36万辆车 会突然停车发生车祸:马斯克火速回应
环球新动态:iPadOS 16:拖后腿了