memcache client 的递增 incr 问题

来源:互联网 发布:扬州网络电视台回看 编辑:程序博客网 时间:2024/06/16 00:23

转载自:http://blog.csdn.net/mumu_shui/article/details/6048603


在集群环境(两台及以上的web服务)下为了保证自动生成号码(由于号码前缀是根据一些字段值动态拼接成的,故key是不确定的)的惟一性,决定使用memcache的incr。但incr必须在存在key的情况下才能正常工作,故需要进行初始化。为了在集群环境下保证只初始化一次,所以采用memcache的add。样例如下:



   private static final long INIT_INCR_RETURN = -1;// 初始增量返回值
    /**
     * 用缓存实现递增,在集群环境下也不会重复
     * 
     * @param param
     * @param step 步长
     * @return
     */
    protected int incrementInCache(CacheObjectParam<Integer> param, int step) {
        String key = param.fetchKey();

        long seq = INIT_INCR_RETURN;
        while (seq == INIT_INCR_RETURN) {
            try {
                seq = wrappedCache.incr(key, step);
                if (seq == INIT_INCR_RETURN) {
                    synchronized (this) {
                        int init = 0;
                        Integer object = param.fetchObject();
                        if (object == null) {
                            init = 0;
                        } else {
                            init = object.intValue();
                        }
                        wrappedCache.add(key, String.valueOf(init), this);// 必须以string形式保存,否则初始值置不进去
                    }
                }
            } catch (Exception e) {
                log.error(e.toString());
            }
        }
        return Long.valueOf(seq).intValue();
    }


0 0
原创粉丝点击