自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(8)
  • 收藏
  • 关注

原创 Spring事物注解@Transactional与代码锁冲突原因分析

业务场景如下:用户频繁(疯狂)点击送礼物按钮给主播刷礼物代码实现业务步骤:1.查询礼物金额2.查询用户钱包金额3.查询钱包余额是否充足4.用户钱包减去礼物金额5.主播钱包增加礼物金额代码方案:1.因为涉及金额问题,且操作中需要对用户和主播的钱包都进行相应操作,所以需要使用@Transactional事物注解。2.因用户频繁点击场景,为了防止用户钱包余额校验等金额问题出现异常,需要使用分布式锁或synchronized单机锁进行安全处理。为什么要设计的这么严格:如果

2021-02-09 15:01:21 664

原创 提升工作幸福指数工具类 实用redisKey管理工具类

问题:实际工作中经常遇到要使用redis配合的业务场景,那么就避免不了定义redis的key,在实际业务中为了区分key经常需要对key进行业务拼接,如 user:info:id:123 。遇到上述情况常规方案 伪代码如下:// 定义常量redisKeypublic static final String USER_INFO_ID= "user:info:id:";// 将常量与变量拼接String redisKey =USER_INFO_ID+"123";// 使用拼接好的redis..

2020-12-23 17:18:11 290

原创 微信高并发下红包功能实战JAVA版(一)整体实现思路

逛知乎时偶然发现一篇微信红包的实战案例,阅读之后对文章的实现思路有些自己的看法,所以分享给各位小伙伴。1.业务流程相信大家都使用过微信抢红包功能,业务流程如下:1.土豪发红包: a.设置红包金额 b.设置红包数量2.我们去抢土豪发出的红包 a.手快-获得随机金额红包 b.手慢-红包被抢完这里有几个隐藏的逻辑:1.土豪发红包时,设置的金额与数量是有最小金额限制的------单个红包金额不可低于0.01元2.抢红包时,如果红包数大于1,即使最后一个...

2020-10-13 21:42:51 1056 3

原创 Java实现 接口请求频率限制方案源码

实际工作中在某些业务场景会遇到一个问题,用户疯狂点击某个按钮功能导致接口在短时间内被重复请求多次,且这些重复请求在业务上是无效的请求,这个问题即会导致后端出现大量重复无效或错误的数据,也会对后端服务器等造成影响。解决方案需要从服务端的部署方式出发1.集群部署(如果nginx等转发服务器采用按IP或SESSION_ID等方式的转发策略也可使用单机部署的方案):集群部署的情况推荐使用redis分布式锁进行处理,具体代码方案参考之前的文章:Java+RedisTemplate 实现redis分布式锁

2020-09-15 20:26:19 4284 2

原创 Java+RedisTemplate 实现redis分布式锁

api demo:set("key","value",30, TimeUnit.SECONDS);redisTemplate demo:redisTemplate.opsForValue().setIfAbsent("onlykey","value",10, TimeUnit.SECONDS);setnx大致原理,主要依托了它的key不存在才能set成功的特性,进程A拿到锁,在没有删除锁的Key时,进程B自然获取锁就失败了。使用redisTemplate setIfAb...

2020-05-29 17:35:52 2260

原创 split字符串拆分踩坑记录(字符串拆分后数组下标越界解决方案)

问题:使用split拆分String字符串后拿到的数组发现一个问题-如果拆分的字符串根据拆分规则拆分后,后面的未知上如果没有值,则split返回的数组会自动忽略它们。demo:代码第四行返回的数组长度是4,如果是批量处理String操作,使用array[4]时就会报错下标越界问题String temp = "1,2,3,4,5";System.out.println(temp.split(",").length); //5temp = "1,2,3,4,";System.out.printl

2020-05-26 14:43:25 3827

原创 提升工作幸福指数工具类 适合绝大部分代码场景:判断是否为空/不为空

Optional对象Optional是Java8新加入的一个容器,这个容器只存1个或0个元素,它用于防止出现NullpointException,它提供如下方法:isPresent()判断容器中是否有值。(使用频率最高)ifPresent(Consume lambda)容器若不为空则执行括号中的Lambda表达式。T get()获取容器中的元素,若容器为空则抛出NoSuchE...

2020-03-25 14:54:42 622

原创 @Scheduled 定时任务总结

@Scheduled作用:spring定时器(定时执行一次或定时轮询执行一段代码)使用场景:注解在方法上参数说明:常用参数@Scheduled 参数说明String cron:cron表达式定义了方法执行的时间规则(网上对这个的说明很多就不墨迹了)生成器工具地址-http://cron.qqe2.com/Long fixedDelay:定时任务每隔多久执行一次,单位是毫...

2018-07-27 15:22:13 48240 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除