memcache client 的遞增 incr

在集羣環境(兩臺及以上的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();
    }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章