Redis实现类似Memcached的add操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/flyfeifei66/article/details/84135999

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也可以实现。

猜你喜欢

转载自blog.csdn.net/flyfeifei66/article/details/84135999