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
 
}
相关推荐
爱上语文1 小时前
Redis基础(4):Set类型和SortedSet类型
java·数据库·redis·后端
软件2055 小时前
【redis使用场景——缓存——数据淘汰策略】
数据库·redis·缓存
加勒比海涛5 小时前
Spring Cloud Gateway 实战:从网关搭建到过滤器与跨域解决方案
数据库·redis·缓存
大只鹅7 小时前
分布式部署下如何做接口防抖---使用分布式锁
redis·分布式
MonkeyKing_sunyuhua11 小时前
Ehcache、Caffeine、Spring Cache、Redis、J2Cache、Memcached 和 Guava Cache 的主要区别
redis·spring·memcached
笨手笨脚の10 天前
Redis 源码分析-Redis 中的事件驱动
数据库·redis·缓存·select·nio·epoll·io模型
(:满天星:)10 天前
Redis哨兵模式深度解析与实战部署
linux·服务器·网络·数据库·redis·缓存·centos
weixin_4383354010 天前
Spring Boot:运用Redis统计用户在线数量
java·spring boot·redis
十六点五10 天前
Redis(2)——AOF持久化
java·redis·后端
编程乐学(Arfan开发工程师)10 天前
75、单元测试-嵌套测试
前端·javascript·redis·python·单元测试·bootstrap