1. 程式人生 > >Redis實現類似Memcached的add操作

Redis實現類似Memcached的add操作

redis不支援add操作,memecached支援,效果是key不存在就set進去,key存在就add失敗。使用redis如果在客戶端先判斷是否存在,在決定set有執行緒安全問題(不是原子操作)。比如兩個執行緒同時判斷出key不存在,然後都去set,那麼後set進去的會覆蓋前者,而memcached應該是以先進去的為準。

redis是單執行緒的,如果判斷是否存在和set一塊執行,就不會有問題。這裡當然可以使用分散式鎖,不過方案顯得有點重了,所以我們想到使用lua傳送一個指令碼。

核心程式碼

        String script = "if redis.call('exists', KEYS[1]) == 0 then return redis.call('set', KEYS[1], ARGV[1]) else return 0 end";
        
        ShardedJedis jedis = RedisCacheFactory.getInstance().getResource(cluster);
        
        Jedis shard = jedis.getShard(key);
        
        Object msg = shard.eval(script,
                Collections.singletonList(key),
                Collections.singletonList(JSONUtil.toJSONStringWithClassName(value)));

這裡使用了分片,這個類中沒有操作指令碼的api,我們通過getShard(key)拿到具體的jedis物件操作。同理repalce也可以實現。