自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 资源 (4)
  • 收藏
  • 关注

原创 rabbitMQ插件实现延时队列引发的事故

对,你没有看错,上一篇分享插件使用,现在分享插件引发的事故大背景:使用延迟队列的目的是要对一部分MQ数据做延迟查询,具体如下:场景: 生产者(业务方)发送MQ消息,消费者(数据服务)接收到MQ之后,查询业务方数据,之后做计算并落库存在问题:业务方使用主从分离模式,写主,读从。所以当消费者接收到MQ之后去查询业务方接口,业务方查询的其实是从库,这个时候数据很有可能就不一致,实际情况下看10%左右的概率会出现从服务分层的角度讲,这个问题并不应该数据服务解决,因为数据服务就应该信任接口的数据,在当时的那

2021-05-14 17:41:40 655

原创 通过rabbitMQ插件实现延时队列

插件:rabbitmq-delayed-message-exchange官方说明因为是运维小哥安装,并不知道具体的步骤,略过安装完的效果:新增Exchange的地方会多一个选项 delayed-message但是单独选择这个类型是不能添加成功的会提示错误原因应该是本来的type被选择为 delayed-message 就不能选择具体的Exchange路由类型了 所以这里需要增加一个参数 x-delayed-type ,通过这个参数来确定路由类型,即原来的type,官放文档也指出这个参数是必

2021-03-02 16:12:32 560

原创 利用RabbitMQ消息TTL、队列TTL、DLX 实现延时队列

概念TTL(Time To Live) 生存时间(消息有效期等)DLX (Dead letter exchange)死信交换机场景X秒之后查询某订单支付结果B服务更新数据时发出MQ,A服务消费该MQ查询B服务数据并听不到自己数据库,B服务使用主从分离,主从存在延时,A、B服务数据可能不一致X分钟后重试请求实现逻辑RabbitMQ原生不支持延迟队列,但是RabbitMQ的消息可以有生存时间(TTL),并且可以在消息生存时间结束之后可以转送到指定的DLX中,这样就可以将一个exchange作

2021-02-26 18:01:03 349

原创 gradle 构建错误问题解决汇总

通过已经存在的代码使用IDEA构建项目,并且本身没用过gradle,也没有项目相关的构建文档,所以摸索着来构建项目,一路踩坑,整理成笔记,记录下来。问题一:构建服务提示 org.gradle.api.internal.ClosureBackedAction 错误错误提示:Build file /Users/xxx/build.gradle' line: 4A problem occurred evaluating root project 'xxx'.> org.gradle.api.in

2020-09-10 19:29:26 8083

原创 redisTepmlate操作redis异常: WRONGTYPE Operation against a key holding the wrong kind of value

RedisTemplate操作redis,异常错误:Caused by: io.lettuce.core.RedisCommandExecutionException: WRONGTYPE Operation against a key holding the wrong kind of value at io.lettuce.core.ExceptionFactory.createExecutionException(ExceptionFactory.java:135) at io.le

2020-07-13 16:30:14 2009

原创 JDK8中stream处理数据常用例子

处理List数据的时候往往需要通过一个for循环或者while 循环。在JDK8中引入了Stream,通过stream,可以便捷地处理List,并且减少比较多模版式的代码,在Stream中也可以使用lambda表达式。直接demoforeach//简单foreach输出List<Integer> list = buildList(1,2,3,4,6,7,8);list.stream().forEach(element -> { System.out.print(e

2020-06-10 00:49:28 602 1

原创 MongoDB 带排序查询异常:Sort operation used more than the maximum 33554432 bytes of RAM

数据迁移:根据用户ID来迁移数据,分页查询,根据创建时间排序。发现10W+的数据同步之后只有7.2w多条,并且几乎每一个10w左右的数据量的用户都存在这样的问题,查找日志发现mongoDB有错误如下:Caused by: com.mongodb.MongoQueryException: Query failed with error code 96 and error message 'Executor error during find command: OperationFailed: Sort

2020-06-04 16:02:47 1698

原创 TP50、TP90、TP99、TP999等TP系列或者95line、99.9line 等line系列的含义

前几天优化服务性能在cat看到了一些title大部分都很好理解其中95line、99.9line是什么就不理解了查询百度没查到啥,反而查到了

2020-05-26 11:45:55 5765 2

原创 mongoDB生成自增Id

问题:mongoBD在写入数据之后系统会自动生成的12字节唯一标识,作为ID即相当于mysql的主键ID,这里想使用自增的数值来作为ID,但是mongo并不支持解决:需要ID数值自增,则基本上需要自己控制累加操作,可以借助redis生成唯一ID,redis本身单线程也有原子操作,保证ID唯不重复。这里既然已经接入了mongo,并且mongo也有原子操作,完全可以支持ID自增,直接使用mongo省...

2020-03-19 20:40:11 2125

原创 SpringBoot接入mongoDB使用MongoTemplate对数据进行操作

引入依赖 spring-boot-starter-data-mongodb <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> &...

2020-03-18 16:22:04 495

原创 Google Guava 维护本地缓存

背景业务场景:有一个工单系统,需要通过用户姓名查询工单(用户大概在3K左右)存在问题:工单系统本身不维护用户信息,仅存在一个用户ID,但是功能需要通过用户姓名搜索用户数据来自两个服务,也就是用户有两个数据源,两个数据源均不支持使用户姓名搜索数据分页数据源不支持批量获取数据解决方案:方案一: 工单系统维护用户数据,写入DB。优点:直接支持分页、用户名搜索等。缺点:...

2020-01-11 18:44:50 286

原创 RabbitTemplate单元测试以及使用Jackson2JsonMessageConverter作为messageConverter问题笔记

需求:用户基本信息修改成功之后,需要同步修改的用户信息给别的服务,同步其冗余的用户信息。设计思路修改完成用户信息数据库已经结束操作确保已经写入数据库之后发送更新后的用户信息。发送消息操作单独启动一个线程发送,统一使用一个线程池管理。MQ选用RabbitMQ,服务内使用CachingConnectionFactory创建和维护MQ连接,统一使用RabbitTemplate发送消息。...

2019-10-16 21:28:17 2735

原创 lombok实践

为什么需要lombok为什么要用lombok实际编码中遇到的问题:个别javaBean的属性很多至少每个javaBean都需要写getter/setter(虽然可以生成)有的大佬在getter/setter里写逻辑导致数据异常排查十分困难生成getter/setter的代码返回值不统一,有的setter可能会返回this,有的是void增加属性的同时需要重新生成toString、e...

2019-09-29 01:44:27 190

原创 事务与ACID

事务事务就是一组原子性的SQL查询,或者说一个独立的工作单元。如果数据库引擎能够成功的对数据库应用该组查询的全部语句,那么就执行改组查询。如果其中有任何一条语句因为崩溃或者其他原因无法执行,那么所有的语句都不会被执行。也就是说,事务内的语句,要么全部执行成功,要么全部执行失败。ACIDACID 表示__原子性__(Atomicity)、一致性(Consistency)、独立性(Iso...

2018-10-28 23:30:37 237

原创 BASE理论

BASE 理论是对 CAP 中一致性和可用性权衡的结果,其来源于对大型互联网分布式实践的总结,是基于 CAP 定理逐步演化而来的。BASE就是为了解决关系数据库强一致性引起的问题而引起的可用性降低而提出的解决方案。可以说基本上都是针对CAP中一些问题的一些容错或者弱化。下面就根据个人的理解进行简单分析解释。BASE 不是base这个单词的含义。BASE中 :BA 是 Basical...

2018-10-24 22:54:59 2284

原创 CAP定理

何为CAP引用百度来的解释:CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。下面根据我的理解来逐个分析一下。一致性(Consistency)何为一致性在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据...

2018-10-24 03:12:22 709

原创 “Happens-before”规则和 8种内存交互的原子操作

程序次序规则:在一个线程内,按照程序代码的顺序,书写在前面的操作现行发生于书写在后面的操作。准确的说,应该是控制流的顺序而不是程序代码顺序,因为要考虑分支循环的等结构。管程锁定规则: 一个unlock操作现行发生于后面一个对同一个锁的lock操作。这里必须强调的是同一个锁,而”后面”是指时间上的先后顺序volatile变量规则:对一个volatitle变量的写操作先发生于后面的对这个变量的读...

2018-09-13 21:59:19 961

原创 LeetCode两个爬楼梯题目解析(动态规划)

原题: https://leetcode-cn.com/problems/climbing-stairs/description/ https://leetcode-cn.com/problems/min-cost-climbing-stairs/description/就光贴源码好了,解析都在注释里面了。import java.util.HashMap;/** *...

2018-09-04 14:43:36 1004

原创 简述 volatile 特性以及原理

多处理器的计算机能够暂时在寄存器或本地内存缓冲区中保存内存中的值。结果是,运行在不同处理器上的线程可能在同一内存位置取到不同的值。 编译器可以改变指令执行的顺序以使吞吐量最大化,这种顺序上的变化不会改变代码的语义,但是编译器假定内存的值仅仅在代码中有显式的修改指令时才会改变。然而,内存的值 volatile关键字为实例域的同步访问提供了一种免锁机制。如果声明一个域为volat...

2018-08-30 01:07:58 1117

转载 memcached 小笔记

记录一些从别的博客上看到,小知识点吧 没有什么顺序 没什么图 看到就记录下来。Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmapMemcached缓存实例是独立于各个应用服务器实例运行的,因此应用服务实例可...

2018-08-17 00:30:15 268

原创 原子性、有序性和可见性

概述 多任务处理在现代计算机操作系统中几乎已是一项必备的功能了。在许多情况下,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统速度的差距太大,大量的时间都花费在磁盘I/O、网络通信或者数据库访问上。如果不希望处理器在大部分时间里都处于等待其他资源的状态,就必须使用一些手段去把处理器的运算能力“压榨”出来,否则就会造成很...

2018-08-09 23:57:38 457

原创 JAVA 中的 CAS 和 ABA

学习多线程的时候看到很多人说CAS,并且在concurrent包里面到处都是CAS,就稍微去学习了一下。稍微做个总结CAS:CAS: Compare and Swap 直接翻译就是 比较并交换。 直接从字面上理解就会发现我们已经有了疑问:比较,和什么比较,或者谁和谁比较。比较,以什么方式来比较。交换,和什么交换,或者谁和谁交换。Compare谁和谁比较 先找At...

2018-07-30 01:07:08 470

原创 HashMap和HashTable

相同:都保存映射关系数据,即键值对。HashTable 键值对结构: /** * Hashtable bucket collision list entry */ private static class Entry&amp;lt;K,V&amp;gt; implements Map.Entry&amp;lt;K,V&amp;gt; { final int has...

2018-07-21 00:57:47 223

原创 Java实现简单的链表-面向初学者

很久之前用C语言实现过链表,现在已经太久没用C语言。就先用JAVA实现一个简单链表好了,还是使用最原始的C语言实现的思路,想来语言变了实现方式大同小异吧。后续可能会不断实现不一样的数据结构。节点 先确定节点数据结构(一个节点一个数字好了),后续慢慢一点点扩展:/** * @author hsf * @description * @create 2018-07-14 下午3:47...

2018-07-15 02:24:24 19203 4

原创 学习笔记-HashMap

面试问候语—HashMapHashMap简直就像问候语一样,面试官问一个HashMap,应聘者呢回答一下表示相互的尊敬。 + 散列表 我觉得说HashMap之前应该先说一下散列表(hash table)。散列表在进行插入,删除,查找的效率都是很高的,不考虑哈希冲突的情况下,仅需一次定位即可完成,时间复杂度为O(1)。对于散列表来说,确定元素的位置,就类似于在一个数组力通过下标确定元素一样。...

2018-07-13 23:53:26 225

原创 visual studio code + react 开发环境搭建

开发环境 windows开发工具 visual studio codenode 安装和 npmwindows 安装node 可以直接在 node官网 直接下载直接当作普通软件安装即可。 安装完成可以在控制台中运行node测试是否安装成功 win + r 输入 cmd ,直接在终端输入node -v 输出版本号及已经成功安装。 目前新版本的node自带npm(npm 是随...

2018-07-13 23:51:03 42090 4

Mac GHC 8.6.3 64位

Mac GHC 8.6.3 64位 压缩包, GHC包括一个高效的Haskell编译器ghc,以及一个相似 python 交互环境的解释器 ghci 。GHC能够编译生成高效的可运行程序。

2019-02-18

GenerateAllSetter

GenerateAllSetter idea插件,直接使用本地安装到idea中. 针对属性很多的BEAN可以在某方法中直接生成bean对应的所有setter 方便接口数据赋值或者mock

2019-02-13

空空如也

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

TA关注的人

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