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
 
}
相关推荐
秋意钟28 分钟前
缓存雪崩、缓存穿透【Redis】
redis
简 洁 冬冬41 分钟前
046 购物车
redis·购物车
soulteary1 小时前
突破内存限制:Mac Mini M2 服务器化实践指南
运维·服务器·redis·macos·arm·pika
wkj0012 小时前
php操作redis
开发语言·redis·php
菠萝咕噜肉i3 小时前
超详细:Redis分布式锁
数据库·redis·分布式·缓存·分布式锁
登云时刻4 小时前
Kubernetes集群外连接redis集群和使用redis-shake工具迁移数据(二)
redis·容器·kubernetes
Dlwyz7 小时前
redis-击穿、穿透、雪崩
数据库·redis·缓存
工业甲酰苯胺9 小时前
Redis性能优化的18招
数据库·redis·性能优化
Oak Zhang12 小时前
sharding-jdbc自定义分片算法,表对应关系存储在mysql中,缓存到redis或者本地
redis·mysql·缓存
门牙咬脆骨13 小时前
【Redis】redis缓存击穿,缓存雪崩,缓存穿透
数据库·redis·缓存