jfinal里redis分页问题

romeo2015 发布于 2016/01/04 18:06
阅读 860
收藏 0

@JFinal 你好,想跟你请教个问题:

我在使用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 ? 





加载中
0
JFinal
JFinal

   为啥不用 jfinal 直接提供的 API,paginateByCache(...)。你的用法会增加耦合度,不利于升级与改进。

   如果想要做缓存,首推 aop 的用法,看一下 RedisInterceptor与 CacheIntercetpor,缓存更新问题根据具体场景来,也用 aop 解决。

JFinal
JFinal
回复 @jambolleo : paginateByCache(...) 正是将结果放在缓存中的
jambolleo
jambolleo
波总你好,关于这个分页算法,能否把里面全集这部分放到缓存?计算页数也就是用count(*)这里,后面的全集对效率影响不大(如果索引对的话,索引不对这里也是耗费很多时间的),后面到了具体某一页,也是对全集通过ROW_来进行查询,所以能否把全集选择性地放到缓存中?
romeo2015
romeo2015
谢谢指导,我试一下。
GITTODO
GITTODO
这个思路不错
返回顶部
顶部