- 博客(67)
- 资源 (2)
- 收藏
- 关注
原创 支付中心“收银台“设计方案
在设计医疗场景下的收银台应用产品时,需要考虑到多方面的需求,比如保护患者信息的安全、提高工作效率、简单易用等等。由于医院等级越高,业务系统越复杂,因此需要为产品设计相应的模块和功能,以满足不同的业务需求和用户群体。同时,还需要确保产品简单易懂,适应不同用户的需求。此外,收银台应用产品还可以应用到其他的场景中,比如食堂收费、停车收费等。产品设计需要根据不同的业务需求,为产品设计相应的功能,以满足用户的需求。
2023-06-26 20:51:58
1835
原创 Spring Boot集成Redisson布隆过滤器案例
布隆过滤器实际上是一个非常长的二进制向量(bitmap)和一系列随机哈希函数。那什么又叫哈希函数呢?哈希函数指将哈希表中元素的关键键值通过一定的函数关系映射为元素存储位置的函数。(HashMap源码)布隆过滤器存储空间和插入/查询时间都是常数Hash函数相互之间没有关系,方便由硬件并行实现布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势布隆过滤器可以表示全集,其它任何数据结构都不能有一定的误判率(常见的弥补措施是:建立一个小的白名单,存储那些可能被误判的元素。
2023-06-06 20:26:04
958
原创 账户中心四个账户设计案例
用户在平台消费产生订单,商家执行订单履约,履约完成后用户确认收货,此时系统将执行清算,订单内第三方支付金额将记入商家收入现金账户,如果有积分抵扣部分将记入收入积分账户,具体入账金额计算方式为通过订单内商品设置的积分折扣,计算出每个商品需要收取的平台使用费,在按照积分抵扣比例,分别计算到每个商品上,最终计算出平台现金佣金X元,平台积分佣金Y元,订单实付金额扣除平台佣金后为商家实际入账金额;平台角度,生成平台使用费账户,主要通过商家设置商品的积分比例计算出的平台抽佣金额,可分为已结算金额、冻结金额、在途金额。
2023-03-24 15:40:52
1352
原创 微服务工程以及领域驱动设计(DDD)的六个维度思考理解
(1) 单一每层只处理一类事情,util只承载工具对象,integration只处理外部服务,每层职责单一且清晰(2) 降噪如无必要勿增实体,例如查询结果DTO只透出最关键字段,例如运动员ID、创建时间、修改时间等业务不强字段无须透出(3) 适配service、facade、intergration层都存在适配器,翻译信息为本层或者下层可以理解的信息(4) 纵向domain service内聚本领域业务(5) 横向application service编排多个领域业务(6) 数据。
2023-03-24 14:58:44
951
原创 SpringBoot中解决Redis的缓存穿透、缓存击穿、缓存雪崩案例
缓存穿透指的是一个缓存系统无法缓存某个查询的数据,从而导致这个查询每一次都要访问数据库。常见的Redis缓存穿透场景包括:查询一个不存在的数据:攻击者可能会发送一些无效的查询来触发缓存穿透。查询一些非常热门的数据:如果一个数据被访问的非常频繁,那么可能会导致缓存系统无法处理这些请求,从而造成缓存穿透。查询一些异常数据:这种情况通常发生在数据服务出现故障或异常时,从而造成缓存系统无法访问相关数据,从而导致缓存穿透。
2023-03-21 19:05:55
594
原创 Reactor响应式流的核心机制——背压机制
响应式流规范定义的很简洁,但实现起来并不简单,发布者和订阅者之间的所有交互的异步性质以及背压机制使得实现变得复杂。响应式流规范非常灵活,还可以提供独立的“推”模型和“拉”模型。如果为了实现纯“推”模型,我们可以考虑一次请求足够多的元素;而对于纯“拉”模型,相当于就是在每次调用 Subscriber 的 onNext() 方法时只请求一个新元素。JDK 9 中提供了 Flow 响应式流接口,与响应式流兼容的接口,可以看得出,JDK 团队后续的发展趋势也是想往响应式流这块靠近。
2023-03-10 19:56:09
1065
原创 响应式操作实战案例
注意,所有事件,甚至终止事件,都是可选的:没有 onNext 事件,但是 onComplete 事件表示一个空的有限序列,但是移除 onComplete 并且你有一个无限的空序列(除了关于取消的测试之外,没有特别有用)。如果我们已经有了一个数组、一个 Iterable 对象或 Stream 对象,那么就可以通过 Flux 提供的 fromXXX() 方法组来从这些对象中自动创建 Flux,包括 fromArray()、fromIterable() 和 fromStream() 方法。
2023-03-10 18:37:03
636
原创 函数式接口和Lambda表达式
函数式接口——@FunctionalInterface@FunctionalInterfaceinterface IService { void insert(String message);}public class FunctionalInterfaceTest { public static void main(String[] args) { IService serviceObj = message -> System.out.println("
2022-05-17 21:13:22
155
原创 Executor框架线程池参数配置原则
线程池都经常用,但是具体的参数和具体的参数设置一定要知道,否会任务拒绝或者多线程上下文切换频繁;高并发尽量不要用java提供的FixedThreadPool和SingleThreadExecutor ,直接用ThreadPoolExecutor自己定义参数,合理的配置参数。通用的设置:* 具体的参数设置需要根据几个值来决定 - tasks :希望每秒能执行的任务数 - taskcost:平均每个任务花费时间(包含cpu轮转的时间) ...
2022-01-25 10:00:49
880
原创 Redis主从复制、哨兵、Cluster三种模式
Redis作为缓存的高效中间件,在我们日常的开发中被频繁的使用,今天就来说一说Redis的四种模式,分别是「单机版、主从复制、哨兵、以及集群模式」。可能,在一般公司的程序员使用单机版基本都能解决问题,在Redis的官网给出的数据是10W QPS,这对于应付一般的公司绰绰有余了,再不行就来个主从模式,实现读写分离,性能又大大提高.单机版Redis:单机版的Redis就比较简单了,基本90%的程序员都是用过,官网推荐操作Redis的第三方依赖库是Jedis,在SpringBoot项目中,引入...
2021-04-26 15:41:50
211
原创 设计模式之--模版方法
在面向对象系统的分析与设计过程中经常会遇到这样一种情况:对于某一个业务逻辑(算法实现)在不同的对象中有不同的细节实现,但是逻辑(算法)的框架(或通用的应用算法)是相同的。Template Method提供了这种情况的一个实现框架。Template Method模式是采用继承的方式实现这一点:将逻辑(算法)框架放在抽象基类中,并定义好细节的接口,子类中实现细节。Strategy模式解决的是和Template Method模式类似的问题,但是Strategy模式是将逻辑(算法)封装到一个类中,...
2021-01-16 16:05:01
167
1
原创 mybatis中ResultMap的使用
从SQL查询结果到领域模型实体 通过JDBC查询得到ResultSet对象 遍历ResultSet对象并将每行数据暂存到HashMap实例中,以结果集的字段名或字段别名为键,以字段值为值 根据ResultMap标签的type属性通过反射实例化领域模型 根据ResultMap标签的type属性和id、result等标签信息将HashMap中的键值对,填充到领域模型实例中并返回resultMap1、属性说明id属性 ,resultMap标签的标识。 type属性 ,返回值的全限定类名,或类
2020-12-16 14:22:19
915
原创 SpringBoot Redission实现分布式锁
为了防止分布式系统中的多个进程之间相互干扰,我们需要一种分布式协调技术来对这些进程进行调度。而这个分布式协调技术的核心就是来实现这个分布式锁。分布式锁应该具备条件互斥性 防止死锁 可重入 非阻塞 锁的力度目前我所知道的有3种方式通过 数据库实现排他锁 -- 性能比较差 不推荐 通过 zookeeper 实现 -- 目前还不了解 通过 redis(Redisson)实现 -- 通过设置过期时间 来控制锁的获取及释放Redisson 原理Redisson分布式锁的实现是基于实现R..
2020-11-04 16:12:54
542
原创 堆排序-Java版本
堆排序:堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。首先简单了解下堆结构。堆:堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图:同时,我们对堆中的结点按层进行编号,将这种逻辑结构映射到数组中就是下面这个样子该数组从逻辑上讲就是一个堆结构,我们用简单的公式来描述一下堆的定义就是:大顶堆:.
2020-11-03 17:54:40
1836
3
原创 Canal实现MySQL实时同步数据到ES
一、canal简介 canal主要用途是对MySQL数据库增量日志进行解析,提供增量数据的订阅和消费,简单说就是可以对MySQL的增量数据进行实时同步,支持同步到MySQL、Elasticsearch、HBase等数据存储中去。二、canal工作原理 canal会模拟MySQL主库和从库的交互协议,从而伪装成MySQL的从库,然后向MySQL主库发送dump协议,MySQL主库收到dump请求会向canal推送binlog,canal通过解析binlog将数据同步到其他存储中去。...
2020-11-02 16:04:48
6806
5
原创 SpringBoot集成mybatis plus强大的条件构造器queryWrapper、updateWrapper
先安利一波官方文档的链接位置,官方文档说的很详细。条件构造器关系介绍介绍 :上图绿色框为抽象类abstract 蓝色框为正常class类,可new对象 黄色箭头指向为父子类关系,箭头指向为父类wapper介绍 :Wrapper : 条件构造抽象类,最顶端父类,抽象类中提供4个方法西面贴源码展示 AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件 AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解
2020-10-13 10:15:53
1926
原创 GitLab设置全局密码添加ssh-key
公司使用git来作为代码版本控制工具,现所在公司是自己搭建私人的GitLab来管理代码,每次clone、pull、push等操作时都需要输入账号密码,如此十分繁琐。后找到解决方案,就是在本地git客户端生成ssh-key,配置到GitLab去。解决流程:1.本地操作打开本地git brash,在其中输入指令,生成ssh公钥和私钥对ssh-keygen -t rsa -C 'xxx@xxx.com'其中xxx@xxx.com即为你的邮箱地址点击回车,会让...
2020-09-23 10:57:35
995
原创 分布式消息队列 -- kafka基础知识相关
Kafkas是什么? Kafka是一个分布式消息队列, 也是一个开源消息系统,由Scala语言写成。kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接受者称为Consumer,此外 kafka集群有多个kafka实例组成,每个实例(server)称为broker。无论是kafka集群,还是consumer都依赖于zookeeper集群保存一些mate信息,来保证系统可用性。在通常的流式计算中,kafka 一般用来缓存数据,而Storm或者Spark...
2020-08-13 10:40:02
651
原创 redisson与aop解决接口幂等性
1.自定义防重复提交的注解和切面2.在需要验证的接口上增加注解(一般是创建、修改的接口)3.以每次调用的 用户唯一标识(userId或者sessionId或者token)+ 请求路径+参数 作为key,value任意值都可以,缓存起来(redis或本地缓存),并设置一个合适的缓存失效时间。4.每次调用时根据key判断,缓存是否存在,存在则抛出异常或提示,不存在则执行业务逻辑
2020-07-28 14:26:16
843
原创 Java8中常见用法
Stream是jdk8中java.util包中的新特性Stream(流)是一个来自数据源的元素队列并支持聚合操作元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。数据源流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。聚合操作类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。前面也有提到过和以前的Collection操作不同, Stream操作还有两..
2020-07-24 10:18:11
684
原创 设计模式--策略模式(注解)
策略模式策略模式可以代替if-else,策略模式实现的方式也大同小异。主要是定义统一行为(接口或抽象类),并实现不同策略下的处理逻辑(对应实现类)。客户端使用时自己选择相应的处理类,利用工厂或其他方式(前面文章有分享到)。注解实现本文要说的是用注解实现策略模式的方式,以及一些注意点。例如:以最常 见的订单处理为例。首先定义这样一个订单实体类:@Datapublic class Order { /** * 订单来源 */ private String
2020-07-21 10:26:05
853
原创 单例模式--十种实现方式的优缺点分析
基本的实现思路单例模式要求类能够有返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称)。单例的实现主要是通过以下两个步骤:将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例; 在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用。1、饿汉式(
2020-07-16 17:43:43
626
原创 springboot+elasticSearch实现数据高效搜索
ElasticSearch,正是 Elastic 公司最出名的产品之一,其中还包括有分布式日志解决方案 ELK(Elastic Search、Logstash、Kibana)、Beats、ECE等。那 ElasticSearch 究竟有什么作用呢?本质其实是一个基于 Lucene 开发的搜索服务器,它提供了一个基于 RESTful web 接口的分布式多用户能力的全文搜索引擎,能够达到实时搜索、稳定、可靠、快速、安装使用方便等特点。同时,作为 Apache 许可条款下的开放源码,目前已经成为一.
2020-07-15 15:40:27
1014
原创 Java8-Lambda学习笔记
Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。Lambda表达式还增强了集合库。 Java SE 8添加了2个对集合数据进行批量操作的包:java.util.function包以及java.util.stream包。 流(stream)就如同迭代器(iterator),但附加了许多额外的功能。 总的来说,lamb...
2020-07-15 11:17:16
339
原创 Java8新特性Stream用法
Stream API 介绍Java8中有两个最为重要的改变。第一个是Lambda表达式;另一个就是Stream API 。它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。Stream(流)是一个来自数据源的元素队列并支持聚合操作。元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。数据源 流的来源。 可以是集合,数组,I/...
2020-04-03 09:32:40
190
原创 SpringBoot 多数据源以及拦截分页
SpringBoot整合Mybatis、Druid和PageHelper 并实现多数据源和分页。其中SpringBoot整合Mybatis请参考前文,这里就不过多说明了。重点是讲述在多数据源下的如何配置使用Druid和PageHelper。Druid介绍和使用在使用Druid之前,先来简单的了解下Druid。Druid是一个数据库连接池。Druid可以说是目前最好的数据...
2019-11-15 10:10:42
669
原创 设计模式--建造者模式
模式的定义与特点 建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。该模式的主要优点如下: 1.各个具体的建造者相互独立,有利于系统的扩展...
2019-10-30 20:24:57
304
1
原创 Mybatis传递多个参数的4种处理方式
今天带代码遇到的小问题,做一个小总结,使用Mybatis最大的特性就是sql需要自己写,而写sql就需要传递多个参数。面对各种复杂的业务场景,传递参数也是一种学问。下面给大家总结了以下几种多参数传递的方法。下面给大家总结了以下几种多参数传递的方法。方法1:顺序传参法//接口中方法的参数顺序,相对应public User selectUser(String name, int d...
2019-10-24 14:27:06
994
原创 设计模式--策略模式
在软件开发中也常常遇到类似的情况,当实现某一个功能存在多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能,如数据排序策略有冒泡排序、选择排序、插入排序、二叉树排序等。 如果使用多重条件转移语句(例如万恶的if--else)实现(即硬编码),不但使条件语句变得很复杂,而且增加、删除或更换算法要修改原代码,不易维护,违背开闭原则。如果采用策略模式就能很好解...
2019-10-23 16:38:51
585
2
原创 雪花算法(snowflake)实现分布式ID的生成
先分析一下:雪花算法简单描述:一、 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0,是符号位,始终为0,不可用。二、41位的时间序列,精确到毫秒级,41位的长度可以使用69年。时间位还有一个很重要的作用是可以根据时间进行排序。注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 -...
2019-08-27 14:50:33
996
1
原创 Springboot线程池并发处理数据优化
第一步:首先配置线程基本参数,可以放在application.propertes文件种也可以放在自己新建的config/文件目录下,注意:但是需要使用@PropertySource把配置文件进行加载。# 异步线程配置# 配置核心线程数async.executor.thread.core_pool_size = 8# 配置最大线程数async.executor.thread.max_p...
2019-08-21 10:44:31
2454
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人