专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

分布式缓存的实践原理

  技术选型
  分布式缓存方案默认采用的是主流的缓存框架:Redis,即将缓存数据存储在另一台Redis服务器上。系统在使用缓存时,依赖的是缓存的接口,而非具体的实现;
  分布式缓存在更新时不允许并发更新,防止缓存击穿,因此我们在Redis的基础上,采用了基于Redisson的分布式锁,在更新分布式缓存前必须先获得锁。缓存生命周期
  更新机制被动刷新:基于Redis的数据驱逐策略,包括LRU和TTL等;主动刷新:业务数据驱动的数据更新。当业务侧有数据变更时,将会主动刷新分布式缓存。比如当秒杀品下线时,会发出相应的领域事件,而在领域事件的处理中就会刷新缓存。
  分布式缓存在刷新的过程中,并不会主动刷新所有服务器上的本地缓存,本地缓存将遵循单机的刷新策略。这意味着,本地缓存可能会有秒级或毫秒级的滞后,对于数据一致性非绝对敏感的场景,这种短时间的延迟下的脏数据是可以接受的,它只是会对用户侧的展示有所影响,而不会影响到服务端的数据状态。分布式锁基于Redis实现分布式锁利用setnxex获取锁,并设置过期时间,保存线程标识释放锁时先判断线程标识是否与自己一致,一致则删除锁基于redis的分布式锁publicclassSimpleRedisLockimplementsILock{privateStringname;privateStringRedisTemplatestringRedisTemplate;publicSimpleRedisLock(Stringname,StringRedisTemplatestringRedisTemplate){this。namename;this。stringRedisTemplatestringRedisTemplate;}privatestaticfinalStringKEYPREFIXlock:;privatestaticfinalStringIDPREFIXUUID。randomUUID()。toString();锁paramtime锁的过期时间returnOverridepublicbooleantryLock(longtime){longidThread。currentThread()。getId();值用uuid线程id拼接StringvalueIDPREFIXid;自动拆箱有空指针问题BooleanaBooleanstringRedisTemplate。opsForValue()。setIfAbsent(KEYPREFIXname,value,time,TimeUnit。SECONDS);returnBoolean。TRUE。equals(aBoolean);}解锁OverridepublicvoidunLock(){StringvalueInRedisstringRedisTemplate。opsForValue()。get(KEYPREFIXname);longidThread。currentThread()。getId();值用uuid线程id拼接StringvalueIDPREFIXid;两者相同才释放锁,要先做判断再进行释放if(value。equals(valueInRedis)){stringRedisTemplate。delete(KEYPREFIXname);}}}基于Redison实现分布式锁
  导包dependencygroupIdorg。redissongroupIdredissonartifactIdversion3。16。3versiondependency
  配置文件ConfigurationpublicclassRedissonConfig{BeanpublicRedissonClientredissonClient(){ConfigconfignewConfig();config。useSingleServer()。setAddress(redis:localhost:6379)。setPassword(ezreal)。setDatabase(0);returnRedisson。create(config);}}
  代码实现ComponentpublicclassRedissonLockServiceimplementsDistributedLockFactoryService{privatefinalLoggerloggerLoggerFactory。getLogger(RedissonLockService。class);ResourceprivateRedissonClientredissonClient;OverridepublicDistributedLockgetDistributedLock(Stringkey){RLockrLockredissonClient。getLock(key);returnnewDistributedLock(){OverridepublicbooleantryLock(longwaitTime,longleaseTime,TimeUnitunit)throwsInterruptedException{booleanisLockSuccessrLock。tryLock(waitTime,leaseTime,unit);logger。info({}getlockresult:{},key,isLockSuccess);returnisLockSuccess;}Overridepublicvoidlock(longleaseTime,TimeUnitunit){rLock。lock(leaseTime,unit);}Overridepublicvoidunlock(){if(isLocked()isHeldByCurrentThread()){rLock。unlock();}}OverridepublicbooleanisLocked(){returnrLock。isLocked();}OverridepublicbooleanisHeldByThread(longthreadId){returnrLock。isHeldByThread(threadId);}OverridepublicbooleanisHeldByCurrentThread(){returnrLock。isHeldByCurrentThread();}};}}
  实现原理可重入:利用hash结构记录线程id和重入次数可重试:利用信号量和PubSub功能实现等待、唤醒,获取锁失败的重试机制超时续约::利用watchDog,每隔一段时间(releaseTime3),重置超时时间
  分布式缓存基本逻辑
  每次获取缓存的时候,先从本地缓存中获取,再从分布式缓存中获取。
  若分布式缓存中不存在对应的值,则需要获取分布式锁,然后对分布式缓存数据进行更新若获取锁成功,则查询数据库,获取最新的数据放入缓存;
  若数据库中的数据也为空,则也要存储入数据库,防止缓存穿透若获取锁失败,则直接返回,不要等待重新获取锁,客户端对这次请求进行静默处理;实现代码
  缓存的接口
  实现部分Redis数据结构的存储接口publicinterfaceDistributedCacheService{voidput(Stringkey,Stringvalue);voidput(Stringkey,Objectvalue);voidput(Stringkey,Objectvalue,longtimeout,TimeUnitunit);voidput(Stringkey,Objectvalue,longexpireTime);TTgetObject(Stringkey,ClassTtargetClass);StringgetString(Stringkey);TListTgetList(Stringkey,ClassTtargetClass);Booleandelete(Stringkey);BooleanhasKey(Stringkey);}
  基本逻辑代码privateSeckillGoodCacheupdateDistributedSeckillGood(LongitemId){logger。info(更新远程缓存{},itemId);DistributedLockdistributedLockdistributedLockFactoryService。getDistributedLock(UPDATEITEMSCACHELOCKKEYitemId);try{booleantryLockdistributedLock。tryLock(1,5,TimeUnit。SECONDS);如果没有获得到锁,就返回重试if(!tryLock){returnnewSeckillGoodCache()。tryLater();}再次检查SeckillGoodCachedistributedSeckillCachedistributedCacheService。getObject(buildItemCacheKey(itemId),SeckillGoodCache。class);if(distributedSeckillCache!null){returndistributedSeckillCache;}查询数据库SeckillGoodseckillGoodseckillGoodMapper。selectById(itemId);SeckillGoodCacheseckillGoodCachenewSeckillGoodCache();if(seckillGoodnull){数据不存在也要返回也要存缓存防止缓存穿透seckillGoodCache。notExist();}else{seckillGoodCache。with(seckillGood)。setVersion(System。currentTimeMillis());}logger。info(itemCache远程缓存已更新{},itemId);distributedCacheService。put(buildItemCacheKey(itemId),JSON。toJSONString(seckillGoodCache));returnseckillGoodCache;}catch(InterruptedExceptione){logger。error(itemCache远程缓存更新失败{},itemId);returnnewSeckillGoodCache()。tryLater();}finally{distributedLock。unlock();}}

三湘四水相约湖南首届湖南旅游发展大会在张家界开幕初冬的张家界,层林尽染,如诗如画。11月19日晚,首届湖南旅游发展大会开幕式暨文化旅游推介会在张家界市举行。联合国第八任秘书长潘基文致书面贺词。湖南省委书记省人大常委会主任张庆伟出墨西哥记者探访中共一大会址中国今天伟大成就的起步之地墨西哥电视六台网站11月17日发表记者弗朗西斯马丁内斯采写的一篇文章,题为上海中国伟大成就的摇篮。文章编译如下上海的一栋朴素建筑是中国今天伟大成就的起步之地,中国共产党的第一次全国江南水乡的鱼文化节11月18日,和孚镇荻港村村民在展示手工制作蚕丝被的传统技艺。当日,浙江湖州南浔区第十四届鱼文化节在和孚镇荻港村举行,游客看表演品民俗尝鱼味,体验传统丰收场景。一年一度的鱼文化节已不懂外语不要紧,iPhone打开这个功能,快速翻译十几种语言我们在工作学习生活中,遇到不认识的外语需要翻译,可是不懂外语怎么办呢?如果你用的是iPhone手机,教你打开这个功能,快速翻译十几种语言。一词典翻译1。当我们遇到不认识的英语单词,一手好字抒写文化自信视频加载中现代快报讯(记者姜振军)中华艺术源远流长,翰墨瑰宝万世飘香。11月20日上午,北京师范大学盐城附属学校小学部剧场里灯光闪耀,座无虚席。斗龙港旅游集团杯2022江苏省中小学落叶文谷百川清晨,我一如既往地到村北公路人行道上早炼。昨夜一场濛濛细雨,不知什么时候停歇了,此时平添了一些丝丝凉意。我慢慢往前走着。时而抬头瞧瞧成行的法桐,秋风已把往日翠绿的树叶揉搓得半绿半黄读书趣味读司马迁著史记秦本纪第五的收获本章从赢氏家族起源说起,一直写到秦昭王壮大了秦国,为日后秦始皇一统天下做足功课的整个过程。作者追溯了秦朝统治者的遥远先祖,详细介绍了春秋战国时期国的几代英主的文韬武略。意在说明秦始为什么古代总爱农民起义?黄宗羲定律我知道现在的历史书,通常会强调国际视野,从宏观层面上比较中国和外国的历史。这一比较,就发现了中国历史上有个显著的特点,那就是农民起义特别多,不说那些小的起义,单说那些大家都耳熟能详的,从抗联女神枪手负伤被俘,受尽酷刑,视死如归抗联女神枪手负伤被俘,受尽酷刑,视死如归抗日女英雄许成淑(19151939),朝鲜族,吉林省安图县(原延吉县)石门仲坪村人,1915年生,1930年加入少年先锋队,1933年入团,他是原北京军区司令员,62岁被授上将,曾指挥过国庆50周年阅兵式北京作为新中国的首都,不管是在经济文化还是军事上,在国内众多省市当中绝对算得上是顶尖的。了解北京军区的朋友应该都知道,其实在建国初期,北京军区是隶属于华北军区的。直到1955年后,温铁军封建社会?你给我解释解释,什么叫封建几个字和中国古代划上等号。其中男性留长辫女性裹小脚,畸形的审美观,都被称为封建的残余恶习。但是近来我国经济学家温铁军针对这一错误的理解发出了质问封建社会?你给我解释解释,什么叫封建
威少11中0遭狂喷!詹姆斯嘴上维护队友,但他还能忍受多久?湖人97103不敌快船,从比分上看,湖人可能超出了很多人的预期,比赛过程也不乏亮点,要论这场失利由谁来背锅,威斯布鲁克自然是跑不了。新赛季首战,威斯布鲁克12中7拿到19分,主帅哈同样是四年,一个1。4亿,一个1。09亿,普尔凭什么?嘴哥凭什么?请看到最后心这几天勇士可是没闲着,接连给球迷们一惊一喜,如果说普尔的4年1。4亿的大合同让不少人吓着了,那么嘴哥4年1。09亿的大幅降薪让人直呼爱嘴一万年。怎么说呢,对于普尔4年161岁郎平学校引围观!打扮时髦年轻10岁,一双筷子腿十分抢镜无论是运动员时期还是教练员时期,郎平都是叱咤风云的人物。近段时间,郎平受福师大邀请去福师大进行关于女排精神的讲座。很多同学都在社交平台上晒出了在校内偶遇郎平的照片,大家都想一睹这位依然心系火箭!圆脸登总结首战失利原因,是我们自己打败了自己火箭对战老鹰的揭幕战没有能够拿下首胜,在大多数人看来是因为两队有实力的差距,但是在球队的老将圆脸登看来并不是如此。早些时候在接受采访的时候圆脸登就总结了球队失利的原因,他说我们打出(体育)乒乓球WTT澳门冠军赛王艺迪晋级八强当日,在澳门塔石体育馆进行的2022年WTT澳门冠军赛女子单打八分之一决赛中,中国选手王艺迪以3比1战胜德国选手单晓娜,晋级八强。10月21日,王艺迪在比赛中发球。新华社记者张金加哈登下半场狂砍22分,无奈恩比德关键失误,76人8889不敌雄鹿北京时间10月21号。76人主场迎战雄鹿队,本场比赛76人全员出战,而雄鹿这边的康诺顿和米德尔顿都缺阵这场比赛。哈登上半场仅得9分,大部分的精力放在串联球队进攻上,上半场就送出了6令季老做梦的五种叶子的松树长什么样儿?秋日生活打卡季在我的家乡,也是国学大师季羡林的故乡临清,有一种长着五种形状树叶的松树五样松。据说这棵树已有两千多年的树龄,千年的沧桑让她成为这个城市的精神图腾,成为每个离开家乡游子48岁王艳豪宅内闻香赏秋,穿居家服珠宝抢眼,一副岁月静好的样子娱评大赏10月19日晚,知名女星王艳在个人社交平台上分享了一段视频,并配文静室一炉香,虚窗一盏茶。王艳还附带上了话题,打卡一个秋天。视频中王艳梳着高马尾,身穿白色印花毛衣,搭配粉色匆匆岁月,有聊人生成年人的世界没有那么简单我们绝大多数人,从小都是在父母的呵护下成长,正常情况下的家庭教育,都遵从说话做事顾忌他人,这也是生而为人的基本教养。虽然我们有着不伤人的教养,但很多时候也缺少不被别人伤害的气场。无老年人的时尚感不输年轻人,穿搭减龄洋气,完美印证岁月无痕女性在不同的年龄阶段,身上散发出来的魅力都是不一样的,二十多岁的女性身上散发出来的或许是少女般娇俏的美感,而五六十岁甚至是七八十岁女性身上则有一种岁月沉淀下来的风韵美感,这也是极有中国新发展世界新机遇外籍语言专家看中共二十大报告他们是最早看到中国共产党二十大报告的外国人。他们全力以赴,参与报告对外翻译润稿工作,为的是要将这份推进中华民族复兴将深刻影响世界的历史性文件,以高质量的译文呈现给世界。涵盖英文法文
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网