热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

多线程中redis实现计数器总结

一、基本概念1、竞态条件:设备或者系统出现不适当的执行时序导致不正确结果的严重后果,叫做竞态条件。2、原子性:一个操作不可中断࿰

一、基本概念

1、竞态条件:设备或者系统出现不适当的执行时序导致不正确结果的严重后果,叫做竞态条件。

2、原子性:一个操作不可中断,要么全执行,要么全不执行,个人理解可以把原子操作当做一个最小的行为单元。

 

二、容易出问题的点:

1、多线程共享资源定要在拿到资源的同时就考虑释放

2、有限数量的资源

(1)保证incr要设置有效期

(2)原子性

(3)延迟赋值等情况

 

三、计数器实现

背景:控制1分钟内的请求拉取照片次数

1、原代码实现:

1 String key = "gateway_ext_fetchdata_" + model.getExtCode();
2 try {
3 String accessCount = flowControl.get(key); 取计数器的值
4 if (accessCount == null) { 判断
5 accessCount = "0";
6 flowControl.set(key, accessCount, 1, TimeUnit.MINUTES); 设置计数器的值
7 }
8
9 int count = Integer.parseInt(accessCount);
10 logger.info("拉取照片请求流量控制, extCode={}, key={}, currCount={}", model.getExtCode(), key, count);
11 if (count >= 100) {
12 model.setRet(RetCodeEnum.INTERFACE_LIMIT, "调用过于频繁");
13 logger.warn("拉取照片请求流量控制, 机构调用过于频繁, extCode={}, key={}, currCount={}", model.getExtCode(), key, count);
14 return;
15 } else {
16 flowControl.increment(key, 1); 修改计数器的值
17 }
18 } catch (Exception e) {
19 logger.error("拉取照片请求流量控制异常, extCode={}, key={}, exception={}", model.getExtCode(), key, e);
20 model.setRetCode(RetCodeEnum.FAILED);
21 return;
22 }

问题是类 "延迟初始化" 问题

计数器的key:作用标识_+机构名称+精确到天的日期

2. multi exec 事务

3. redis + lua

 

转:https://www.cnblogs.com/mokayy/p/8572441.html



推荐阅读
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • 本文详细介绍了Linux系统中信号量的相关函数,包括sem_init、sem_wait、sem_post和sem_destroy,解释了它们的功能和使用方法,并提供了示例代码。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • Beetl是一款先进的Java模板引擎,以其丰富的功能、直观的语法、卓越的性能和易于维护的特点著称。它不仅适用于高响应需求的大型网站,也适合功能复杂的CMS管理系统,提供了一种全新的模板开发体验。 ... [详细]
  • Java 中的十进制样式 getZeroDigit()方法,示例 ... [详细]
  • publicclassBindActionextendsActionSupport{privateStringproString;privateStringcitString; ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
  • Requests库的基本使用方法
    本文介绍了Python中Requests库的基础用法,包括如何安装、GET和POST请求的实现、如何处理Cookies和Headers,以及如何解析JSON响应。相比urllib库,Requests库提供了更为简洁高效的接口来处理HTTP请求。 ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 本文探讨了如何将个人经历,特别是非传统的职业路径,转化为职业生涯中的优势。通过作者的亲身经历,展示了舞蹈生涯对商业思维的影响。 ... [详细]
  • 本文通过C++语言实现了一个递归算法,用于解析并计算数学表达式的值。该算法能够处理加法、减法、乘法和除法操作。 ... [详细]
author-avatar
学海无涯
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有