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
 
}
相关推荐
怪兽20149 小时前
Redis常见性能问题和解决方案
java·数据库·redis·面试
长安城没有风10 小时前
从入门到精通【Redis】Redis 典型应⽤ --- 缓存 (cache)
数据库·redis·后端·缓存
学无止境w10 小时前
Redis在电商中的深度应用:商品缓存、秒杀锁、排行榜的实现与避坑指南
数据库·redis·缓存
象象翔10 小时前
Redis实战篇---添加缓存(店铺类型添加缓存需求)
数据库·redis·缓存
库库83912 小时前
Redis分布式锁、Redisson及Redis红锁知识点总结
数据库·redis·分布式
沧澜sincerely12 小时前
Redis 缓存模式与注解缓存
数据库·redis·缓存
爬山算法15 小时前
Redis(63)Redis的Lua脚本如何使用?
redis·junit·lua
二十三之歌17 小时前
Redis 中文学习手册
数据库·redis·学习
Jabes.yang19 小时前
Java面试大作战:从缓存技术到音视频场景的探讨
java·spring boot·redis·缓存·kafka·spring security·oauth2
朝九晚五ฺ21 小时前
【Redis学习】持久化机制(RDB/AOF)
数据库·redis·学习