亲们缓存数据的时候生成key的策略是什么啊

布谷鸟 发布于 2012/07/09 16:48
阅读 444
收藏 0
单条结果好处理,使用id就行了,如若是列表分页查询,就比较麻烦了。之前用的是sql,现在越看越不爽。而且很多情况都不能这样用、、该肿么办。。
加载中
0
JackyYong
JackyYong

分页为什么需要缓存?

如果需要缓存, 可以考虑1. SQL均使用“?”形式, 2. 对SQL进行MD5摘要, 记录摘要值 3. 对参数进行摘要, 记录摘要值 4. 匹配的时候根据摘要值进行匹配... ... 

但是不明白分页为何要缓存???

 

布谷鸟
布谷鸟
回复 @JackyYeong : 如果按我自己的角度,只缓存搜索结果头一页就行了,可是这和用户说不通,得让它感受到速度。业务很简单,一系列列表,我也知道数据缓存了肯定影响实时性的,可是不缓存数据我怕服务器顶不信,至于你说数据库优化,唉。。。。我也是望洋兴叹
JackyYong
JackyYong
回复 @布谷鸟 : 行业不同业务不同, 可能我考虑的过于复杂了!
JackyYong
JackyYong
回复 @布谷鸟 : 不认为有意义, 场景太复杂,除非你的业务上够简单
布谷鸟
布谷鸟
回复 @JackyYeong : 哦,我缓存前几页和搜索关键字得了。
JackyYong
JackyYong
我之前跟你说的第一到第几是说不适用缓存
下一页
0
JackyYong
JackyYong
你可以这么做,  建议开启缓存统计,  统计一下你的缓存使用情况,  再看效果! 如果命中率过低, 那就没有什么意义! 如果挺高, 那就很有意义!
布谷鸟
布谷鸟
这方法不错,那我加上这个计数器
0
布谷鸟
布谷鸟
可是我想知道红薯在oschina里面是怎么干的。。@红薯
0
sxgkwei
sxgkwei
一般不用什么都缓存的,你可以只缓存第一页就OK了,所以,你直接设定一个死的key就行了。每一页都用缓存你内存够么。。。
布谷鸟
布谷鸟
回复 @sxgkwei : 后面说的没懂。
sxgkwei
sxgkwei
回复 @布谷鸟 : 我做的时候,一般缓存首页,所有的首页的主标签分类之类的点进去的第一个页面,key直接用CacheKeyEnum这样的枚举类管理,在CacheService里面的key只能传CacheKeyEnum类型,在CacheService的具体保存和取出方法内用枚举的getValue方法取出具体的字符串key。
布谷鸟
布谷鸟
兄弟,你真是这么干的?。。我有些犹豫。。
0
sxgkwei
sxgkwei

不多说,看代码:

package com.myweb.web.service;

/**
 *
 * 缓存管理
 */
public interface CacheService {

    /**
     * 根据key删除
     *
     * @param key
     */
    void remove(KEY key);

    /**
     * 存入对象
     *
     * @param key
     * @param value
     */
    void put(KEY key, Object value);

    /**
     * 根据key和过期时间获取此前存入的对象
     *
     * @param key
     * @param time
     * @return
     */
    Object get(KEY key, TIME time);

    /**
     * 缓存中已经存在的key
     *
     */
    enum KEY {

        /**
         * 商品缓存
         */
        productList("_product_list");

        private String value;

        private KEY(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }
    }

    /**
     *
     * 缓存的时长
     */
    enum TIME {

        /**
         * 5分钟
         */
        fiveMinute(300),
        /**
         * 10分钟
         */
        tenMinute(600),
        /**
         * 15分钟
         */
        quarterHour(900),
        /**
         * 半小时
         */
        halfHour(1800),
        /**
         * 1小时
         */
        hour(3600),
        /**
         * 2小时
         */
        twoHour(7200),
        /**
         * 3小时
         */
        threeHour(10800),
        /**
         * 12小时
         */
        halfDay(43200),
        /**
         * 24小时
         */
        day(86400);
        private int value;

        private TIME(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }
    }

}

//使用。。

    List<Product> list = (List<Product>) cacheService.get(
                CacheService.KEY.productList, CacheService.TIME.tenMinute);
        if (list == null) {
                list = productService.findList();

            cacheService.put(CacheService.KEY.productList, list);
        }

返回顶部
顶部