Easy-cache
介绍
一个极度便捷的缓存框架,你可以根据需要把缓存功能扩展到任意带存储功能的数据库或组件。最重要的是操作简单,操作简单,操作简单,重要的事情一定要说三遍。不像以往你接触到的其他产品,你想要的缓存功能都不支持。但是再烂的产品也总会有合适的适用场景,没错,就是这么自信。github地址:https://github.com/xiaoyudeguang/easy-cache
https://gitee.com/xiaoyudeguang/easy-version
<dependency> <groupId>io.github.xiaoyudeguang</groupId> <artifactId>easy-cache</artifactId> <version>3.1.8-RELEASE</version> </dependency>
使用说明
添加缓存:直接在方法上声明@EasyCache注解
@EasyCache(key = "name", todo = "") public int doService(String name) { return this.hascode(); }
请注意,你的方法参数中一定得有一个参数的参数名和@EasyCache注解的key值一样,不然缓存是不会生效的。那个参数可以直接存在于方法参数中(位置无所谓),也可以存在于某个map(Map实现类)中,或者,某个实例化的EasyMap(HashMap的增强版,本质上还是Map)对象中。
删除缓存
本来,我的业务室不需要删除缓存的。想了想,加上吧,万一有人需要呢。
- 在需要删除缓存对的方法上加上下面的注解(你可能已经猜到@EasyCache注解的value参数有默认值了。。。)
@EasyCache(value = Operation.SAVE, key = "name", todo = "") public int delete(String name) { return this.hascode(); }
- 比如很奇葩的业务哈,直接调用定义在抽象层或者三方包的方法,没有修改类方法的实现,咋办?不管你用哪个缓存,都会遇到这个问题是吧?请看:
CacheUtils.dele(key);
高级功能(将缓存功能扩展到任意数据库/带存储功能的组件)
以下是CacheUtils类的源码
@EasyBean(todo = { "缓存工具类" }) public class CacheUtils implements IHandlerOnChanged{ private static ICache operation; @Autowired(required = false) public CacheUtils(ICache operation) { CacheUtils.operation = operation; } public CacheUtils() {} /** * 默认将DefaultCache作为缓存(请根据需要自己实现) * @return */ public static ICache getCache() { if (operation == null) { operation = new DefaultCache(); } return operation; } /** * 新增(已存在则无操作,不存在则新增) */ public static void add(Object key, Object value) { getCache().add(key, value); } /** * 设置(已存在则替换,不存在则新增) */ public static void set(Object key, Object value) { getCache().set(key, value); } /** * 删除 * * @return */ @SuppressWarnings("unchecked") public static <T> T del(Object key) { return (T) getCache().del(key); } /** * 删除 * * @return */ public static boolean have(Object key) { return getCache().get(key) != null ; } /** * 查询 * * @return */ @SuppressWarnings("unchecked") public static <T> T get(Object key) { return (T) getCache().get(key); } /** * 清空 * * @return */ public static void clear() { getCache().clear(); } @Override public void doOnChanged(ApplicationContext context) throws Exception { getCache().clear(); } /** * * @Auth 赵光 * @Describle 默认cache实现(采用ConcurrentHashMap) * @2019年6月15日 上午10:12:05 */ private static class DefaultCache implements ICache { private Map<Object, Object> cache = new ConcurrentHashMap<Object, Object>(); @Override public void add(Object key, Object value) { if (!cache.containsKey(key)) { cache.put(key, value); } } @Override public void set(Object key, Object value) { cache.put(key, value); } @Override public Object del(Object key) { return cache.remove(key); } @Override public Object get(Object key) { return cache.get(key); } @Override public void clear() { cache.clear(); } } }
如果你都看不懂上面的代码,那就没得玩了。假设你的代码能力没问题哈,定义一个类,实现ICache接口,逐个实现方法,将数据存储到你期望的数据库里,就OK了。以下用redis作为示例:
@EasyBean(todo = { "Redis缓存" }) public class RedisCache implements ICache{ private static RedisTemplate<Object, Object> redisTemplate; private final static String cacheKey = "redis.cache"; @Autowired(required = false) public RedisCache(RedisTemplate<Object, Object> redisTemplate) { RedisCache.redisTemplate = redisTemplate; } @Override public void set(Object key, Object value) { redisTemplate.opsForHash().put(cacheKey, key, value); } @Override public Object del(Object key) { return redisTemplate.opsForHash().delete(cacheKey, key); } @Override public Object get(Object key) { return redisTemplate.opsForHash().get(cacheKey, key); } @Override public void clear() { redisTemplate.delete(cacheKey); } @Override public boolean have(Object key) { return redisTemplate.opsForHash().hasKey(cacheKey, key); } }
文章来源: https://blog.csdn.net/qq_28802119/article/details/92110763