redis在日常开发工作中的常见用法

这篇具有很好参考价值的文章主要介绍了redis在日常开发工作中的常见用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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次这样的情况;

List<ChargingUserMarketingCoupon> userCouponList = chargingUserMarketingCouponService.list(new QueryWrapper<ChargingUserMarketingCoupon>().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中数据存入后仅读取的情况还好,对于要频繁修改的数据还要考虑多线程并发等的问题;注意开发过程中可能的踩坑;文章来源地址https://www.toymoban.com/news/detail-708788.html

到了这里,关于redis在日常开发工作中的常见用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android应用程序中使用 Gemini Pro AI开发——2年工作经验如何淘汰10年工作经验的Android开发?

    上周,谷歌推出了最强大的基础模型 Gemini 。 Gemini 是多模式的AI——它可以接受文本和图像输入。 谷歌为 Android 开发者引入了一种在设备上,利用最小模型Gemini Nano的方法。此功能可通过 AICore 在部分设备上使用,这是一项处理模型管理、运行时、安全功能等的系统服务,可

    2024年01月18日
    浏览(68)
  • 从事软件开发工作的一些感悟

    随着科技的飞速发展,计算机领域成为了一个充满机遇和挑战的领域。对于计算机这个行业,我一直有着浓厚的兴趣,这份兴趣驱使我不断学习,不断成长。在这篇文章中,我将分享我的编程经历以及一些建议,希望能够给那些刚刚踏入编程领域的人一些启发。 我的编程之路

    2024年02月08日
    浏览(55)
  • vue前端开发准备工作ing...

    在项目开始前需要将项目的包管理工具问题解决,这里我使用的包管理工具是yarn。 安装yarn 在你的vue文件目录下的终端安装 npm i -g yarn 创建项目 如果你使用的npm包管理工具就使用如下命令创建项目 如果是yarn: 安装依赖 在你创建的项目文件下的终端安装 npm: npm install yarn:

    2024年01月17日
    浏览(54)
  • 前端开发的工作职责精选【10篇】

      前端开发的工作职责1 1、使用Div+css并结合Javascript负责产品的前端开发和页面制作; 2、熟悉W3C标准和各主流浏览器在前端开发中的差异,能熟练运用DIV+CSS,提供针对不同浏览器的前端页面解决方案; 3、负责相关产品的需求以及前端程序的实现,提供合理的前端架构; 4、与产

    2024年02月13日
    浏览(55)
  • 前端开发是做什么的?工作职责

    想要了解前端从业者的工作职责,需要从一个完整网站应用产生流程入手,一个网站应用从无到有的过程大致如下 : 1)产品经理与甲方反复沟通交流,逐步确定产品需求完成设计草图; 2)产品经理根据需求和草图进行分析,提交 PRD(需求文档),并与开发人员协商软件功

    2023年04月10日
    浏览(57)
  • 前端开发的工作职责精选【10篇】(合集)

      前端开发的工作职责1 1、使用Div+css并结合Javascript负责产品的前端开发和页面制作; 2、熟悉W3C标准和各主流浏览器在前端开发中的差异,能熟练运用DIV+CSS,提供针对不同浏览器的前端页面解决方案; 3、负责相关产品的需求以及前端程序的实现,提供合理的前端架构; 4、与产

    2024年02月16日
    浏览(55)
  • mac 10.13.6安装后开发准备工作

    git下载安装 xcode旧版安装搜索 brew国内源安装 brew国内源安装地址2 brew更换源 SwitchHosts github hosts nfts磁盘读写工具 更新ssl证书 证书下载 brew 更新curl(60) ssl错误解决: https://site.ip138.com/ vi 命令: i 插入 :wq 保存退出

    2024年02月11日
    浏览(42)
  • JavaWeb课程设计项目实战(03)——开发准备工作

    本文原创作者:谷哥的小弟 作者博客地址:http://blog.csdn.net/lfdfhl 在正式进入项目开发之前请先完成以下准备工作。 请创建数据库和表并完成数据初始化工作。 请在MySQL数据库中创建名为studentinformationmanagement的库。 在本项目中有以下两张表: 1、用户表 2、学生表 用户表详情

    2024年02月15日
    浏览(44)
  • 鸿蒙HarmonyOS应用开发能找到工作么?_harmony os 应用开发前景

    四、如何学习鸿蒙HarmonyOS应用开发技术? 为了能够帮助大家快速掌握鸿蒙(Harmony NEXT)应用开发技术知识。 首先得是开发语言 ArkTS,这个尤为重要,然后就是ArkUI声明式UI开发、Stage模型、网络/数据库管理、分布式应用开发、进程间通信与线程间通信技术、OpenHarmony多媒体技

    2024年04月27日
    浏览(42)
  • 开发一款提高效率工作的命令行程序

    开发工作中我们常用到\\\"时间戳和时间\\\"、\\\"生成guid\\\"、\\\"模拟身份证号\\\",来模拟数据校验和显示;每一次都去找在线工具,确实可以,但我觉得挺麻烦,于是乎想到了自定义一个命令行。 目前我已经实现以下功能: 具体怎样实现呢? 创建控制台应用并安装nuget包 McMaster.Extensio

    2024年02月02日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包