关于缓存list的查询与get存储id,merge删除缓存中的疑问

402517174 发布于 2016/01/24 14:08
阅读 575
收藏 0

@qiujiayu 你好,想跟你请教个问题:
1 请问一下 如果是 update更新呢?我get的时候用id进行缓存,但是我update的时候可能不存在id 例如:update table set name='张三' where titile='张三标题' 此是要刷新get的方法 难道要把该get的所有缓存全部删除?目前我使用的是默认自动生成的key
2 如果是dao继承父类的get和merge方法 那么父类的merge如何清除呢?
3 列表查询的时候list方法 
例如:list(User user,INteger page,Integer pageSize)此时要怎么查呢?我已经缓存get方法了,是否我list查询的时候也是只查出id然后在get方法呢?
4 a中dao的a方法可以调用b中dao的b方法的缓存吗?
5 清楚缓存 使用默认key的时候 只能清楚当前类的方法吗(@CacheDelete({ @CacheDeleteKey(cls = CacheDaoImpl.class)?可不可以既删除当前类的get缓存又删除另外一个dao类的update缓存呢?
6 设置永久缓存是否是否改代码会比较容易呢?
7 假设一个dao中即保存又删除,那这个缓存要怎么变更呢?
麻烦您能够抽空看一下,您的思路挺好的,对我有很大的启发,想用您这一套,可是我在集成在自己的框架的时候出现了上述问题

加载中
0
qiujiayu
qiujiayu
1 请问一下 如果是 update更新呢?我get的时候用id进行缓存,但是我update的时候可能不存在id 例如:update table set name='张三' where titile='张三标题' 此是要刷新get的方法 难道要把该get的所有缓存全部删除?目前我使用的是默认自动生成的key


  如果titile 是唯一的,那可以先通过titile 获取ID,然后通过ID进行更新;如果不是唯一的,如果可以,还是尽量转为通过ID更新。
  最差的办法就进行批量删除,(Redis支持批量删除,如果数据量比较大,会对性能有一定的影响)
  public class UserDAO {
    @Cache(expire=600, autoload=true, key="'user_'+#args[0]", condition="#args[0]>0")
    public UserTO getUserById(Integer id) {
        ...
        return user;
    }
    @CacheDelete({@CacheDeleteKey(value="'user_*'", keyType=CacheKeyType.DEFINED)})// Redis支持使用通配符实现批量删除
    public void updateUserName(UserTO user) {
        System.out.println("update user name:" + user.getName());
        ...
    }

   有需要删除缓存的地方,最好还是用自定义缓存Key,比较灵活方法。


2 如果是dao继承父类的get和merge方法 那么父类的merge如何清除呢?


  这个问题,不是很明白,merge方法是做什么用的?


3 列表查询的时候list方法 
例如:list(User user,INteger page,Integer pageSize)此时要怎么查呢?我已经缓存get方法了,是否我list查询的时候也是只查出id然后在get方法呢?


  可以只list出id,然后通过get by id获取详细数据。但调get by id必须放到service来调,不能放到DAO来调。




4 a中dao的a方法可以调用b中dao的b方法的缓存吗?


  可以,但不建议这样使用,这样代码的层次关系被打乱了。


5 清除缓存 使用默认key的时候 只能清楚当前类的方法吗(@CacheDelete({ @CacheDeleteKey(cls = CacheDaoImpl.class)?可不可以既删除当前类的get缓存又删除另外一个dao类的update缓存呢?
 


  不支持,需要把 method 也加上。如果需要删除多个method的缓存,可以@CacheDelete({ @CacheDeleteKey(cls = CacheDaoImpl.class, method="method1"), @CacheDeleteKey(cls = CacheDaoImpl.class, method="method2")})




6 设置永久缓存是否是否改代码会比较容易呢?


  还不支持设置永久缓存,因为我们的项目中,缓存只作为减轻数据库压力的辅助工具,不是做为数据存储,所以所有的数据,都有过期时间。
  如果需要,可以在下个版本中增加这方面的支持,满足更多用户的需求。


7 假设一个dao中即保存又删除,那这个缓存要怎么变更呢?


  把它们拆开,dao的每个方法,只做一件事情,功能要非常明确。然后由service层根据需求,调用dao的不同方法。


希望对你有帮助。

0
盲人摸象
盲人摸象
文档中介绍的 aop失效的方法,有解决办法吗?
返回顶部
顶部