IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Redisson的semaphore初始化在多个pod实例(jvm)的情况下 会被覆盖吗 -> 正文阅读

[大数据]Redisson的semaphore初始化在多个pod实例(jvm)的情况下 会被覆盖吗

Redisson的semaphore初始化在多个pod实例(jvm)的情况下 会被覆盖吗

首先是结论,不会。

当我们在项目中使用redisson的时候,我们要首先给redisson内部设置一个信号量的大小。

@Configuration
public class RedissonConfig {


    @Bean
    public RedissonClient redissonClient(){
        Config config = new Config();
        config.setTransportMode(TransportMode.NIO);
        SingleServerConfig singleServerConfig = config.useSingleServer();
        //可以用"rediss://"来启用SSL连接

        singleServerConfig.setAddress("redis://xx.xx.xx.xx:xxxx");
        singleServerConfig.setPassword("password");
        singleServerConfig.setDatabase(1);
        RedissonClient redisson = Redisson.create(config);
        RSemaphore upload = redisson.getSemaphore("upload");
        upload.trySetPermits(30);
        return redisson;


    }

现在我们就成功在对应的redis服务器中的db1里设置里一个key为upload的信号量,大小为30。

现在担心的问题是,因为生产的环境中,我们会有多个pod实例,相当于运行多个jvm,这一段redisson的配置代码将会被多次执行。

如果我先启动成功的jvm已经对semaphore的值进行了操作,会不会被后启动的jvm将semaphore的值重新覆盖为30.

结论是不会。理由如下。

设置semaphore的对象的permits大小调用的是trySetPermits()方法。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7RvNPPff-1650793254016)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1650792935589.png)]

再往下一层调用。

public RFuture<Boolean> trySetPermitsAsync(int permits) {
        return this.commandExecutor.evalWriteAsync(this.getName(), LongCodec.INSTANCE, RedisCommands.EVAL_BOOLEAN,
         "local value = redis.call('get', KEYS[1]); if (value == false or value == 0) then redis.call('set', KEYS[1], ARGV[1]); redis.call('publish', KEYS[2], ARGV[1]); return 1;end;return 0;",
          Arrays.asList(this.getName(), this.getChannelName()), new Object[]{permits});
    }

由上述代码可以得知。

这个方法是用的redis的lua脚本去执行的。

local value = redis.call('get', KEYS[1]);
if (value == false or value == 0) then redis.call('set', KEYS[1], ARGV[1]);
    redis.call('publish', KEYS[2], ARGV[1]); 
    return 1;
end;
return 0;

在这段代码中 他会首先去判断 value == false的时候 是指redis中不存在这一个key,value== 0的时候是指,Redis中这一个key的值结构不正确。此时他会去根据你的命名set一个新的key进去。

由此可以得出,当我们的pod集群去同时进行semaphore的赋值初始化操作时,并不会对原先的值进行覆盖。

以上。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 11:47:11  更:2022-04-26 11:51:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:56:00-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码