开发者社区> 问答> 正文

jfinal中redis分页的问题

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

展开
收起
落地花开啦 2016-02-25 13:53:37 4228 0
1 条回答
写回答
取消 提交回答
  • 喜欢技术,喜欢努力的人

    jfinal 直接提供的 API,paginateByCache(...)。你的用法会增加耦合度,不利于升级与改进。
    如果想要做缓存,首推 aop 的用法,看一下 RedisInterceptor与 CacheIntercetpor,缓存更新问题根据具体场景来,也用 aop 解决。

    2019-07-17 18:47:26
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Redis在唯品会的应用实践——架构演进与功能定制 立即下载
微博的Redis定制之路 立即下载
云数据库Redis版的开源之路 立即下载