Redis Cluster with SpringBoot

Posted Happy2Share

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis Cluster with SpringBoot相关的知识,希望对你有一定的参考价值。

前提:

按照 https://www.cnblogs.com/luffystory/p/12081074.html 配置好Redis Cluster in Ubuntu

按照如下结构搭建项目结构:

 

 

POM

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.study</groupId>
    <artifactId>SpringBootTest_RedisCluster</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringBootTest-2</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>


        <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>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 

package com.app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

 

package com.app;

import java.io.Serializable;

public class Book implements Serializable {

    private String name;
    private String author;
    
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }
    
    public String toString(){
    return String.format("Book: { name: %s, author: %s }", name,author);
    }
    
    
}

 

package com.app;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class BookController {

    @Autowired
    RedisTemplate<String, Book> redisTemplate;
    
    @Autowired
    StringRedisTemplate stringRedisTemplate;
    
    @GetMapping("/test1")
    public void test() {
    ValueOperations<String,Book> ops = redisTemplate.opsForValue();
    Book book = new Book();
    book.setName("水浒传");
    book.setAuthor("施耐庵");
    ops.set("b1", book);
    System.out.println(ops.get("b1"));
    
    ValueOperations<String,String> ops2 = stringRedisTemplate.opsForValue();
    ops2.set("Hello", "World");
    System.out.println(ops2.get("Hello"));
    }
}

 

 

package com.app;

import java.util.ArrayList;
import java.util.List;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisClusterConfiguration;
import org.springframework.data.redis.connection.RedisNode;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import redis.clients.jedis.JedisPoolConfig;

@Configuration
@ConfigurationProperties("spring.redis.cluster")
public class RedisConfig {

    List<Integer> ports;
    String host;
    JedisPoolConfig poolConfig;
    
    @Bean
    RedisClusterConfiguration redisClusterConfiguarion() {
    RedisClusterConfiguration configuration = new RedisClusterConfiguration();
    List<RedisNode> nodes = new ArrayList<>();
    for(Integer port : ports) {
        nodes.add(new RedisNode(host,port));
    }
    configuration.setClusterNodes(nodes);
    return configuration;
    }
    
    @Bean
    JedisConnectionFactory jedisConnectionFactory() {
    JedisConnectionFactory factory = new JedisConnectionFactory(redisClusterConfiguarion(), poolConfig);
        return factory;
    }
    
    @Bean
    RedisTemplate redisTempalte() {
    RedisTemplate redisTempalte = new RedisTemplate();
    redisTempalte.setConnectionFactory(jedisConnectionFactory());
    redisTempalte.setKeySerializer(new StringRedisSerializer());
    redisTempalte.setValueSerializer(new JdkSerializationRedisSerializer());
    
    return redisTempalte;
    }
    
    @Bean
    StringRedisTemplate stringRedisTemplate() {
    StringRedisTemplate stringRedisTemplate = new StringRedisTemplate(jedisConnectionFactory());
    stringRedisTemplate.setKeySerializer(new StringRedisSerializer());
    stringRedisTemplate.setValueSerializer(new StringRedisSerializer());
    
    return stringRedisTemplate;
    }

    public List<Integer> getPorts() {
        return ports;
    }

    public void setPorts(List<Integer> ports) {
        this.ports = ports;
    }

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public JedisPoolConfig getPoolConfig() {
        return poolConfig;
    }

    public void setPoolConfig(JedisPoolConfig poolConfig) {
        this.poolConfig = poolConfig;
    }
    
}

 

application.yml

server:
  port: 8091
spring:
  redis:
    cluster:
      ports:
        - 8001
        - 8002
        - 8003
        - 8004
        - 8005
        - 8006
        - 8007
        - 8008
      host: 192.168.157.131  #此处所有的node都在同一台机器上,所以用了一个 host
      poolConfig:
        max-total: 8
        max-idle: 8
        max-wait-millis: -1
        min-idle: 0
        
        

启动SpringBoot Application ,并在浏览器中输入: http://localhost:8091/test1

 

 

连接任意一个Redis 实例,验证结果:

 

 

 

以上是关于Redis Cluster with SpringBoot的主要内容,如果未能解决你的问题,请参考以下文章

laravel报Cannot use ‘EVAL‘ with redis-cluster.

在Spring Boot 上配置Redis Cluster出现的异常

Spring Boot Redis Cluster 实战干货

Spring连接redis cluster的配置文件

redis cluster应用连接(password)

spring boot:使用redis cluster集群作为分布式session(redis 6.0.5/spring boot 2.3.1)