墨的2020-2021经验总结
文章平均质量分 72
衡与墨
福建98生人,爱好GO、Java、JS、TS、Python、Rust、C语言,前后端均精通,熟悉linux、docker、k8s使用,擅长Vue、Java Web开发、GO 微服务和web开发,兴趣广泛,爱好开源,目标是2025年前具有百万级别系统的架构师能力,我是一个追求纯粹的程序员,欢迎工作邀请
展开
-
JAVA利用多线程进行异步接口调用的模型
收录于墨的2020~2021开发经验总结前言在日常开发中,我们常常会遇到这样的业务场景,业务在执行完某项操作之后,需要通知其它子系统。例如客户下单完成之后,订单系统需要通知数据分析系统,记录下单数据;通知发货系统,开始处理发货;通知会员回馈系统,客户下了单增加了积分,可以适当的发个红包。这些通知和客户下单这件事有关系。但是和下单是否成功并无关系。客户希望能快速得到下单成功的页面。这些通知该如何处理呢?比较简单的方法是,利用多线程进行异步的接口调用。简单版例如,业务需要调用A、B、C三个业务,原创 2021-07-13 19:19:13 · 2085 阅读 · 0 评论 -
查询速度起飞之Java利用多线程进行并发数据查询
收录于墨的2020~2021开发经验总结前言在当前的系统中,我们可能会在一个事务中,执行多项操作,调用多个外部服务,查询数据或者更新数据,进行一系列逻辑处理之后返回给客户一个结果。例如,以下是一个顾客下单的流程模拟:1、获取基本产品信息(此处查询数据库)2、获取每一个产品的价格(假设此处需要通过第三方服务平台进行实时定价,产品不同调用的平台亦不同,所有此处是挨个获取)3、计算产品总价4、获取用户余额(此处也是调取第三方服务,获取用户账户余额)5、比对余额是否充足6、如果余额充足则提示购买成原创 2021-07-13 14:41:41 · 15563 阅读 · 7 评论 -
java 实现的数据查询缓存通用模型——SPEL表达式支持(6)
收录于墨的2020~2021开发经验总结接续上文(java 实现的数据查询缓存通用模型——那些我在缓存模型中用到的工具类(5))7、SPEL表达式支持spel表达式,SpEL(Spring Expression Language),即spring 表达式语言,它是一种轻量的、灵活的语言,通过spring的解析工具进行解析。在前文中,我们搭建实现的数据查询缓存通用模型,是通过cacheKeyCreater的机制来生成key的,这种方式可以实现很高的定制化,但是也有个缺点,那就是要写的代码更多,也不够直原创 2021-07-13 11:37:54 · 488 阅读 · 0 评论 -
基于Redis实现的日志记录组件——超实用(5)前端页面和后端接口
收录于墨的2020~2021开发经验总结上一篇 基于Redis实现的日志记录组件——超实用(4)AOP和SPEL实现六、前端页面前端页面采用H5 + 原生js6语法写成,界面设计以简洁轻量实用为主。顶部是组件列表,列出了所有的日志组件,对每个组件都可以进行清空、选中、编辑。清空会清空redis里对应组件的日志。选中会将该组件的日志实时的在底下列出来。编辑可以修改组件的各项信息,修改保存之后就会实时应用。中间部分是日志的显示区间控制,和刷新频率。显示区间的索引和redis 的lrang原创 2021-07-12 12:39:11 · 396 阅读 · 0 评论 -
基于Redis实现的日志记录组件——超实用(4)AOP和SPEL实现
收录于墨的2020~2021开发经验总结上一篇 基于Redis实现的日志记录组件——超实用(3)核心类描述四、AOP实现以下是日志记录的核心切面代码:Slf4j@Aspect@Order(0) // 越小越先执行public class RedisLogOptAspect { @Resource private RedisLogSpelHandler redisLogSpelHandler; @Resource private RedisLogServi原创 2021-07-09 12:36:01 · 396 阅读 · 0 评论 -
基于Redis实现的日志记录组件——超实用(3)核心类描述
收录于墨的2020~2021开发经验总结上一篇 基于Redis实现的日志记录组件——超实用(2)类图和基本结构三、核心类介绍1、RedisLogComponentRedisComponent是日志组件类,用于存储组件信息,使用了lombok的注解,来减少编码量:这里的@NoArgsConstructor增加了一个无参构造,因为redis反序列化json为java类时,要求这个java类具有无参构造函数,并且还要有对应属性的getter和setter。@NoArgsConstructor@Set原创 2021-07-03 12:25:16 · 360 阅读 · 0 评论 -
基于Redis实现的日志记录组件——超实用(2)类图和基本结构
收录于墨的2020~2021开发经验总结上一篇 基于Redis实现的日志记录组件——超实用(1)概述2、类图和基本结构其中 RedisComponent是日志组件类,用于存储组件信息:RedisLogger用于操作redis,进行组件的注册、清空、删除,以及日志查询、日志写入。RedisLogService 是一个中间服务类,通过操作RedisLogger实现更多上层功能,向RedisController提供接口。RedisLogController用于向外部提供Api接口,进行组件的更原创 2021-07-03 11:46:50 · 322 阅读 · 0 评论 -
基于Redis实现的日志记录组件——超实用(1)概述
1、概述该组件的开发目的,是试图制造一个,能够实时查阅的、高性能的、轻量级、易于使用的日志组件。在我们的系统开发中,日志无疑是极其重要的一环。没有日志,排查错误、分析用户使用情况、追溯业务事件就无从谈起。通常,Java web开发中,使用的日志一般是Slf4j。private final static Logger log = LoggerFactory.getLogger(ProductService.class);通过使用debug、info、warn、error等方法打印日志。并通过配置x原创 2021-06-30 21:10:48 · 815 阅读 · 1 评论 -
基于Java的轻量级缓存组件,实现LRU、LFU、FIFO等缓存清除算法
该组件使用简单、可靠类图如下:例如: DawnSimpleCache dawnSimpleCache = new DawnSimpleCache( "testCache", 2, DawnSimpleCache.LRU, 1F); // 设置缓存数据 dawnSimpleCache.setCache("test1", "xxx", 200, TimeUnit.SECONDS); // 从缓存获取数据原创 2021-06-29 22:37:48 · 478 阅读 · 1 评论 -
Redis 分布式锁的两种写法你会吗
1、概述在并发编程中,锁是用来保证数据同步的重要举措,Java 自带了多种锁的实现,如synchronized、ReentrantLock、ReentrantReadWriteLock等。但这些锁只在该进程内有效。一但跨进程就会不起作用。然而在当下的技术趋势下,微服务,单服务多实例,多实例间负载均衡已经成为常见的架构基础。在这样的多进程情况下,要保证同步,那么分布式锁就尤为重要。这篇文章,描述了两种Redis分布式锁的实现方式。希望对大家有用。2、原理锁的原理来自于其“唯一持有性”,因此只要能保证这原创 2021-06-16 00:15:58 · 494 阅读 · 0 评论 -
超实用的Ehcache的工具类
这个工具类最早是在网络上找的,现在已经找不到出处了,后边自己改了很多地方,也加了很多新的东西。现在将其公开出来,希望对大家有用。需要导入包: compile 'org.ehcache:ehcache'maven的话是,这个版本用2的、3的都可以:<!-- https://mvnrepository.com/artifact/org.ehcache/ehcache --><dependency> <groupId>org.ehcache</原创 2021-06-13 21:24:31 · 1393 阅读 · 0 评论 -
超实用的Redis的工具类
这个工具类最早是在网络上找的,现在已经找不到出处了,后边自己改了很多地方,也加了很多新的东西。现在将其公开出来,希望对大家有用。需要导入包: compile 'org.springframework.data:spring-data-redis:2.3.2.RELEASE'maven的话是:<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis --><depe原创 2021-06-13 21:29:32 · 614 阅读 · 0 评论 -
java 基于Map实现的简单又实用的缓存组件
这个是我使用 Java 内置的 MAP 实现的简易缓存,适用于一些轻量级缓存,现在公开出来,希望能帮助到大家:/** * 使用 Java 内置的 MAP 实现的简易缓存,适用于一些轻量级缓存 * * @author hengyumo * @since 2021-06-06 */@Slf4jpublic class DawnSimpleCache implements DawnCache { /** * 保存缓存数据 */ private final Ma原创 2021-06-13 21:32:08 · 1702 阅读 · 1 评论 -
java 实现的数据查询缓存通用模型——那些我在缓存模型中用到的工具类(5)
收录于墨的2020~2021开发经验总结接续上文(Redis 实现的数据查询缓存通用模型(5))6、那些我在缓存模型中用到的工具类本篇是这个系列的最后一篇,Redis 实现的数据查询缓存通用模型这个系列,标题虽然是Redis 实现的数据查询缓存通用模型,但是实际上却不是以Redis为主,如果再取一个更合适的标题,我觉得是Java的通用数据查询缓存模型会更为恰当一些。使用到的工具类,主要是Ehcache的工具类和Redis的工具类为主。6.1 Ehcache的工具类Ehcache的工具类6.2原创 2021-06-13 21:36:02 · 278 阅读 · 0 评论 -
java 实现的数据查询缓存通用模型——缓存组件设计(4)
收录于墨的2020~2021开发经验总结接续上文(Redis 实现的数据查询缓存通用模型(3))5、缓存组件设计5.1 整体架构先上一张类图,这张类图包含了Dawn缓存架构设计的整体结构:其中DawnCache是一个缓存组件的通用接口,包含了获取缓存、设置缓存、清除缓存三个方法,而DawnRedisCache是它的Redis实现,DawnEhcacheCache是它的Ehcache实现,DawnSimpleCache是它的基于Java Map 的实现。三种缓存组件分别适用不同情况下的使用。Da原创 2021-06-13 20:47:16 · 1983 阅读 · 1 评论 -
java 实现的数据查询缓存通用模型——缓存模型核心AOP实现(3)
收录于墨的2020~2021开发经验总结接续上文(Redis 实现的数据查询缓存通用模型(2))4、缓存模型核心AOP实现4.1 概述在上两篇文章中,我们主要分析了 @DawnCacheable 实现的缓存,和@DawnCacheEvict实现的缓存清除,之前是从模型上分析的,还没有介绍如何实现这个模型,这篇文章就是分析这两个注解背后的实现。Spring拥有两个核心,一个是IOC,控制反转和依赖注入,还有一个就是AOP,面向切面编程。在我这几年的编程生涯中,确实也意味到了,AOP是大部分框架的实现原创 2021-06-13 14:23:00 · 439 阅读 · 0 评论 -
java 实现的数据查询缓存通用模型——缓存清除cacheEvict(2)
收录于墨的2020~2021开发经验总结接续上文(Redis 实现的数据查询缓存通用模型(1))3、缓存清除cacheEvict3.1 基本原理在实际应用中,缓存并非是一成不变的,我们写入缓存之后还需要更新缓存。这常常存在于一些更新操作和删除操作中。例如我们查询了一个产品列表的第一页,之后缓存写入了这一页,在缓存中我们有这样一个映射:key : DAWN-CACHE.cn.hengyumo.dawn.example.service.ProductService.searchProduct.siz原创 2021-06-11 21:12:27 · 1086 阅读 · 0 评论 -
java 实现的数据查询缓存通用模型——概述和注解设计(1)
1、缓存的意义在经济学中,有一个定律叫做二八定律,含义是社会上百分之20的人却占了百分之80的财富。这一定律同样在计算机学科中适用,少部分的资源在计算中会被频繁使用,因此计算机的存储设计中,从低到高,从快到慢,设计了多级缓存。从CPU的一级、二级、三级缓存,到内存,到磁盘,到远程的分布式文件系统。它们的容量从小到大,速度从快到慢。常用的数据会被优先存放在高速的缓存上。在网站的架构设计中,也要考虑到缓存的使用,因为大部分网站的实际运行中,对数据的访问也是呈现出二八定律,百分之八十的业务会集中到百分之二原创 2021-06-10 22:49:18 · 810 阅读 · 0 评论 -
Redis 使用lua脚本最全教程
1、redis 使用lua脚本的语法Redis Eval 命令 - 执行 Lua 脚本redis 127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second1) "key1"2) "key2"3) "first"4) "second"其中script: 参数是一段 Lua 5.1 脚本程序。脚本不必(也不应该)定义为一个 Lua 函数。numkeys: 用于指定键名原创 2021-06-05 13:29:14 · 23008 阅读 · 3 评论 -
墨的2020~2021开发经验总结
1、Redis相关1、Redis 实现的数据查询缓存通用模型2、Redis 实现的分布式锁3、利用 Redis 记录运行日志数据2、Java相关1、利用多线程进行并发数据查询2、利用多线程进行异步接口调用的模型3、利用注解和反射自动生成表和数据同步接口4、Java8的日常使用总结5、结合iview表格控件配置实现的后端表格数据导出模型6、基于配置的查询语句生成模型7、基于配置的前端表格字段生成模型8、跨域问题的深入理解和解决9、基于注解的操作日志记录模型10、基于日期区分的大量数原创 2021-05-18 21:38:52 · 627 阅读 · 1 评论