redisdata

介绍

利用对方法注解获取redis缓存,若缓存不存在,运行方法得到结果加入缓存.若缓存存在,则直接返回缓存结果.目的为减少数据库查询次数,和对需要拦截的代码减少代码量.

软件架构

基础spring框架,依赖jedis.(水平有限,还有许多可以优化的地方,望不吝赐教)

安装教程

可直接改包名引入项目即可(同步修改RedisDataAspect的@Pointcut包名),或使用@Import引入

使用说明

在需要的方法上增加注解@RedisData即可.

方法级别,尽量用到service上,方法要有返回值.会先去查询缓存,缓存没有,会执行对应方法,然后把结果缓存起来,下次不会再去执行方法了.

此仅适用于系统级缓存(结果很少变,或一直不会变),减少查询数据库次数.不能自动探测缓存结果是否改变,需要其他方式触发.

防止数据更改,系统重启后缓存不变,需要去com.hgny.common.utils.JedisApplicationRunner的KEY_DEL_LIST去配置需要删除的key(支持通配符)

亦可增加自动增加的缓存

缓存可设置过期时间, 此实现方式暂时没采用jedis事务,可能会出现key/value已设置,但过期时间设置失败的情况,需及时处理

暂存缺陷:

返回值不支持多个泛型嵌套例如List>,也不支持Map的value为自定义复合类型(支持java集合类)

需应对下缓存穿透

key 为模板字符串${},可自动替换

示例: userId-${method:getCurrentUserId}_param0-${param:userName}_param1-${param:1}

若以method开头,会运行com.hgny.common.utils.RedisDataRunUtils中方法,获取结果替换, 可自主增加方法,方法public修饰,返回类型String,

不能有参数

若param开头, 会寻找注解方法里的参数的属性替换(目前不支持属性为对象),从第一个开始找,找到为止, 所以尽量用到的放在第一个参数.

若参数为基本类型时,因不方便直接获取基本类型的名字,改为用数字代表(从0开始)

所以key替换后,结果为userId-1_param0-lyf_param1-2019

type 支持类型为redis中的String, Set, Hash, List

String: 方法返回类型若为基本类型,必须为String, 方法外自行转换其他基本类型,其他复合类型,会自动转换(存入的为json字符串)

Set: 方法返回值必须为Set>

Hash: 若指定field,则去获取指定的field, 若field长度为1, 则返回类型为String, 或其他复合类型(存入的为json字符串).

field长度不为1,返回List>, 实体方法结果List长度必须和Field长度相同,且顺序对应好,没有null值填充,否则,无法对应入缓存或入错顺序

不指定获取全部Hash, 返回类型为Map,或其他复合类型(目前不支持Map的value是bean对象)

List:

paging为true代表要分页,此时方法返回值必须为com.hgny.common.utils.PageUtils, 传入参数Map,参数limit条数默认

10,page当前页码默认1.(待测试)

paging为false,获取全部list

参与贡献

Fork 本仓库

新建 Feat_xxx 分支

提交代码

新建 Pull Request

码云特技

使用 Readme_XXX.md 来支持不同的语言,例如 Readme_en.md, Readme_zh.md