克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MulanPSL-2.0

缓存管理

说明:
这个工具只是想把脑海里的想法输出出来,都是以个人兴趣写的,没有想过维护,想到哪写到哪,当作学习交流参考差不多,不能用到真实的项目上,包括以后随时可能不维护。 如果觉得部分功能自己需要,可以拿走自己去做定制和维护。
之前我是想实现很多东西来着,可惜没精力和时间,后面就没兴趣了。有很多代码直接删减了,所以能看到少部分遗留代码。

这个工具的目的是为了解决数据库与缓存间自动托管达到数据一致性。比如 users 表作为热点表,需要放入缓存中只需一个注解 @TableCache 就可以了。

至于缓存的更新,工具会监听sql执行自动更新缓存, 包括缓存查询时实现了自己的 csql 表达式,最大程度契合 sql,作为基础功能以便扩展更多上层建筑。

使用说明

监听器

由于代理了数据源,并且全程跟踪了 jdbc 操作。可以感知到用户什么时候获取的连接、执行了几条 sql、每条 sql 是否为批量、执行参数、影响行数、什么时候提交、关闭连接 之类的细节(详见 com.jiao.table.listener 包下示例)。
所以可以在次基础上的监听器可以做很多事,比如:数据源的使用状态、sql执行的耗时、sql执行的类型。

用户可以扩展 2 种监听器:
  数据源监听器:获取连接后事件、关闭连接事件、commit 前事件、commit 后事件
  SQL监听器:sql 执行前事件、sql 执行后事件

这个工具只是在这个基础上做了一个缓存自动闭环的上层建筑,如果想 mq、es搜索 之类的闭环
如果一条 sql 从获取连接开始,到结束时候,所有的细节都能感知到,这个时候想象力有多大,能解决的问题就能有多少。

csql 表达式

csql 表达式只是实现了简单的 sql 查询功能,只支持格式:select xx from xx where xxx 格式,像子查询、临时表、嵌套查询直接都是不支持的

支持符号与运算符:>=、>、<=、<、!=、between、like、in、not、or、and、( ) 、?、#、*
  其中 ? 与 # 为预编译方式执行,目的为了减少表达式的解析过程。? 与 # 不可以同时使用。
  * 为查询列。在缓存中都是查询出全部的,保留这个只是为了和 sql 契合。
  like 功能目前未实现,预计在 1.1_bate 实现。

where数据类型:int、long、Date(内部转成long计算)、string

注解

@TableCache
注解在类上,被注解的bean字段将会和数据库字段一样对照,在项目启动时候工具会自己加载这个表对应的所有数据。
然后去监听这个张表的数据更新,对应的也更新缓存。

@ColunmMapping
注解到实体上,假如实体列名与数据库不一致,则用这个去映射指定数据库列名.

@PrimaryKey
注解在列上,被 @TableCache 注解的类中,必须有个主键。

@TableIndex 注解在列上,在缓存中自动生成索引,以便快速查找。目前 csql 表达式只支持在索引列中去做数据的筛选。

@ResultColunmMapper
注解在列上,当指定 bean 与存到缓存的 bean 列名不一致时候,使用此注解将指定列结果映射进来。
例如:users bean中有个 u_id 存入了缓存。但是用 UserVO 中的 uId 接收结果时候,就需要这个注解在 uId 列上。

@IgnoreColunm
当被 @TableCache 注解的实体中,存在数据库中不存在的字段时候,需要用这个忽略.

demo 模块使用说明

直接使用 demo-start 模块的测试项目就行。几分钟快速上手

  1. 执行测试 sql (这里使用的 mysql)
    在 demo-start 模块下执行 模拟数据.sql
    修改 application.yml 中的数据库和 redis 配置

  2. 指定加载的缓存 与 监听器
    在 Person 表中指定
    @TableCache 就会加载这张表对应的缓存
    @TableIndex 指定此类为缓存中的索引列, 用来快速检索,并且 csql 只用检索索引与主键列

    实现sql监听 SQLListener(sql监听), ConnectionListener(链接监听)
    例如示例:DeleteSQLListener.java InsertSQLListener.java

  3. 启动项目
    启动 CacheSysApplication.java 类 redis 中会生成如下缓存数据如下:
    前缀:cache:sys:table:xxx表名
    表数据:cache:sys:table:user:data
    元数据:cache:sys:table:aeitem:matedata:xxxx
    元数据主要辅助 csql 计算表达式用
    索引:cache:sys:table:reguser:index:索引key:索引值
    输入图片说明

  4. 测试缓存
    在 PersonController 中测试,在对数据的增删写时候,观察缓存自动更新了。 抛出写异常时候的补偿机制

结构说明

1. demo-start
    用来测试模拟使用场景,里面 Demo 效果可以直接测试

2. jiaocache-cache-support
缓存支持,尽量的将缓存的操作都抽取,不直接依赖 Redis。实现缓存的有 Redis 实现,与内存缓存实现,内存缓存只是实现了大概,没有真的写完。目的是有2点。
    2.1. 便于实现更换缓存的实现
    2.2. 最初想在远程缓存(Redis) 挂之后,可以自动识别。监听到之后走缓存降级到内存缓存,从数据库加载最新的数据到内存缓存,这个时候会出现数据查时候不一致。但是一定会保证平台一直可用。而且后面想法是让Tomcat间实现通信后,解决一致性问题。这种在远程缓存不可信时走备用方案,用户无感切换的是我想要的。但是需要投入太多实现。

之前主要有2个目的,想在这个模块中做动态缓存切换,和不去强依赖某个缓存工具。

3. jiaocache-cache-syntax
这个主要用作解析 csql 表达式,与计算表达式。

其实有个简单版的降级,如果缓存不可用,那就直接降级到数据库。比如以下形式:
假如用 mybatis 时候用一个切面,切入 @Select(" select * from users ")
这句sql,当缓存可用时候走缓存,当缓存挂了,或者缓存不可信了,就走数据库。

4. jiaocache-common
公共包

6. jiaocache-datasource
代理 DataSource, 全程跟踪数据库的所有操作。在执行 sql 执行前后、conn 开启、关闭、提交 时候执行监听器。

7. jiaocache-datasource-autoconig
主要用于切入数据源,这里的思路为直接自己实现 DataSource 代理数据源,然后内部维护一个实际的 DataSource。

8. jiaocache-table
实现自动加载数据、自动闭环数据、实现表达式查询、使用 lua 保证原子性 内部出错会尝试回滚、 写缓存时容错机制
基本上很多重要的功能都在这里

9. 为实现的 plug 插件包
这部分也是我最想要的, 可以实现很多功能,最初最想实现的就有三个。

    9.1 sql 耗时监听
    如果你想做一个数据库监控管理,在应用层直接无视各种数据库差异,就能统计出 执行次数最多的sql,最耗时的sql。

    9.2 数据源监听
    统计各个数据源的链接占用情况,是否数据库链接打满一目了然。

    9.3 类似 spring-cache 自动闭环

   @Cache(key="'getUserDetail' + usrId", tableNameArr = {'用户表', '积分表', '订单表'})     
   pubile UserDetail getUserDetail(long usrId) { xxx }  

    如果 tableNameArr 里面任何一个表发生了变化, 那么挂到这些表下的全部缓存都会删除。
    是不是可以让优化变得更简单 ?

    9.4 动态缓存缓存切换

v1.0 说明

  1. 代理数据源
  2. 实现自动加载数据
  3. 自动闭环数据
  4. 实现 csql 表达式查询
  5. 使用 lua 保证原子性 内部出错会尝试回滚
  6. 写缓存时容错机制

1.0 遇到问题
在把这个工具用到用到公司其中一个老项目中,由于老项目各个版本太低遇到很多兼容性问题,最后将大部分工具升级才得以兼容。后面遇到的一些问题都会贴出来给出一个参考。

  1. 如果 RedisTemplate 使用 JedisConnectionFactory 连接工厂会报错。 排查后发现 JedisConnectionFactory 不支持管道操作,后面换成了 lettuceConnectionFactory 工厂
  2. spring4.x 兼容问题 由于使用了 lettuceConnectionFactory 工厂,而这个类大概在 spring-data-redis2.x 中存在的,如果升级就和 spring4.x 冲突,所以必须升级 spring,如果升级 spring 又和别的很多第三方 jar 又冲突。 所以这不只是换一个 jar 的问题,当时弄了很久, 尝试了大量的版本。现在列出来一个版本列表可以参考下。
    jackson 2.6.7 > 2.11.3
    spring-boot.version 1.1.10.RELEASE > 2.1.4.RELEASE
    hibernate系列 4.3.7.Final > 5.0.12.Final
    hibernate-validator 5.1.3.Final
    spring系列 4.3.22.RELEASE > 5.1.7.RELEASE
    springsession spring-session:1.3.1.RELEASE > spring-session-data-redis:2.1.5.RELEASE
    spring-data-releasetrain Fowler-SR2 > Kay-SR7
    reactor-core 3.1.5.RELEASE

maven jar中依赖的jar也会冲突,目前试验的项目移除了某些包

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <scope>provided</scope>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.jiao.cachesys</groupId>
        <artifactId>jiaocache-datasource-autoconig</artifactId>
        <version>1.0</version>
        <exclusions>
            <exclusion>
                <groupId>org.apache.lucene</groupId>
                <artifactId>lucene-core</artifactId>
            </exclusion>
            <exclusion>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-api</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </exclusion>
            <exclusion>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-parent</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

包括一些监听器啊,拦截器什么的旧项目该升级就得升级了。比较新的项目可以忽略很多问题。

不管这个组合是不是最好的,反正跑起来了,也没空去研究细了,太耽误时间。

v1.1 说明

  1. 增加 csql 预解析参数(防止硬解析与sql的契合度)。目前支持 "?" 占位符 与 #{xxx}占位符
  2. 增加 like 模糊搜索
  3. 增加缓存开关
木兰宽松许可证, 第2版 木兰宽松许可证, 第2版 2020年1月 http://license.coscl.org.cn/MulanPSL2 您对“软件”的复制、使用、修改及分发受木兰宽松许可证,第2版(“本许可证”)的如下条款的约束: 0. 定义 “软件”是指由“贡献”构成的许可在“本许可证”下的程序和相关文档的集合。 “贡献”是指由任一“贡献者”许可在“本许可证”下的受版权法保护的作品。 “贡献者”是指将受版权法保护的作品许可在“本许可证”下的自然人或“法人实体”。 “法人实体”是指提交贡献的机构及其“关联实体”。 “关联实体”是指,对“本许可证”下的行为方而言,控制、受控制或与其共同受控制的机构,此处的控制是指有受控方或共同受控方至少50%直接或间接的投票权、资金或其他有价证券。 1. 授予版权许可 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的版权许可,您可以复制、使用、修改、分发其“贡献”,不论修改与否。 2. 授予专利许可 每个“贡献者”根据“本许可证”授予您永久性的、全球性的、免费的、非独占的、不可撤销的(根据本条规定撤销除外)专利许可,供您制造、委托制造、使用、许诺销售、销售、进口其“贡献”或以其他方式转移其“贡献”。前述专利许可仅限于“贡献者”现在或将来拥有或控制的其“贡献”本身或其“贡献”与许可“贡献”时的“软件”结合而将必然会侵犯的专利权利要求,不包括对“贡献”的修改或包含“贡献”的其他结合。如果您或您的“关联实体”直接或间接地,就“软件”或其中的“贡献”对任何人发起专利侵权诉讼(包括反诉或交叉诉讼)或其他专利维权行动,指控其侵犯专利权,则“本许可证”授予您对“软件”的专利许可自您提起诉讼或发起维权行动之日终止。 3. 无商标许可 “本许可证”不提供对“贡献者”的商品名称、商标、服务标志或产品名称的商标许可,但您为满足第4条规定的声明义务而必须使用除外。 4. 分发限制 您可以在任何媒介中将“软件”以源程序形式或可执行形式重新分发,不论修改与否,但您必须向接收者提供“本许可证”的副本,并保留“软件”中的版权、商标、专利及免责声明。 5. 免责声明与责任限制 “软件”及其中的“贡献”在提供时不带任何明示或默示的担保。在任何情况下,“贡献者”或版权所有者不对任何人因使用“软件”或其中的“贡献”而引发的任何直接或间接损失承担责任,不论因何种原因导致或者基于何种法律理论,即使其曾被建议有此种损失的可能性。 6. 语言 “本许可证”以中英文双语表述,中英文版本具有同等法律效力。如果中英文版本存在任何冲突不一致,以中文版为准。 条款结束 如何将木兰宽松许可证,第2版,应用到您的软件 如果您希望将木兰宽松许可证,第2版,应用到您的新软件,为了方便接收者查阅,建议您完成如下三步: 1, 请您补充如下声明中的空白,包括软件名、软件的首次发表年份以及您作为版权人的名字; 2, 请您在软件包的一级目录下创建以“LICENSE”为名的文件,将整个许可证文本放入该文件中; 3, 请将如下声明文本放入每个源文件的头部注释中。 Copyright (c) [Year] [name of copyright holder] [Software Name] is licensed under Mulan PSL v2. You can use this software according to the terms and conditions of the Mulan PSL v2. You may obtain a copy of Mulan PSL v2 at: http://license.coscl.org.cn/MulanPSL2 THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. See the Mulan PSL v2 for more details. Mulan Permissive Software License,Version 2 Mulan Permissive Software License,Version 2 (Mulan PSL v2) January 2020 http://license.coscl.org.cn/MulanPSL2 Your reproduction, use, modification and distribution of the Software shall be subject to Mulan PSL v2 (this License) with the following terms and conditions: 0. Definition Software means the program and related documents which are licensed under this License and comprise all Contribution(s). Contribution means the copyrightable work licensed by a particular Contributor under this License. Contributor means the Individual or Legal Entity who licenses its copyrightable work under this License. Legal Entity means the entity making a Contribution and all its Affiliates. Affiliates means entities that control, are controlled by, or are under common control with the acting entity under this License, ‘control’ means direct or indirect ownership of at least fifty percent (50%) of the voting power, capital or other securities of controlled or commonly controlled entity. 1. Grant of Copyright License Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable copyright license to reproduce, use, modify, or distribute its Contribution, with modification or not. 2. Grant of Patent License Subject to the terms and conditions of this License, each Contributor hereby grants to you a perpetual, worldwide, royalty-free, non-exclusive, irrevocable (except for revocation under this Section) patent license to make, have made, use, offer for sale, sell, import or otherwise transfer its Contribution, where such patent license is only limited to the patent claims owned or controlled by such Contributor now or in future which will be necessarily infringed by its Contribution alone, or by combination of the Contribution with the Software to which the Contribution was contributed. The patent license shall not apply to any modification of the Contribution, and any other combination which includes the Contribution. If you or your Affiliates directly or indirectly institute patent litigation (including a cross claim or counterclaim in a litigation) or other patent enforcement activities against any individual or entity by alleging that the Software or any Contribution in it infringes patents, then any patent license granted to you under this License for the Software shall terminate as of the date such litigation or activity is filed or taken. 3. No Trademark License No trademark license is granted to use the trade names, trademarks, service marks, or product names of Contributor, except as required to fulfill notice requirements in Section 4. 4. Distribution Restriction You may distribute the Software in any medium with or without modification, whether in source or executable forms, provided that you provide recipients with a copy of this License and retain copyright, patent, trademark and disclaimer statements in the Software. 5. Disclaimer of Warranty and Limitation of Liability THE SOFTWARE AND CONTRIBUTION IN IT ARE PROVIDED WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED. IN NO EVENT SHALL ANY CONTRIBUTOR OR COPYRIGHT HOLDER BE LIABLE TO YOU FOR ANY DAMAGES, INCLUDING, BUT NOT LIMITED TO ANY DIRECT, OR INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING FROM YOUR USE OR INABILITY TO USE THE SOFTWARE OR THE CONTRIBUTION IN IT, NO MATTER HOW IT’S CAUSED OR BASED ON WHICH LEGAL THEORY, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 6. Language THIS LICENSE IS WRITTEN IN BOTH CHINESE AND ENGLISH, AND THE CHINESE VERSION AND ENGLISH VERSION SHALL HAVE THE SAME LEGAL EFFECT. IN THE CASE OF DIVERGENCE BETWEEN THE CHINESE AND ENGLISH VERSIONS, THE CHINESE VERSION SHALL PREVAIL. END OF THE TERMS AND CONDITIONS How to Apply the Mulan Permissive Software License,Version 2 (Mulan PSL v2) to Your Software To apply the Mulan PSL v2 to your work, for easy identification by recipients, you are suggested to complete following three steps: i Fill in the blanks in following statement, including insert your software name, the year of the first publication of your software, and your name identified as the copyright owner; ii Create a file named “LICENSE” which contains the whole context of this License in the first directory of your software package; iii Attach the statement to the appropriate annotated syntax at the beginning of each source file. Copyright (c) [Year] [name of copyright holder] [Software Name] is licensed under Mulan PSL v2. You can use this software according to the terms and conditions of the Mulan PSL v2. You may obtain a copy of Mulan PSL v2 at: http://license.coscl.org.cn/MulanPSL2 THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. See the Mulan PSL v2 for more details.

简介

代理数据源,跟踪 jdbc 操作,创造无限可能。 目前实现缓存自动闭环,csql 查询缓存 依赖于 spring 5.0+、Springboot 2.0+、Redis、Lombok。 展开 收起
Java 等 2 种语言
MulanPSL-2.0
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化