ホームページ  >  記事  >  Java  >  Java Redis Redisson 構成例の分析

Java Redis Redisson 構成例の分析

WBOY
WBOY転載
2023-04-25 08:19:061323ブラウズ

必須 Maven

        <!--redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
                 <exclusions>
                     <exclusion>
                         <groupId>io.lettuce</groupId>
                         <artifactId>lettuce-core</artifactId>
                     </exclusion>
                 </exclusions>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
        <!--     多台相同应用(负载均),Session共享  -->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.17.5</version>
        </dependency>

application-redis.yml

spring:
  redis:
    host: 106.12.174.220
    port: 6379
    password: 123456           #没有密码就保留空
    timeout: 5000
    jedis:
       pool:
         max-active: 1000 # 池在给定时间可以分配的最大连接数。使用负值表示无限制。
         max-idle: 50  #池中“空闲”连接的最大数量。使用负值表示空闲连接的数量不受限制
         min-idle: 10  # 目标是池中要维护的最小空闲连接数。此设置只有在它和逐出运行之间的时间均为正值时才有效。
         max-wait: -1  # 在池耗尽时引发异常之前,连接分配应阻止的最长时间。使用负值无限期阻塞。
    redisson:
      tokenName: Authorization    # 用于分布式锁的唯一标识,一般使用token如果没有找到,就找sessionId
  session:
    store-type: redis   #设置session保存为默认redis的方式 ,可以解决分布式session不一致问题

セッション共有構成

SessionConfig

import org.springframework.context.annotation.Configuration;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

@Configuration
//设置session的默认在redis中的存活时间
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 7200)   //Session过期时间,2小时,默认1800秒(半小时)   -1 永不过期
public class SessionConfig {}

SessionInitializer

import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer;

//初始化Session配置
public class SessionInitializer extends AbstractHttpSessionApplicationInitializer {
    public SessionInitializer() {
        super(SessionConfig.class);
    }
}

Redisson 構成

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RedissonConfig {

    @Value("${spring.redis.host}")
    private String host;
    @Value("${spring.redis.port}")
    private String port;
    @Value("${spring.redis.password}")
    private String password;

    @Bean
    public RedissonClient getRedisson() {
        Config config = new Config();
        SingleServerConfig singleServerConfig = config.useSingleServer();
        singleServerConfig.setAddress("redis://" + host + ":" + port).setPassword(password);
        return Redisson.create(config);
    }

}

その他の Redisson Config 構成メソッド

Redisson Config (スタンドアロン バージョン構成)

        Config config = new Config();
        config.useSingleServer().setAddress("redis://" + host + ":" + port).setPassword(password);

Redisson Config ( Sentinel バージョン構成)

マスターノードが失われた場合、子ノードが自動的にマスターノードを補完することがわかります

Config config = new Config();
config.useSentinelServers().addSentinelAddress(
        "redis://172.29.3.245:26378","redis://172.29.3.245:26379", "redis://172.29.3.245:26380")
        .setMasterName("mymaster")
        .setPassword("a123456");

Redisson's Config (マスター/スレーブバージョン構成)

はい、これは Redis の読み取りと書き込みの分離として理解されていますが、マスター ノードがハングアップした場合、センチネル モードのように子ノードを自動的にマスター ノードにアップグレードすることはできません。

        Config config = new Config();
        config.useMasterSlaveServers()
                //可以用"rediss://"来启用SSL连接
                .setMasterAddress("redis://192.168.81.145:6379")//主节点
                //从节点
                .addSlaveAddress("redis://192.168.81.146:6379")
                .addSlaveAddress("redis://192.168.81.148:6379")
                .setPassword("123456");

Redisson の設定 (クラスター モード)

Config config = new Config();
config.useClusterServers()
    .setScanInterval(2000) // 集群状态扫描间隔时间,单位是毫秒
    .addNodeAddress("redis://127.0.0.1:7000")
    .addNodeAddress("redis://127.0.0.1:7001")
    .addNodeAddress("redis://127.0.0.1:7002")
    .setPassword("123456");

Redisson の構成 (レッド ロック モード)

レッド ロック モードのノード前提はマスター ノードであるか、すべてのスタンドアロン Redis である必要があります

解決策: Sentinel/マスター/スレーブ/クラスター、これらのモード、発生する問題

  1. 非同期データ損失

  2. スプリット ブレイン問題。

プログラムは非常に賢い場合があり、たとえば、ノードがハングアップすると、複数のクライアントが同時にロックを取得します。この小さなエラーの可能性を許容できる場合は、以前のレプリケーション ソリューションを使用しても問題ありません。それ以外の場合は、以下で説明する解決策を実装することをお勧めします。

Redis ノードが 5 つあると仮定すると、これらのノード間にはマスター/スレーブ関係もクラスター関係もありません。クライアントは、同じキーとランダムな値を使用して 5 つのノードでロック を要求します。ロックを要求するためのタイムアウト期間は、自動ロック解除時間よりも短くする必要があります。 3 (半分以上) の Redis でロックが要求されると、ロックは実際に取得されます。ロックが取得できない場合、ロックされた Redis の一部が解放されます。

rree

以上がJava Redis Redisson 構成例の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。