笔记
DatDreamer
这个作者很懒,什么都没留下…
展开
-
Redis分布式锁的注意点总结 + 参考代码
推荐阅读:Redis分布式锁的正确实现方式介绍直接说重点:setnx命令,key自然是锁名。value是requestId,即请求标识,能够区分不同的客户端,保证锁只能由加锁的客户端释放expireTime 直接作为setnx的参数,而不是单独的设置过期时间,保证原子性释放锁时,判断value是否相等,然后再释放锁。但**关键是用lua脚本,保证原子性**因为文章里都讲得很好很清楚,我就不赘述了。感叹一下在实际做项目前,准备面试点,只理解到setnx一同设置过期时间,还觉得这个问题很简单原创 2020-08-15 11:31:37 · 588 阅读 · 0 评论 -
需要根据异常,进行相关处理代码应该放MVC哪一层的思考
当需要根据异常进行处理,但同时也希望service回滚事务时。笔者之前的做法一直都是service层进行操作try{...}catch(xxxException e){相关处理throw e}但这个其实是不对的,常见于 controller层调用service层,应该把相关处理做法放到controller层。原因:对service来说,你是希望它回滚的,catch再抛就有点冗余。controller层本就应该处理异常,需要返回错误信息给应用人员。更本质的是,这个相关处理很多时候是与原创 2020-08-13 12:04:16 · 399 阅读 · 0 评论 -
RabbitMQ 消费者确认auto 和 manual 模式对异常的处理区别(含重试、requeue的影响)
本文用于解答下述疑问:消息在下面四个条件的处理方式:两种模式是否有异常、是否捕获异常是否设置重试requeue为true / false ( + default-requeue-rejected的影响)看似是 2 4 种方案,让人头疼,但其实没那么复杂。总结中也会给出简洁的答案。文章目录正文auto自动确认manual人工确认default-requeue-rejected 属性导致死循环的情况总结正文本文环境: springboot 2.1.9.RELEASE + amqp-cli原创 2020-08-12 09:49:16 · 4781 阅读 · 2 评论 -
RabbitMQ---重新投递到不存在的exchange 导致MQ无法提供服务
记一个很神奇的bug。场景:开启生产者确认模式,指定了自定义ConfirmCallback实现类。尝试投递到不存在的exchange,成功回调confim接口,随后再次重发该信息。但意外的是,不止没有回调confirm接口。还导致整个rabbitMQ卡死,发送消息到其他交换机一样无作用。原因:上述操作:“尝试投递到不存在的exchange”,会产生一个ERROR:ERROR org.springframework.amqp.rabbit.connection.CachingConnectionF原创 2020-08-09 18:54:27 · 1409 阅读 · 2 评论 -
log4j2 输出指定单一日志级别(不是该级别及其以上!!!)
只输出单一级别,而不是本级及以上的级别日志。直接上代码eg: 只输出WARN级别<!--经测试,console标签里面也可以用,RollingFile没有测试,应该也可以--><File name="FileWarn" fileName="${FILE_PATH}/warn.log" append="false"> <Filters> <ThresholdFilter level="ERROR" onMatch="DENY" onMisma原创 2020-08-07 17:53:34 · 3140 阅读 · 1 评论 -
secKill项目 --- @AccessLimit用法的问题
先附上原本的代码:项目中,用了拦截器,用于简化限流判断@Servicepublic class AccessInterceptor extends HandlerInterceptorAdapter{ @Autowired MiaoshaUserService miaoshaUserService; @Autowired RedisService redisService; @Override public boolean preHandle(HttpServletRequest re原创 2020-07-24 15:29:41 · 1694 阅读 · 0 评论 -
Mysql普通索引和唯一索引触发next-key和行锁的时机总结
最近学完next-key,有点搞不清什么时候会使用next-key,什么时候会降级为行锁,所以测试了一下,归纳一下。普通索引参考的文章:MySQL使用普通索引检索时产生的next-key lock和gap lock的范围测试想要自己测试的朋友可以参考一下改文章的做法。本文用的数据以10为间隔,[0,100]。测试的都是会正常触发next-key的情况,即以下这些情况 ,本文统一以"查询"为例,但其他操作都是一样的select .. for updateselect .. in share m原创 2020-05-17 18:34:40 · 2169 阅读 · 4 评论 -
ConcurrentHashMap的sizeCtl含义纠正
引言:本文基于JDK1.8版本,而且对ConcurrentHashMap有一定了解的人,本文并非科普该类的用法,而是针对sizeCtl的含义做出纠正科普文章推荐:深入浅出ConcurrentHashMap1.8sizeCtl定义及注释 /** * Table initialization and resizing control. When negative, the ...原创 2020-04-06 23:41:06 · 8684 阅读 · 13 评论 -
volatile禁止重排序详解
首先说明本文并不是讲解volatile不保证原子性、如何保证可见性xxxx,还不懂的请参考让你彻底理解volatile并发关键字volatile(重排序和内存屏障)本文针对以下两个问题解答1. 重排序规则中,volatile读写跟普通读写有什么关系,为什么要限制它们2. volatile读操作的内存屏障的LoadLoad屏障到底是在读前还是读后直接进入主题重排序规则中,volatil...原创 2020-03-22 15:25:56 · 3099 阅读 · 23 评论 -
泛型PECS的理解
首先说明本文不是解释或教学PECS的,如果还不懂的读者可以参考下文。Java泛型中的PECS原则本文针对上述两个下划线部分阐述自己的理解。extends不能写入吗?确切地说,并不是。就比如List的常用实现类ArrayList是允许存null的,当然这个是视不同数据结构规则不一样。但除了null外,任何对象(包括Obeject)也不能写入,如图。super不能读数据吗?确切地说,...原创 2020-03-16 22:23:14 · 266 阅读 · 0 评论 -
位运算获取、去除二进制中最右边的1
2的幂刷LeetCode看到题解的时候,不禁膜拜神奇的位运算,O(1)时间即可完成,因此mark下这篇文章获取二进制中最右边的1x&(-x)就是这么简洁,就能实现获取到二进制中最右边的 1,且其它位设置为 0。原因:首先在补码表示法中,负数的补码 = 取反 +1,这个都知道,但你可能没发现:取反后:最右边的 0 的位置对应于 最右边的 1 的位置,而取反后 +1 ,则会把该...原创 2020-03-05 14:29:25 · 4871 阅读 · 4 评论 -
leetCode169. 多数元素Boyer-Moore 投票算法
求众数本质上,Boyer-Moore 算法就是找 nums 的一个后缀 sufsuf ,其中 suf[0]suf[0] 就是后缀中的众数。我们维护一个计数器,如果遇到一个我们目前的候选众数,就将计数器加一,否则减一。只要计数器等于 0 ,我们就将 nums 中之前访问的数字全部 忘记 ,并把下一个数字当做候选的众数。直观上这个算法不是特别明显为何是对的,我们先看下面这个例子(竖线用来划分每次...转载 2020-03-13 15:38:54 · 164 阅读 · 0 评论