spring-Cache
发现项目里面的redis缓存与数据库的数据混乱不一致,因为很多自定义的数据库update方法更新了数据库,但是并没有更新redis,于是想在底层实现自动缓存
Spring cache简单使用
引入依赖
1
2compile group: 'org.springframework.boot', name: 'spring-boot-starter-cache', version: '2.1.1.RELEASE'
compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: '2.1.1.RELEASE'添加redis缓存的中间件,缓存的中间件也可以不用redis用其他中间件一样的,可选generic,ehcache,hazelcast,infinispan,jcache,redis,guava,simple,none
1
2spring.redis.host=gt163.cn
spring.redis.port=14043开启cache功能,在
@SpringBootApplication
启动类或@Configuration
配置类上面添加该注解@EnableCaching
使用缓存功能,在要缓存的方法上面或者类上面添加注解
@Cacheable("<redis里面的唯一key,也可以叫表名>")
1
2
3
4
5//例如
public User findById(String id) {
return userDao.findById(id);
}
常见几个注解
1 | //开启缓存功能 |
redis缓存mongo数据库表的架构设计
设计方案一
详细代码见github:iexxk/springLeaning:mongo
在BaseDao
接口层添加缓存注解,然后在各个子类继承实现,达到通用缓存框架的配置
BaseDao.java
1 |
|
BaseDaoImpl.java
1 | public class BaseDaoImpl<T, ID> implements BaseDao<T, ID> { |
下面开始进行使用,新建一个UserDao.jva
1 | public interface UserDao extends BaseDao<User, String> { |
UserDaoImpl.jva
1 |
|
最好调用findById
就会进行缓存了
存在的问题
因为cacheNames
也就是表名不支持SpEL,因此获取不到表名,因此设计是,表就用通用mongo
字段做完通用表,然后key里面才是表加id的设计,因此也导致了deletAll
是删除所有的表,因为deletAll
基本不会用到,也还可以接受,就算用到了,只是缓存没了,还是能从数据库重建缓存
参考SpringCache扩展@CacheEvict的key模糊匹配清除
解决方案
新建个该文件CustomizedRedisCacheManager.java
1 | public class CustomizedRedisCacheManager extends RedisCacheManager { |
新建CustomizedRedisCache.java
1 | public class CustomizedRedisCache extends RedisCache { |
添加配置CachingConfig.java
,指定自定义的缓存类
1 |
|
最后再修改使用@CacheEvict
就支持*
号模糊删除了
1 | //删除table开头的所有key |