• redisson支持高并发的RBucket


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

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

    先添加redisson的依赖。

    1. <dependency>
    2. <groupId>org.redissongroupId>
    3. <artifactId>redissonartifactId>
    4. <version>3.20.0version>
    5. dependency>
    1. public static void main(String[] args) {
    2. Config config = new Config();
    3. config.useSingleServer()
    4. .setAddress("redis://localhost:6379")
    5. .setPassword("123456");
    6. RedissonClient client = Redisson.create(config);
    7. RCountDownLatch countDownLatch = client.getCountDownLatch("countDownLatch");
    8. countDownLatch.trySetCount(20);
    9. RBucket bucket = client.getBucket("bucket");
    10. bucket.set("桶测试"+1);
    11. String oldValue=bucket.get();
    12. ExecutorService executorService= Executors.newFixedThreadPool(20);
    13. for (int i=0;i<20;i++){
    14. executorService.submit(() -> {
    15. System.out.println("线程:" + Thread.currentThread().getId() + ",桶:" + bucket.get());
    16. if (bucket.compareAndSet(oldValue, "桶测试 " + 2)) {
    17. System.out.println("线程" + Thread.currentThread().getId() + "更新了bucket的值");
    18. }
    19. countDownLatch.countDown();
    20. });
    21. }
    22. try {
    23. countDownLatch.await();
    24. }catch (Exception e){
    25. e.printStackTrace();
    26. }
    27. System.out.println("更新后的桶对象为:"+bucket.get());
    28. executorService.shutdown();
    29. }

    接口文档:

    1. public interface RBucket extends RExpirable, RBucketAsync {
    2. void set(V var1); //设置桶存储的对象
    3. void set(V var1, long var2, TimeUnit var4); //设置桶存储的对象,设置操作的超时时间var2
    4. boolean trySet(V var1); //尝试设置桶的新值
    5. boolean trySet(V var1, long var2, TimeUnit var4); //尝试设置桶的新值,设置超时时间var2
    6. boolean compareAndSet(V var1, V var2); //原子替换桶的新值为var2
    7. long size(); //桶存储对象的大小
    8. V get(); //返回桶存储的对象
    9. V getAndDelete(); //返回并删除桶存储的对象
    10. V getAndSet(V var1); //返回桶的旧值,设置新值
    11. V getAndSet(V var1, long var2, TimeUnit var4); //返回桶的旧值,设置新值,设置操作的超时时间var2
    12. }

  • 相关阅读:
    java学习
    Linux C语言开发-D6变量
    [每周一更]-(第13期):灰度测试的解释说明
    【算法】将两个升序链表合并为一个新的 升序 链表并返回,看看如何写?
    DP27 跳跃游戏(二)
    倒计时39天
    Go语言进化之路:泛型的崛起与复用的新篇章
    CAPL中的CAN消息:声明、发送和接收
    jenkins安装-linux
    【免杀前置课——Windows编程】十、进程间通信(COPY_DATA通信,邮槽通信)、实现两进程通信(附代码)
  • 原文地址:https://blog.csdn.net/u010096526/article/details/134405308