我在使用jfinal2.0版本redis插件时遇到几个问题:
一.DbPro类的分页方法paginate,为了给分页数据添加缓存,我在原方法顶部加了一个关于redis的判断,在原方法底部加了添加redis缓存记录,下面是paginate方法改动后代码,我是用了sql语句作为key,userlist作为value,这样修改是否正确?
Page<Record> paginate(Config config, Connection conn, int pageNumber, int pageSize, String select, String sqlExceptSelect, Object... paras) throws SQLException {
Cache redisCache = Redis.use();
if (redisCache.get(select+sqlExceptSelect)!=null) {
return redisCache.get(select+sqlExceptSelect);
}else {
if (pageNumber < 1 || pageSize < 1)
throw new ActiveRecordException("pageNumber and pageSize must be more than 0");
if (config.dialect.isTakeOverDbPaginate())
return config.dialect.takeOverDbPaginate(conn, pageNumber, pageSize, select, sqlExceptSelect, paras);
long totalRow = 0;
int totalPage = 0;
// 这里是固定的 "select count(*) ",不能支持distinct
List result = query(config, conn, "select count(*) " + DbKit.replaceFormatSqlOrderBy(sqlExceptSelect), paras);
int size = result.size();
if (size == 1)
totalRow = ((Number)result.get(0)).longValue();
else if (size > 1)
totalRow = result.size();
else
return new Page<Record>(new ArrayList<Record>(0), pageNumber, pageSize, 0, 0);
totalPage = (int) (totalRow / pageSize);
if (totalRow % pageSize != 0) {
totalPage++;
}
if (pageNumber > totalPage)
return new Page<Record>(new ArrayList<Record>(0), pageNumber, pageSize, totalPage, (int)totalRow);
// --------
StringBuilder sql = new StringBuilder();
config.dialect.forPaginate(sql, pageNumber, pageSize, select, sqlExceptSelect);
List<Record> list = find(config, conn, sql.toString(), paras);
Page<Record> page = new Page<Record>(list, pageNumber, pageSize, totalPage, (int)totalRow);
redisCache.set(select+sqlExceptSelect, page);
return new Page<Record>(list, pageNumber, pageSize, totalPage, (int)totalRow);
}
}
二.由问题1我想了一些分页中缓存处理的问题:
1.当新增/修改/删除一个用户时,除了更新该用户的缓存,我应该怎么更新分页缓存比较好;
2.当很多业务Controller使用redis时,是使用Cache工具类对每一个Controller进行处理吗?有没有好的方法同时给多个Controller添加redis缓存?
3.redis 设值 取值放在哪一层比较好 controller , service , model ?
jfinal 直接提供的 API,paginateByCache(...)
。你的用法会增加耦合度,不利于升级与改进。
如果想要做缓存,首推 aop 的用法,看一下 RedisInterceptor与 CacheIntercetpor,缓存更新问题根据具体场景来,也用 aop 解决。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。