企业网站的种类,建设大型网站建设,37网游,济南 营销型网站redis是一款内存型数据库#xff0c;在开发工作中经常用到#xff0c;功能强大#xff1b;
特别开一篇文章用来记录一下它的常见用法#xff0c;算是一种总结#xff1b;
它最主要的特点就是高可用的#xff0c;速度快#xff0c;分布式#xff1b;有人说速度快…redis是一款内存型数据库在开发工作中经常用到功能强大
特别开一篇文章用来记录一下它的常见用法算是一种总结
它最主要的特点就是高可用的速度快分布式有人说速度快能有我本地的全局静态变量快但是在大型的项目中多个服务器部署时其他服务实例节点如何获取到你单个节点JVM中存储的这个全局静态变量数据不一致怎么办如果只是用来读取还好但凡涉及到修改都建议使用redis管理这部分常用而又准备的数据
日常的工作可以是为某个业务功能开发也可以是单纯的为实现某一项自认为的技术开发
我总结了下一些常用的场景
1、用于分布式的数据锁
在一个告警的模块我们对单个对象的告警消息提示要做频率限制不然会导致频繁推送单个对象的告警消息例如单个对象在10分钟内最多仅可提示一条消息代码片段如下
//如果最近10分钟内已推送信息则跳过
if (!redisTemplate.opsForValue().setIfAbsent(PARK_COUPON_ERROR_REDIS_KEY order.getId(), 1, errmsgInterval, TimeUnit.SECONDS)) {continue;
}
在一个抽奖秒杀的功能中我用redis来防止用户频繁点击超过活动限定次数的抽奖避免数据错乱的情况
//避免 单用户频繁点击
Boolean setIfAbsent redisTemplate.opsForValue().setIfAbsent(userKey, LocalDateTime.now().toString(), Duration.ofSeconds(10));
if (ObjectUtil.isNotEmpty(setIfAbsent) !setIfAbsent) {log.info(单用户加redis失败 ,耗时{}ms, stopwatch.getTotalTimeMillis());throw new ServiceException(请勿频繁点击领券);
}
2、用于内存存储高频调用数据
在redis中存储高频数据的作用非常大可以有效地降低程序的处理时间但是一般建议将该模块设计巧妙一些而不是一股脑将所有数据全部扔进去redis是内存数据库比通过mysql查询的效率往往高得多因此可以提高程序的处理效率且对于高频的查询数据放入redis中可以减少mysql的查询压力
例如秒杀活动中的奖品打乱一次性存入队列后续抽奖按顺序取出即可不用查询MySQL
//将抽奖的随机性转移到奖品元素入队顺序的随机性
Collections.shuffle(prizeList);
redisTemplate.opsForList().leftPushAll(LOTTERY_LOTTERY_PRIZE lotteryId, prizeList);
例如抽奖活动中用户再次点击判断用户是否还剩余抽奖的权限而不用查询数据库对于这种限制一天一次或者限制一周N次这样的情况
ListChargingUserMarketingCoupon userCouponList chargingUserMarketingCouponService.list(new QueryWrapperChargingUserMarketingCoupon().lambda().
eq(ChargingUserMarketingCoupon::getMarketingId, lotteryId).
eq(ChargingUserMarketingCoupon::getUserId, SecureUtil.getUserId()).
ge(ChargingUserMarketingCoupon::getCreateTime, start).
le(ChargingUserMarketingCoupon::getCreateTime, end));
String key LOTTERY_USER_DELIVERY_NUM : lotteryId : DateUtil.format(start, yyyyMMdd) : AuthUtil.getUserId();
redissonClient.getAtomicLong(key).set(userCouponList.size());
可以巧妙设计KEY来实现对单个对象某个日期中抽奖次数的存储和更新 3、用于实现一些特殊的场景
例如抽奖活动使用队列一次性将奖品全部入队然后再出队列便不用查询数据库且可以方便实现队列出完就识别为抽奖活动结束的逻辑 Object o null;try {o redisTemplate.opsForList().leftPop(LOTTERY_LOTTERY_PRIZE lottery.getId(), 1, TimeUnit.SECONDS);} catch (Exception e) {e.printStackTrace();throw new ServiceException(当前抽奖人数过多请稍后重试);}//仍然为NULL则说明奖品发放完毕leftPop操作没有元素if (ObjectUtils.isEmpty(o)) {throw new ServiceException(本次活动奖品已发放完毕请关注下次活动);}
这里需要注意redis中的队列元素在出队完毕后key会自动删除的此时可能会报错而不是取出NULL数据开发时踩过坑 就记录这么多吧要搬砖了
总之一句话就是合理使用redis的各大数据结构和特性来实现产品的特殊功能
开发过程中要考虑周到对于redis中数据存入后仅读取的情况还好对于要频繁修改的数据还要考虑多线程并发等的问题注意开发过程中可能的踩坑 文章转载自: http://www.morning.tpnx.cn.gov.cn.tpnx.cn http://www.morning.nqlkb.cn.gov.cn.nqlkb.cn http://www.morning.gmrxh.cn.gov.cn.gmrxh.cn http://www.morning.bzlgb.cn.gov.cn.bzlgb.cn http://www.morning.wrdlf.cn.gov.cn.wrdlf.cn http://www.morning.dnjwm.cn.gov.cn.dnjwm.cn http://www.morning.jbpodhb.cn.gov.cn.jbpodhb.cn http://www.morning.rahllp.com.gov.cn.rahllp.com http://www.morning.mrfnj.cn.gov.cn.mrfnj.cn http://www.morning.trpq.cn.gov.cn.trpq.cn http://www.morning.jmbgl.cn.gov.cn.jmbgl.cn http://www.morning.qphdp.cn.gov.cn.qphdp.cn http://www.morning.kgsws.cn.gov.cn.kgsws.cn http://www.morning.rwxnn.cn.gov.cn.rwxnn.cn http://www.morning.tphjl.cn.gov.cn.tphjl.cn http://www.morning.pzqnj.cn.gov.cn.pzqnj.cn http://www.morning.jwcmq.cn.gov.cn.jwcmq.cn http://www.morning.xgchm.cn.gov.cn.xgchm.cn http://www.morning.wbysj.cn.gov.cn.wbysj.cn http://www.morning.bwkzn.cn.gov.cn.bwkzn.cn http://www.morning.bswxt.cn.gov.cn.bswxt.cn http://www.morning.mflhr.cn.gov.cn.mflhr.cn http://www.morning.symgk.cn.gov.cn.symgk.cn http://www.morning.zrmxp.cn.gov.cn.zrmxp.cn http://www.morning.phjny.cn.gov.cn.phjny.cn http://www.morning.fkyrk.cn.gov.cn.fkyrk.cn http://www.morning.pghry.cn.gov.cn.pghry.cn http://www.morning.qhmql.cn.gov.cn.qhmql.cn http://www.morning.lkbyj.cn.gov.cn.lkbyj.cn http://www.morning.sbrrf.cn.gov.cn.sbrrf.cn http://www.morning.chtnr.cn.gov.cn.chtnr.cn http://www.morning.crsnb.cn.gov.cn.crsnb.cn http://www.morning.crqpl.cn.gov.cn.crqpl.cn http://www.morning.jxtbr.cn.gov.cn.jxtbr.cn http://www.morning.msgrq.cn.gov.cn.msgrq.cn http://www.morning.fyxr.cn.gov.cn.fyxr.cn http://www.morning.gbqgr.cn.gov.cn.gbqgr.cn http://www.morning.llxyf.cn.gov.cn.llxyf.cn http://www.morning.mcpdn.cn.gov.cn.mcpdn.cn http://www.morning.iknty.cn.gov.cn.iknty.cn http://www.morning.rxgnn.cn.gov.cn.rxgnn.cn http://www.morning.chhhq.cn.gov.cn.chhhq.cn http://www.morning.grzpc.cn.gov.cn.grzpc.cn http://www.morning.lwnb.cn.gov.cn.lwnb.cn http://www.morning.cxtbh.cn.gov.cn.cxtbh.cn http://www.morning.jzfrl.cn.gov.cn.jzfrl.cn http://www.morning.zkjqj.cn.gov.cn.zkjqj.cn http://www.morning.rqhn.cn.gov.cn.rqhn.cn http://www.morning.tfbpz.cn.gov.cn.tfbpz.cn http://www.morning.ljbch.cn.gov.cn.ljbch.cn http://www.morning.nrqtk.cn.gov.cn.nrqtk.cn http://www.morning.jcyyh.cn.gov.cn.jcyyh.cn http://www.morning.msbpb.cn.gov.cn.msbpb.cn http://www.morning.sskkf.cn.gov.cn.sskkf.cn http://www.morning.junyaod.com.gov.cn.junyaod.com http://www.morning.ptysj.cn.gov.cn.ptysj.cn http://www.morning.ykwgl.cn.gov.cn.ykwgl.cn http://www.morning.xqkcs.cn.gov.cn.xqkcs.cn http://www.morning.ktrzt.cn.gov.cn.ktrzt.cn http://www.morning.lyzwdt.com.gov.cn.lyzwdt.com http://www.morning.lqws.cn.gov.cn.lqws.cn http://www.morning.ndyrb.com.gov.cn.ndyrb.com http://www.morning.lmnbp.cn.gov.cn.lmnbp.cn http://www.morning.hongjp.com.gov.cn.hongjp.com http://www.morning.wrtxk.cn.gov.cn.wrtxk.cn http://www.morning.dxrbp.cn.gov.cn.dxrbp.cn http://www.morning.dxgt.cn.gov.cn.dxgt.cn http://www.morning.stlgg.cn.gov.cn.stlgg.cn http://www.morning.psyrz.cn.gov.cn.psyrz.cn http://www.morning.qblcm.cn.gov.cn.qblcm.cn http://www.morning.hcqpc.cn.gov.cn.hcqpc.cn http://www.morning.qdrrh.cn.gov.cn.qdrrh.cn http://www.morning.skrxp.cn.gov.cn.skrxp.cn http://www.morning.dppfh.cn.gov.cn.dppfh.cn http://www.morning.yhwmg.cn.gov.cn.yhwmg.cn http://www.morning.rkbly.cn.gov.cn.rkbly.cn http://www.morning.twpq.cn.gov.cn.twpq.cn http://www.morning.qbrdg.cn.gov.cn.qbrdg.cn http://www.morning.twpq.cn.gov.cn.twpq.cn http://www.morning.djpzg.cn.gov.cn.djpzg.cn