redisson支持高并发的RBucket

作用:RBucket桶可存储任意对象,可在高并发场景下进行唯一更新。

示例:创建20个线程并发更新桶对象,只有一个执行了更新操作。

先添加redisson的依赖。

XML 复制代码
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.20.0</version>
</dependency>
java 复制代码
public static void main(String[] args) {
    Config config = new Config();
    config.useSingleServer()
            .setAddress("redis://localhost:6379")
            .setPassword("123456");
    RedissonClient client = Redisson.create(config);
    RCountDownLatch countDownLatch = client.getCountDownLatch("countDownLatch");
    countDownLatch.trySetCount(20);
    RBucket<String> bucket = client.getBucket("bucket");
    bucket.set("桶测试"+1);
    String oldValue=bucket.get();
    ExecutorService executorService= Executors.newFixedThreadPool(20);
    for (int i=0;i<20;i++){
        executorService.submit(() -> {
            System.out.println("线程:" + Thread.currentThread().getId() + ",桶:" + bucket.get());
            if (bucket.compareAndSet(oldValue, "桶测试 " + 2)) {
                System.out.println("线程" + Thread.currentThread().getId() + "更新了bucket的值");
            }
            countDownLatch.countDown();
        });
    }
    try {
        countDownLatch.await();
    }catch (Exception e){
        e.printStackTrace();
    }
    System.out.println("更新后的桶对象为:"+bucket.get());
    executorService.shutdown();
}

接口文档:

java 复制代码
public interface RBucket<V> extends RExpirable, RBucketAsync<V> {
 
    void set(V var1);                                  //设置桶存储的对象
    void set(V var1, long var2, TimeUnit var4);        //设置桶存储的对象,设置操作的超时时间var2
 
    boolean trySet(V var1);                            //尝试设置桶的新值
    boolean trySet(V var1, long var2, TimeUnit var4);  //尝试设置桶的新值,设置超时时间var2
 
    boolean compareAndSet(V var1, V var2);             //原子替换桶的新值为var2
 
    long size();                                       //桶存储对象的大小
 
    V get();                                           //返回桶存储的对象
    V getAndDelete();                                  //返回并删除桶存储的对象
 
    V getAndSet(V var1);                               //返回桶的旧值,设置新值
    V getAndSet(V var1, long var2, TimeUnit var4);     //返回桶的旧值,设置新值,设置操作的超时时间var2
 
}
相关推荐
vivo互联网技术1 天前
从 10 分钟到 1 秒:ES 深度分页任意跳页的三轮优化实战
服务器·数据库·redis·elasticsearch·深度分页
用户3074596982074 天前
Redis 延时队列详解
redis
烤代码的吐司君4 天前
Redis 数据结构 ZSet, BIT, HyperLogLog,Geo 空间数据
redis·后端
leeyi6 天前
Checkpoint 机制:Agent 怎么在断电后接着跑
redis·aigc·agent
云技纵横7 天前
一个 @Async 让循环依赖暴雷:Spring 代理的暗坑
redis
犯困蛋挞yy8 天前
用Claude快速解决Redis代码报错反复无解的问题
redis
用户31693538118314 天前
Java连接Redis
redis
小小工匠16 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
taocarts_bidfans16 天前
反向海淘跨境缓存架构优化:taocarts Redis分层缓存实战技术
redis·缓存·架构·反向海淘·taocarts