幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

SpringBoot整合Redis实现常用功能

  SpringBoot整合Redis实现常用功能建议大小伙们,在写业务的时候,提前画好流程图,思路会清晰很多。文末有解决缓存穿透和击穿的通用工具类。1登陆功能
  我想,登陆功能是每个项目必备的功能吧,但是想设计好,却是很难!下面介绍两种登陆功能的解决方式:基于Session实现登录流程基于Redis实现登录流程1。1基于Session实现登录流程功能流程:发送验证码:用户在提交手机号后,会校验手机号是否合法,如果不合法,则要求用户重新输入手机号如果手机号合法,后台此时生成对应的验证码,同时将验证码进行保存,然后再通过短信的方式将验证码发送给用户短信验证码登录、注册:用户将验证码和手机号进行输入,后台从session中拿到当前验证码,然后和用户输入的验证码进行校验,如果不一致,则无法通过校验,如果一致,则后台根据手机号查询用户,如果用户不存在,则为用户创建账号信息,保存到数据库,无论是否存在,都会将用户信息保存到session中,方便后续获得当前登录信息校验登录状态:用户在请求时候,会从cookie中携带者JsessionId到后台,后台通过JsessionId从session中拿到用户信息,如果没有session信息,则进行拦截,如果有session信息,则将用户信息保存到threadLocal中,并且放行
  1。1。1session共享问题
  基于session方式实现登陆功能,最大的缺点就是在多台tomcat下session无法共享,就会下出现下面问题。核心思路分析:
  每个tomcat中都有一份属于自己的session,假设用户第一次访问第一台tomcat,并且把自己的信息存放到第一台服务器的session中,但是第二次这个用户访问到了第二台tomcat,那么在第二台服务器上,肯定没有第一台服务器存放的session,所以此时整个登录拦截功能就会出现问题,我们能如何解决这个问题呢?早期的方案是session拷贝,就是说虽然每个tomcat上都有不同的session,但是每当任意一台服务器的session修改时,都会同步给其他的Tomcat服务器的session,这样的话,就可以实现session的共享了但是这种方案具有两个大问题
  1、每台服务器中都有完整的一份session数据,服务器压力过大。
  2、session拷贝数据时,可能会出现延迟
  所以咱们后来采用的方案都是基于redis来完成,我们把session换成redis,redis数据本身就是共享的,就可以避免session共享的问题了
  1。2Redis替代Session1。2。1、设计key的结构
  首先我们要思考一下利用redis来存储数据,那么到底使用哪种结构呢?由于存入的数据比较简单,我们可以考虑使用String,或者是使用哈希,如下图,如果使用String,同学们注意他的value,用多占用一点空间,如果使用哈希,则他的value中只会存储他数据本身,如果不是特别在意内存,其实使用String就可以啦。
  1。2。2、设计key的具体细节
  所以我们可以使用String结构,就是一个简单的key,value键值对的方式,但是关于key的处理,session他是每个用户都有自己的session,但是redis的key是共享的,咱们就不能使用code了
  在设计这个key的时候,我们之前讲过需要满足两点:1、key要具有唯一性2、key要方便携带
  如果我们采用phone:手机号这个的数据来存储当然是可以的,但是如果把这样的敏感数据存储到redis中并且从页面中带过来毕竟不太合适,所以我们在后台生成一个随机串token,然后让前端带来这个token就能完成我们的整体逻辑了。
  1。2。3、整体访问流程
  当注册完成后,用户去登录会去校验用户提交的手机号和验证码,是否一致,如果一致,则根据手机号查询用户信息,不存在则新建,最后将用户数据保存到redis,并且生成token作为redis的key,当我们校验用户是否登录时,会去携带着token进行访问,从redis中取出token对应的value,判断是否存在这个数据,如果没有则拦截,如果存在则将其保存到threadLocal中,并且放行。
  2缓存功能2。1什么是缓存?
  缓存(Cache),就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地代码(例如:例1:StaticfinalConcurrentHashMapK,VmapnewConcurrentHashMap();本地用于高并发例2:staticfinalCacheK,VUSERCACHECacheBuilder。newBuilder()。build();用于redis等缓存例3:StaticfinalMapK,VmapnewHashMap();本地缓存
  由于其被Static修饰,所以随着类的加载而被加载到内存之中,作为本地缓存,由于其又被final修饰,所以其引用(例3:map)和对象(例3:newHashMap())之间的关系是固定的,不能改变,因此不用担心赋值()导致缓存失效;2。1。1为什么要使用缓存
  一句话:因为速度快,好用
  缓存数据存储于代码中,而代码运行在内存中,内存的读写性能远高于磁盘,缓存可以大大降低用户访问并发量带来的服务器读写压力
  实际开发过程中,企业的数据量,少则几十万,多则几千万,这么大数据量,如果没有缓存来作为避震器,系统是几乎撑不住的,所以企业会大量运用到缓存技术;
  但是缓存也会增加代码复杂度和运营的成本:
  2。1。2如何使用缓存
  实际开发中,会构筑多级缓存来使系统运行速度进一步提升,例如:本地缓存与redis中的缓存并发使用
  浏览器缓存:主要是存在于浏览器端的缓存
  应用层缓存:可以分为tomcat本地缓存,比如之前提到的map,或者是使用redis作为缓存
  数据库缓存:在数据库中有一片空间是bufferpool,增改查数据都会先加载到mysql的缓存中
  CPU缓存:当代计算机最大的问题是cpu性能提升了,但内存读写速度没有跟上,所以为了适应当下的情况,增加了cpu的L1,L2,L3级的缓存
  2。2。使用缓存2。2。1、缓存模型和思路
  标准的操作方式就是查询数据库之前先查询缓存,如果缓存数据存在,则直接从缓存中返回,如果缓存数据不存在,再查询数据库,然后将数据存入redis
  2。3缓存更新策略
  缓存更新是redis为了节约内存而设计出来的一个东西,主要是因为内存数据宝贵,当我们向redis插入太多数据,此时就可能会导致缓存中的数据过多,所以redis会对部分数据进行更新,或者把他叫为淘汰更合适。
  内存淘汰:redis自动进行,当redis内存达到咱们设定的maxmemery的时候,会自动触发淘汰机制,淘汰掉一些不重要的数据(可以自己设置策略方式)
  超时剔除:当我们给redis设置了过期时间ttl之后,redis会将超时的数据进行删除,方便咱们继续使用缓存
  主动更新:我们可以手动调用方法把缓存删掉,通常用于解决缓存和数据库不一致问题
  2。3。1、数据库缓存不一致解决方案:
  由于我们的缓存的数据源来自于数据库,而数据库的数据是会发生变化的,因此,如果当数据库中数据发生变化,而缓存却没有同步,此时就会有一致性问题存在,其后果是:
  用户使用缓存中的过时数据,就会产生类似多线程数据安全问题,从而影响业务,产品口碑等;怎么解决呢?有如下几种方案
  CacheAsidePattern人工编码方式:缓存调用者在更新完数据库后再去更新缓存,也称之为双写方案(一般采用)
  ReadWriteThroughPattern:由系统本身完成,数据库与缓存的问题交由系统本身去处理
  WriteBehindCachingPattern:调用者只操作缓存,其他线程去异步处理数据库,实现最终一致
  2。3。2、数据库和缓存不一致采用什么方案
  综合考虑使用方案一,但是方案一调用者如何处理呢?这里有几个问题
  操作缓存和数据库时有三个问题需要考虑:
  如果采用第一个方案,那么假设我们每次操作数据库后,都操作缓存,但是中间如果没有人查询,那么这个更新动作实际上只有最后一次生效,中间的更新动作意义并不大,我们可以把缓存删除,等待再次查询时,将缓存中的数据加载出来删除缓存还是更新缓存?更新缓存:每次更新数据库都更新缓存,无效写操作较多删除缓存:更新数据库时让缓存失效,查询时再更新缓存如何保证缓存与数据库的操作的同时成功或失败?单体系统,将缓存与数据库操作放在一个事务分布式系统,利用TCC等分布式事务方案
  应该具体操作缓存还是操作数据库,我们应当是先操作数据库,再删除缓存,原因在于,如果你选择第一种方案,在两个线程并发来访问时,假设线程1先来,他先把缓存删了,此时线程2过来,他查询缓存数据并不存在,此时他写入缓存,当他写入缓存后,线程1再执行更新动作时,实际上写入的就是旧的数据,新的数据被旧数据覆盖了。先操作缓存还是先操作数据库?存在线程安全问题
  2。4缓存穿透问题的解决思路
  缓存穿透:缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。
  常见的解决方案有两种:缓存空对象优点:实现简单,维护方便缺点:额外的内存消耗可能造成短期的不一致布隆过滤优点:内存占用较少,没有多余key缺点:实现复杂存在误判可能
  缓存空对象思路分析:当我们客户端访问不存在的数据时,先请求redis,但是此时redis中没有数据,此时会访问到数据库,但是数据库中也没有数据,这个数据穿透了缓存,直击数据库,我们都知道数据库能够承载的并发不如redis这么高,如果大量的请求同时过来访问这种不存在的数据,这些请求就都会访问到数据库,简单的解决方案就是哪怕这个数据在数据库中也不存在,我们也把这个数据存入到redis中去,这样,下次用户过来访问这个不存在的数据,那么在redis中也能找到这个数据就不会进入到缓存了。
  布隆过滤:布隆过滤器其实采用的是哈希思想来解决这个问题,通过一个庞大的二进制数组,走哈希思想去判断当前这个要查询的这个数据是否存在,如果布隆过滤器判断存在,则放行,这个请求会去访问redis,哪怕此时redis中的数据过期了,但是数据库中一定存在这个数据,在数据库中查询出来这个数据后,再将其放入到redis中
  假设布隆过滤器判断这个数据不存在,则直接返回
  这种方式优点在于节约内存空间,存在误判,误判原因在于:布隆过滤器走的是哈希思想,只要哈希思想,就可能存在哈希冲突
  小总结:
  缓存穿透产生的原因是什么?用户请求的数据在缓存中和数据库中都不存在,不断发起这样的请求,给数据库带来巨大压力
  缓存穿透的解决方案有哪些?缓存null值布隆过滤增强id的复杂度,避免被猜测id规律做好数据的基础格式校验加强用户权限校验做好热点参数的限流3工具类
  此工具类已经对缓存穿透,和缓存击穿实现了通用功能。可以对比上叙的流程图查阅importcn。hutool。core。util。BooleanUtil;importcn。hutool。core。util。StrUtil;importcn。hutool。json。JSONObject;importcn。hutool。json。JSONUtil;importorg。springframework。data。redis。core。StringRedisTemplate;importorg。springframework。stereotype。Component;importjavax。annotation。Resource;importjava。time。LocalDateTime;importjava。util。concurrent。ExecutorService;importjava。util。concurrent。Executors;importjava。util。concurrent。TimeUnit;importjava。util。function。Function;importstaticcom。hmdp。utils。RedisConstants。CACHENULLTTL;author:lookword2022081917:02ComponentpublicclassCacheClient{ResourceprivateStringRedisTemplatestringRedisTemplate;publicvoidset(Stringkey,Objectvalue,Longtime,TimeUnitunit){stringRedisTemplate。opsForValue()。set(key,JSONUtil。toJsonStr(value),time,unit);}设置逻辑过期时间publicvoidsetWithLogicalExpire(Stringkey,Objectvalue,Longtime,TimeUnitunit){。封装逻辑时间RedisDataredisDatanewRedisData();redisData。setExpireTime(LocalDateTime。now()。plusSeconds(unit。toSeconds(time)));redisData。setData(value);StringredisDataJsonJSONUtil。toJsonStr(redisData);写入RedisstringRedisTemplate。opsForValue()。set(key,redisDataJson);}解决缓存穿透对未存在的数据设置为nullpublicR,IDRqueryWithPassThrough(StringkeyPrefix,IDid,ClassRtype,FunctionID,RdbFallback,LongcacheTime,TimeUnitcacheUnit){缓存keyStringkeykeyPrefixid;1查询缓存中是否命中StringjsonstringRedisTemplate。opsForValue()。get(key);if(StrUtil。isNotBlank(json)){RrJSONUtil。toBean(json,type);returnr;}解决缓存穿透数据库不存在的数据缓存也不存在恶意请求if(json!null){returnnull;}2查询数据库存在存入缓存返回给前端RrdbFallback。apply(id);if(rnull){解决缓存穿透stringRedisTemplate。opsForValue()。set(key,,CACHENULLTTL,TimeUnit。MINUTES);returnnull;}2。1转换成json存入缓存中stringRedisTemplate。opsForValue()。set(key,JSONUtil。toJsonStr(r),cacheTime,cacheUnit);returnr;}线程池publicstaticfinalExecutorServiceCACHEREBUILDEXECUTORExecutors。newFixedThreadPool(10);解决缓存击穿逻辑过期时间方式publicR,IDRqueryWithLogicalExpire(StringkeyPrefix,IDid,ClassRtype,StringlockKeyPrefix,FunctionID,RdbFallback,LongexpiredTime,TimeUnitexpiredUnit){缓存keyStringkeykeyPrefixid;1查询缓存中是否命中StringredisDataJsonstringRedisTemplate。opsForValue()。get(key);if(StrUtil。isBlank(redisDataJson)){returnnull;}2。命中查看是否过期,2。1未过期直接返回旧数据2。2过期获取锁查询数据写入Redis设置新的过期时间2。3过期未获取锁返回旧数据RedisDataredisDataJSONUtil。toBean(redisDataJson,RedisData。class);LocalDateTimeexpireTimeredisData。getExpireTime();RrJSONUtil。toBean((JSONObject)redisData。getData(),type);if(LocalDateTime。now()。isBefore(expireTime)){returnr;}StringlockKeylockKeyPrefixid;获取锁booleanisLocktryLock(lockKey);if(isLock){CACHEREBUILDEXECUTOR。submit((){try{查询数据库Rr1dbFallback。apply(id);存储Redis设置逻辑过期过期时间setWithLogicalExpire(key,r1,expiredTime,expiredUnit);}catch(Exceptione){thrownewRuntimeException(e);}finally{释放锁unlock(lockKey);}});}未获取到锁returnr;}获取锁publicbooleantryLock(Stringkey){BooleanflagstringRedisTemplate。opsForValue()。setIfAbsent(key,1,100,TimeUnit。SECONDS);returnBooleanUtil。isTrue(flag);}释放锁publicvoidunlock(Stringkey){stringRedisTemplate。delete(key);}}

相遇,是天意,相守,是人意梦醒人间看微雨,江山还似旧温柔,遇见的都是天意,拥有的都是幸运,一辈子和你在一起才叫将来,换了别人那叫将就。愿你有星河灿烂,也有孤灯一盏,愿你的意中人,亦是中意你一人。与……删了联系方式,一个人多久才能忘掉一个曾经爱过的人?张爱玲说过,爱上一个人心会一直低,低到泥土里,在土里开出花来,如此卑微却又如此欣喜。可能有人会问,删了联系方式,一个人多久能忘掉一个曾经爱过的人?一刻?一年?……抖音在今年世界杯上下的功夫,远不止撒币10亿买版权这么简单昨晚阿根廷时隔36年再夺大力神杯,梅西问鼎球王!牛!牛!牛!到了这个时候,世超还是会忍不住热血沸腾。几次跌宕、多番起伏,你永远猜不到下一秒会有什么神反转。……柠檬电解质水真的有用嘛?1、将新鲜黄柠檬切片去籽以后,每1。5升的一瓶纯净水里,放半个柠檬切片,再加上适量冰糖,这样喝起来酸甜可口,加入非常少的一点盐。需要注意的是泡柠檬可以是热水,会苦,喝的时候可以……徐云为什么受欢迎这两年工作压力大,因此闲暇时常常看一些可以减压的视频,比如一人一车去流浪这种,其中我最喜欢的一位UP主的名字叫徐云流浪中国,首次关注时他正在骑行前往西藏的路上,那时他在B站只有……金卡戴珊带4娃逛环球影城!穿一身黑秀蛮腰,女儿舔冰棒好可爱当地时间12月28日,金卡戴珊(KimKardashian)带着四个孩子去了南加州的环球影城,同行的还有她个人品牌的首席营销官特雷西罗穆卢斯(越南裔),好不容易到了圣诞节,金卡……一文教你年货节薅羊毛!各种大牌直降,这两款超值旗舰可优先考虑临近年末,各大电商平台也是趁机举办年货节活动,通过优惠促销方便小伙伴入手各种年货好物。当然这也是更新设备,入手新款手机的最佳时机,许多我们耳熟能详的手机品牌都纷纷让利,从折叠屏……Instagram营销Instagram主页转化率提升Instagram是一款社交移动应用,主要是分享身边一切美好的事物,根据网上的数据分析,Instagram的受众要比其他平台的潜在客户对于品牌的转化率更高一些,因为Instag……跟悠栽仔一起打卡北京中轴线北京中轴线承载了700多年的悠久历史和传奇,今天依然充满生机和魅力。那么,你可知道中轴线上的小秘密吗?了解哪个节气的哪处景点最惊艳吗?探访过那些藏匿在胡同或者古迹周边的可爱咖啡……朱小伟领证被遇,陈萌给工作人员喜糖,大衣哥出10W让儿拍婚纱无论是什么身份的人,想要步入婚姻的殿堂,必须要经过求婚,订婚、拍婚纱照、结婚,每一步都要按照步骤来。真要是为了女方好的话,不能跳着步骤去操作,不然会让女生后悔一辈子。朱小……奇瑞这台微型车,更能俘获男性车主了奇瑞新能源的场景车,每次车展我都特别期待,目标人群从元气少女到宝妈都有覆盖。但这次奇瑞QQ无界Pro显然能俘获一些男性车主了,它并没有像宏光MINIEV、长安Lumin那么圆润……注意看,小帅和小美正在占据大家的世界,你的未来被遮蔽了你肯定遇见过一个情况,就是你一定看过这样的短视频注意看(这一句是标配,必须要有),男人叫小帅,怀里的女人是小美,正当那个啥的紧要关头,门口突然传来了佛波勒的声音。无论在地……
虎丘千人坐,高僧讲经,竟吸引了这么多的粉丝一直在路上,发现美,分享快乐!苏州园林虽然有名,但最让我惦记的,却是虎丘山。虎丘山有吴中第一名胜的美誉,就连苏东坡都说到苏州,不游虎丘乃憾事也。虎丘山中的古迹甚多,……张镇麟登陆NBA悬念揭晓,篮网队正式摊牌,周琦曾凡博措手不及北京时间8月30日,CBA联赛正处在休赛期阶段,各个球员为了能够在新赛季开启后有所表现,也都在紧锣密鼓的进行集训备战。辽宁男篮队员张镇麟就是其中的一员,他目前正身处海外进行相关……中车新能源汽车天团亮相澳门车展,黑科技吸睛无数11月11日,第十二届中国(澳门)国际汽车博览会在澳门开幕。红网时刻新闻11月11日讯(通讯员姜杨敏记者肖帅)11月11日,第十二届中国(澳门)国际汽车博览会盛大开幕。作……港股午评恒指涨5。48,内房股爆发新城发展等涨超30金融界11月11日消息今日早间,港股市场大幅高开后震荡回落,截至午间收盘,港股恒生指数涨5。48,报16962。55点,恒生科技指数涨6。53,报3379。93点,国企指数涨5……华为MateBookEGo将于下周迎来多项功能升级IT之家11月11日消息,华为MateBookEGo二合一笔记本将迎来多项功能升级,华为官方宣布,将从11月14日(下周一)起陆续推送横屏大窗口、超级中转站以及多设备移动通信共……俄罗斯模特最新内衣写真曝光?超模艾米丽拉塔科夫斯基(EmilyRatajkowski)最新内衣写真曝光,蜂腰长腿上围傲人,一展完美身材。守护最美夕阳红艾米丽拉塔科夫斯基(EmilyRatajkows……为什么净水器要采用四级五级滤芯过滤?水污染日益严重,形势不容乐观,很多人开始注意自己身边的饮水健康,从以前的自来水、桶装水,到现在的净水器,这就是饮水的进化,而现在也有人发现,净水器品牌的产品都会采用四级、五级的……房价回到四年前!济南楼市,慌了作者:子非鱼01根本停不下来9月22日,济南市多家银行落地了非限购区域内,首套房首付比例20,二套房首付比例30的政策,通过降首付的手段,来进一步释放需求。这已经是……2000元手机用出5000的效果?搭载ToDesk等5种技巧你可知道现在手机市场的中端机有多强?原来中端机也能通过一些使用技巧来实现操作体验胜过高端机!你还不知道吗?本文介绍5种可以大幅提升手机性能效果的冷知识,包你用上可受益。今……为什么曲面屏手机越来越多了?业内人士透露成本大幅下降文名动科技不知道大家有没有发现,现在的曲面屏手机越来越多了。除了苹果以外,其它厂商几乎都用上了曲面屏设计,而且从旗舰价位普及到了中端甚至入门级价位,可谓是任意价位都不放过……富士康听从苹果要求赴印设厂受挫,如今想再回归大陆却已难如愿富士康在印度市场的发展不太顺利,毕竟印度市场还存在诸多问题,如今它希望重回大陆市场扩张业务,然而大陆市场早已发生了变化,让它后悔莫及。富士康的成长离不开大陆市场的支持,当……优秀的人,都有一段孤独时光夜读开卷有益孤独是人生的升值期,懂得享受孤独的人,才能真正变优秀。不要害怕自己和别人不一样,要了解自己是世上独一无二的个体。要带着孤独力好好认识自己。如此,必……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网