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
 
}
相关推荐
二宝15212 分钟前
互联网大厂Java面试实战演练:谢飞机的三轮提问与深入解析
java·spring boot·redis·微服务·面试·kafka·oauth2
bLEd RING9 小时前
Redis 设置密码无效问题解决
数据库·redis·缓存
刘~浪地球11 小时前
Redis 从入门到精通(一):简介、安装与配置
数据库·redis·缓存
小红的布丁12 小时前
Redisson 分布式锁实现:可重入与看门狗
redis
刘~浪地球13 小时前
Redis 从入门到精通(二):数据类型详解
数据库·redis·缓存
s1mple“”15 小时前
大厂Java面试实录:从Spring Boot到AI技术的电商场景深度解析
spring boot·redis·微服务·kafka·向量数据库·java面试·ai技术
会飞的大可16 小时前
Redis 竞品与替代方案选型可行性分析报告
数据库·redis·缓存
smachao17 小时前
Redis Desktop Manager(Redis可视化工具)安装及使用详细教程
redis·git·bootstrap
shark222222219 小时前
MySQL 与 Redis 的数据一致性问题
数据库·redis·mysql
MC皮蛋侠客19 小时前
C++中使用Redis指南:基于redis-plus-plus库
开发语言·c++·redis