- 博客(52)
- 收藏
- 关注
原创 高并发场景下,使用redis lua脚本实现计数范围内原子级增减
业务场景:一个时间区间内需给一批设备下发任务并让设备完成执行,该任务需要设备访问外部系统进行执行,外部设备同时仅支持60个设备同时访问。设备通过周期上报,在业务系统中获取任务下发通知。为了防止大数据高并发场景下,大量设备同时访问业务系统,查询任务通知造成的阻塞,业务系统先将一批任务通知下发到缓存中,然后通过在缓存中计数减数来限制同时有不超过外部系统最大访问量的设备在执行任务,从而达到限流的目的。...
2020-04-22 10:48:56 1435
原创 超简单mongodb 4.2分片集群搭建指南
本文以三台虚拟机为例搭建mongodb分片集群实验环境。由于config节点和mongos路由节点为单实例方式,所以现网部署不推荐此方式部署,仅供参考。现网部署应考虑config节点和mongos路由节点的高可用。部署环境:三台虚拟机 16核 32GB 200GB硬盘centos 6.9mongodb 4.2.0整体集群结构计划创建三个分片,每个分片采用一主一副已仲裁构建副本集,搭建...
2020-03-19 17:44:28 3056 2
原创 Spring boot连接和操作mongoDB
Spring boot是对Spring的进一步封装,旨在简化Spring的安装和配置过程。我们知道使用Spring搭建项目环境,往往需要引用很多jar包,并随着业务的逐渐复杂,创建出很多的xml文件。Spring boot封装了Spring集成的很多服务组件,并自动创建这些对象的实例,你只用将所需使用的服务组件的jar包引入即可快速构建开发环境。 Spring boot所集成的服务组件,可在官
2017-08-31 15:33:47 49210 4
原创 JAVA多列表求笛卡尔积的三种方法
标题1.递归实现的一种解法参考:https://blog.csdn.net/weimingjue/article/details/1010132822.lambda表达式的一种解法参考:https://www.91mszl.com/zhangwuji/article/details/1282package com.mszl.controller;import java.util.ArrayList;import java.util.Arrays;import java.util.List;
2022-04-01 12:30:42 2893
原创 EhCache存储对象注意深、浅拷贝的问题
EhCache在存储对象时,如果直接存储,例如:直接存储List对象,将使用浅拷贝处理,存储后如果对list进行操作,对应EhCache存储的对象也会变化。如果List很大,jvm垃圾回收机制不会将该对象回收,会占用堆内存,有触发OOM的风险。** 建议对需存储的对象先进行深拷贝处理再通过Ehcache存储,例如在存储前对待存储对象执行序列化操作等。**...
2020-12-21 10:44:21 659
原创 spring-data-mongodb从2.x升级至3.x版本,aggregate group操作,分组字段出现_id前缀的解决方式
背景由于Spring boot安全漏洞,须将项目中Spring boot升级至2.3.4版本,2.3.4版本集成了spring-data-mongodb 3.x版本,项目中原spring-data-mongodb 2.x版本被替换成spring-data-mongodb 3.x版本,须进行兼容性适配。spring-data-mongodb从2.x升级至3.x版本部分api变化见官网项目链接问题描述适配过程中发现,项目中存在大量aggregate group操作,例如:TypedAggregatio
2020-09-22 20:04:50 3514 2
原创 mongodb $lookup设置多个join条件,实现关联来源表(from)的查询结果集
从mongodb 3.6开始支持为$lookup操作的来源表指定多个查询条件。实现类似如下sql的效果:SELECT a.x1,a.x2...,a.xn, b.x1,b.x2...b.xnFROM aWHERE a.x1 IN (SELECT b.x1,b.x2...b.xn FROM b WHERE a.x1 = b.x1 AND b.x2 = 'xxxx' );业务场景:zw
2020-09-14 19:24:32 4603
原创 redis集群key的slotId计算方法
redis集群中根据key的slotId决定将key存储在集群哪个节点的slot段中。redis集群计算key的slotId方法:CRC16(key)%16384使用lettuce的java客户端计算键的槽值CRC16.crc16("xxxxx".getBytes())%16384
2020-08-04 17:31:51 2490
原创 燃烧我的卡路里——Spring boot项目jar包瘦身
Spring boot项目由于使用了太多依赖包,导致jar包过大,下面使用Spring boot ProperitiesLauncher加载器,从外部指定路径加载三方依赖jar包,达到项目jar包瘦身的目的Spring boot jar包瘦身的便利性将三方依赖jar包从打包的项目中移除有如下好处缩减项目jar包大小,便于网络传输。对于不经常更新的线上项目,由于三方jar包出现的安全问题(例如:fastjson多个版本被报安全问题),只需替换相关依赖jar包,无需重新发版,走提测发版流程。对于需要
2020-06-23 19:43:18 364
原创 步步为营,mongodb3.2.x版本升级至4.2.x版本全过程——面向standalone和副本集部署模式
文章目录一.standalone部署模式升级步骤1.1 升级前准备1.2 执行升级1.2.1 升级至3.4.x版本:1.2.2 从3.4.x版本升级至3.6.x版本1.2.3 从3.6.x版本升级至4.0.x版本(操作同上)1.2.4 从4.0.x版本升级至4.2.x版本(操作同上)二.副本集部署模式升级步骤2.1 升级前准备2.2 执行升级2.2.1 从3.2.x版本升级到3.4.x版本2.2.2 从3.4.x版本升级到3.6.x版本2.2.3 从3.6.x版本升级到4.0.x版本2
2020-06-18 17:12:07 2756
原创 mongodb副本集模式执行命令遭遇not authorized on admin to execute command报错的解决方式
现象分片集群的副本集登录mongo shell突然发现执行不了常用命令了,报错:Error: error: { "ok" : 0, "errmsg" : "not authorized on admin to execute command { find: \"system.users\", filter: {}, lsid: { id: UUID(\"8ae63013-55be-48db-a163-ba1148d95fce\") }, $db: \"admin\" }", "code" : 13
2020-06-16 10:55:41 8015
原创 5分钟,快速从mongodb standalone模式迁移至mongodb副本集模式,基于mongodb 3.2.x版本
从mongodb standalone模式迁移至副本集模式(3.2.x版本)步骤一:停止所有mongodb读写,否则影响数据同步。步骤二:创建副本集的mongo实例,将standalone模式的数据库文件拷贝所有副本集实例对应配置文件的dpapth路径中。注:该操作也可不进行,仅保留主库中数据文件,secoundary节点数据库文件为空,依赖副本集初始化过程的数据自动同步机制,将数据同步到secoundary节点,如果数据库较大,这样操作耗时较长。步骤三:创建集群用户:以standalone模式启
2020-06-15 21:51:34 1582
原创 mongodb执行外挂js脚本实现根据指定属性分组,提取相关属性输出到csv文件
编写js脚本,实现根据设备厂商型号分组并提取对应厂商、型号。var cursor=db.getCollection('LatestDeviceInfo').aggregate([{ "$group":{ "_id":{ "manufacturer":"$manufacturer", ...
2020-04-29 14:48:14 411
原创 java stream List转Map
//list泛型为JSONObjectMap<String, String> map = list.parallelStream().collect(Collectors .toMap(e -> MapUtils.getString(e, "deviceMac"), e -> MapUtils...
2020-04-26 14:39:46 681
原创 大数据高并发场景下存量/增量指标实时计算方法
场景如下:设备每10分钟上报一次A指标数据,需要对设备的A指标数据进行日增量/存量打标。即对于A指标,标记设备是存量设备还是增量设备。日存量/增量判断标准:将当日设备上报A指标数据的总次数,与该设备前30天内上报的A指标数据的总次数进行对比。假如前30天内总次数超过n次且当日上报A指标数据的总次数超过n次则为该设备打存量标记。假如前30天内总次数小于n次且当日上报A指标数据的总次数超过n次则...
2020-04-08 23:54:40 1846
原创 mongodb获取aggregate处理结果的总数
对mongodb执行aggregate操作命令得到结果集,前端页面展示时有时需要做分页这类场景,需要获得结果集的总数。将整个结果集都查询出来往往需要耗费很大网络io和内存。本文介绍一种方法返回经aggregate处理后结果集的记录总数。对3.4之前的mongodb版本,aggregate的stages并没有提供$count算子返回结果集记录数,可通过如下方式获得,对一个结果集记录中存在的key或...
2020-03-07 14:43:33 12186
原创 redis集群使用HashMap优化键值存储结构提升存储性能
项目中遇到Spark Streaming吞吐量太低的问题,redis集群使用HashMap优化键值存储结构提升Spark Streaming吞吐量。场景:设备将运行报文发送到kafka,Spark Streaming对报文进行加工处理,生成6类不同报文信息以json字符串形式set进redis集群。问题:kafka消费速度跟不上。分析:对于1000万设备一个上报周期上报1000万条报文...
2020-03-03 00:12:37 1146
原创 redis hashmap
redis hashmap数据结构,使用散列来组织数据。对于一条有多个属性的数据可以通过hashmap来存储数据。A hash with a few fields (where few means up to one hundred or so) is stored in a way that takes very little space, so you can store millions...
2020-03-02 00:19:46 994
原创 spring data redis使用pipline
使用stringRedisTemplate.executePipelined可以向redis批量提交一批命令,进行命令批处理。效率比遍历的方式执行单条语句要高。‘’使用pipline需要注意对客户端redis连接池的连接数。如下代码中,spring data redis客户端在执行pipline时会使用连接池中多个连接进行命令提交。当一次需发起批处理命令数较高,且命令的执行较耗时,会瞬间用尽客...
2020-02-29 16:06:24 971
原创 monogodb使用$lookup,$unwind,$project,$group,$push进行多表关联查询,提取指定字段,根据指定字段分组
mongo aggregate操作使用$lookup,$unwind,$project,$group操作符,执行多表连接查询,提取多表指定字段,对指定字段进行分组求和得到结果:db.getCollection('DeviceDetailInfo_20191230').aggregate([{$lookup:{from:'DeviceDetailInfo_20191229',localField...
2020-01-21 11:48:11 2565
原创 确定提交的spark计算任务在spark集群上的最佳分区数
在spark集群上,对于提交的spark计算任务设置合适的分区数可以极大的改善大数据的处理性能。分区数设置的太少会导致一个executor一次处理一个大容量数据块,分区数设置的太多,每个分片处理的数据量太少,在进行数据持久化时需要进行多次连接,对系统造成很大的压力,反而会降低大数据的处理性能。需要明确如下一些概念:Spark worker节点是集群中执行大数据处理的机器节点。executor...
2019-11-09 18:17:49 764
原创 mongodb $setOnInsert指令说明
$setOnInsert$setOnInsert指令往往同upsert、$set指令配合使用。mongodb官网说明:If an update operation with upsert: true results in an insert of a document, then $setOnInsert assigns the specified values to the fields ...
2019-11-06 21:56:22 7157
原创 Spark广播变量Broadcast
Spark广播变量的目的是让每个worker节点在内存中保存一个只读的对象,节省了在每次tasks创建发送到woker节点中携带该对象副本的网络IO。一些需要在多个task中使用的,不可变的大数据集合对象尤其适合被定义程广播变量。广播变量的定义方法,fron Spark官网:val broadcastVar = sc.broadcast(Array(1, 2, 3)) //sc是SparkC...
2019-11-05 22:35:40 375
原创 Spark mapPartitions、map、foreachPartition、foreach算子的区别、误区和正确用法
mapPartitions、map、foreachPartition、foreach的区别mapPartitions和map是transform算子,分别返回一个iterator迭代器和RDD。foreachPartition、foreach是action算子,无返回值。用于结果的输出操作mapPartitions、foreachPartition中定义的是一个RDD的每一个分区的统一处理逻...
2019-11-05 22:09:44 1447
原创 Spring boot项目设置加载静态资源的路径(spring.resources.static-locations)
默认Springboot将从如下位置按如下顺序加载jar包对应前端静态资源:1.jar包同级static目录2.jar包同级public目录3.jar包同级resource目录4.jar包/META-INF/resources在调试模式下,Springboot将从class目录中按如下顺序加载对应前端静态资源1.class目录下static目录2.class目录下public目录3...
2019-10-25 13:18:00 27728 7
原创 使用mybatis plus代码生成器生成代码(自定义不同类型文件的生成路径)
mybatis plus在mybatis基础上进行了封装和加强,旨在提供方便的面向持久层的操作,类似Spring JPA。配置方法和详细介绍见官网。mybatis plus提供代码生成器可以方便开发者生成xml、dao、service、controller、entity层代码,简化常规crud的代码和实体类映射编码。下面提供配置模板示例,供参考,其中包含自定义指定不同类型文件在项目中的路径。...
2019-10-23 17:09:08 4779 7
原创 redis内存淘汰机制(redis内存耗尽触发自动回收机制)
线上运行的系统出现键丢失的情况。通过redis-cli登录redis,输入info命令查看redis内存使用情况。如图所示:可见内存已经被使用的差不多了,内存使用峰值已经超过redis最大内存量,触发了内存回收策略,导致后续写入内存操作被拒绝了。造成“键丢失”的现象。redis内存淘汰策略有6种:noeviction:当内存不足以容纳新写入数据时,新写入操作会报错allkeys-lru...
2019-09-10 15:22:08 2960
原创 maven打可执行jar包,scope设为provided失效,引用jar包仍会打包到libs目录中的解决办法(可执行jar包加载外部依赖解决办法,面向基于Spring构建的项目)
适用场景在项目中遇到需求,根据不同省份需要依赖不同的jar包执行相同逻辑。由于不同省份jar包不同,且存在同一jar包不同版本,导致高版本覆盖低版本的问题,同时为缩减项目包的大小。所以希望将这部分jar包通过外部引入的方式在运行时动态加载而非放入可执行jar包的libs目录下。这样项目分省部署只需依赖相关省份的jar包即可。出现问题基于此,根据maven的scope作用域(可参见之前博文),...
2019-08-26 20:39:14 4285 3
原创 windows系统中java项目编译的target文件删除报“文件夹或文件已在另一个程序中打开”解决办法
在java项目编译完成后有时需要删除target文件夹或其中jar,进行重新编译和打包。windows系统中偶尔会报“文件夹或文件已在另一个程序中打开”。导致删除失败的问题。有时开的软件和进程太多不好排查,最后只能采取简单粗暴的重启方式。下面提供一种快速的解决方法避免重启。该问题的本质其实是“windows文件夹或文件已在另一程序中打开”的问题。以win10系统为例。可以通过任务管理器——&...
2019-08-23 14:32:45 3401
原创 Spring Boot Actuator监控基于Spring boot的应用系统运行情况
Spring Boot Actuator提供了一组http接口,用于在应用运行时,监控和管理应用的运行情况。Spring boot Actuator内置EndPointsSpring boot Actuator提供了一组基于HTTP和JMX内置的EndPoints用于在系统运行时监控系统的运行情况。详情可以参见Spring boot官网在此列举一些常用的内置EndPoints:beans:...
2019-08-21 21:42:01 802
原创 记Spring boot 2.x logback在配置与应用分离的情况下读取application.yml环境变量出现的问题及解决
Spring boot支持已自定义的方式设置日志。详见官网自定义设置日志小节由于spring对日志对象的初始化先于application context创建之前,所以我们不能以 @PropertySources 或 @Configuration的方式去实例化日志对象,对日志进行设置。只能通过定义的系统属性。根据Spring官网,其指定了特定命令规范的xml配置文件,用于进行自定义的日志文件配置。...
2019-08-19 21:35:24 2030
原创 IDEA code template配置和参数详解
IDEA中通过设置code template,可以自定义文件初始化模板。具体创建过程如下,同学们可以参考借鉴。打开设置界面,注意通过setting进行设置作用范围仅在当前project。通过other setting —> Seting for New Project进行设置,作用范围是所有新创建的project空间。选择Editor—>File and Code Templa...
2019-08-08 20:28:36 16097
原创 Maven dependency的scope作用域
maven官网对于scope的6种类型解释的较简洁,并不能让人很好理解。在此进行翻译并结合项目经历做进一步拓展解释。以下摘自maven官网:compilemaven默认的scope如果<dependency>未显式声明<scope>,则默认使用compile,当前项目中所有模块都可直接引用被修饰的jar包。并且可以以传递依赖的方式被其他项目直接引用。pro...
2019-08-01 08:45:54 559
原创 Apache shiro源码解读——Realm调用过程(从SecurityUtils.getSubject().login(token)开始)
文章目录shiro是啥shiro中的三个核心模型抽象从SecurityUtils.getSubject().login(token)开始一段源码解读自定义Realm的两种轻松实现方式方式一方式二shiro是啥根据官网介绍,“Apache Shiro™ is a powerful and easy-to-use Java security framework that performs auth...
2019-07-30 21:33:54 2759
原创 Spring Data MongoDB aggregate添加allowDiskUse属性
mongo对大数据集进行aggregate集合操作,处理各stage阶段中,为了避免 pipeline 的 stage 的内存使用超过 100 MB 而报错。需要设置allowDiskUse为true使用系统缓存,以临时文件进行存储。Spring Data MongoDB api不同版本对allowDiskUse设置的操作写法不同。对于Spring Data MongoDB 1.5.x以上2....
2019-07-29 16:54:51 9797
原创 Spring Data api常用mongoDB操作(不定期更新)
使用projections查询collection中指定属性 Query query=new Query(); Criteria criteria=new Criteria(); criteria.and("accountId").is(accountId); query.addCriteria(criteria); query.f...
2019-07-24 19:57:09 2606
原创 基于spring data操作mongoDB数据库数据持久层(dao层)设计感悟
spring data项目旨在对不同数据源提供一组相似的、较一致的具有spring style的交互方法。目的方便用户对不同数据源(关系数据库、非关系性数据等)的api操作,并简化系统持久层的代码逻辑结构。spring data项目包含多个子项目,不同数据源有不同的子项目对应。详见spring data官方文档 。项目中的问题以及本文目的在项目开发过程中由于前期没有很好规划,mongoDB操作...
2019-07-13 20:19:37 2328
原创 JMockit对方法体中new出来的对象mock以及对Spring RestTemplate类的mock操作
JMockit对方法体中new出来的对象mock以及对Spring RestTemplate类的mock操作我们知道在Spring项目中用jmockit编写单元测试。对于sevice类中@Autowired的对象用@Injectable进行mock,然后在Expection中进行相应方法的mock,类似这样:@RunWith(JMockit.class)public class ATest{...
2018-11-02 14:11:19 7781
原创 IDEA创建Spring MVC maven web模块
在IDEA中创建一个基于maven的spring mvc web项目一、创建一个空maven项目作为父模块二、在父模块中创建一个web项目选中父模块–&amp;gt;new–&amp;gt;新建maven项目–&amp;gt;勾选create from archetype下面的web模板,如图。 点击next,输入与父模块相同的groupId并确定模块唯一artifactId,如图: ne...
2018-06-02 17:38:40 855
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人