Heim  >  Artikel  >  Java  >  Spring-basierte Redis-Konfiguration (Standalone- und Cluster-Modus)

Spring-basierte Redis-Konfiguration (Standalone- und Cluster-Modus)

不言
不言nach vorne
2019-02-21 14:47:522233Durchsuche

Dieser Artikel enthält Inhalte zur Spring-basierten Redis-Konfiguration (Standalone- und Cluster-Modus). Ich hoffe, dass er für Freunde hilfreich ist.

Erforderliches JAR-Paket: Spring-Version: 4.3.6.RELEASE, Jedis-Version: 2.9.0, Spring-Data-Redis:1.8.0.RELEASE; wenn Sie Jackson-Serialisierung verwenden, benötigen Sie außerdem: jackson - Anmerkungen und Jackson-Databind-Paket

spring集成redis单机版:
    1.配置RedisTemplate
        <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
            <property name="connectionFactory" ref="connectionFactory"/>
            <property name="defaultSerializer" ref="stringRedisSerializer"/>
            <property name="keySerializer" ref="stringRedisSerializer"/>
            <property name="valueSerializer" ref="valueSerializer"/>
        </bean>
    2.配置connectionFactory
        <bean id="connectionFactory"  class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
            <!-- 配置ip -->
            <property name="hostName" value="${redis.host}"/>
            <!-- 配置port -->
            <property name="port" value="${redis.port}"/>
            <!-- 是否使用连接池-->
            <property name="usePool" value="${redis.usePool}"/>
            <!-- 配置redis连接池-->
            <property name="poolConfig" ref="poolConfig"/>
        </bean>
   3.配置连接池
        <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
            <!--最大空闲实例数-->
            <property name="maxIdle" value="${redis.maxIdle}" />
            <!--最大活跃实例数-->
            <property name="maxTotal" value="${redis.maxTotal}" />
            <!--创建实例时最长等待时间-->
            <property name="maxWaitMillis" value="${redis.maxWaitMillis}" />
            <!--创建实例时是否验证-->
            <property name="testOnBorrow" value="${redis.testOnBorrow}" />
        </bean>

spring集成redis集群
    1.配置RedisTemplate步骤与单机版一致
    2.配置connectionFactory
        <bean id="connectionFactory"  class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
            <!-- 配置redis连接池-->    
            <constructor-arg ref="poolConfig"></constructor-arg>
            <!-- 配置redis集群-->  
         <constructor-arg ref="clusterConfig"></constructor-arg>
            <!-- 是否使用连接池-->
            <property name="usePool" value="${redis.usePool}"/>
        </bean>
    3.配置连接池步骤与单机版一致
    4.配置redis集群
        <bean id="clusterConfig" class="org.springframework.data.redis.connection.RedisClusterConfiguration">
            <property name="maxRedirects" value="3"></property>
            <property name="clusterNodes">
                <set>
                    <bean class="org.springframework.data.redis.connection.RedisClusterNode">
                        <constructor-arg value="${redis.host1}"></constructor-arg>
                        <constructor-arg value="${redis.port1}"></constructor-arg>
                    </bean>
                    <bean class="org.springframework.data.redis.connection.RedisClusterNode">
                        <constructor-arg value="${redis.host2}"></constructor-arg>
                        <constructor-arg value="${redis.port2}"></constructor-arg>
                    </bean>
                    ......
                </set>
            </property>
        </bean>
    或者
        <bean name="propertySource" class="org.springframework.core.io.support.ResourcePropertySource">
            <constructor-arg name="location" value="classpath:properties/spring-redis-cluster.properties" />
        </bean>
        <bean id="clusterConfig" class="org.springframework.data.redis.connection.RedisClusterConfiguration">
            <constructor-arg name="propertySource" ref="propertySource"/>
        </bean>

Kurze Beschreibung der Serialisierungskonfiguration:

1.stringRedisSerializer:由于redis的key是String类型所以一般使用StringRedisSerializer
2.valueSerializer:对于redis的value序列化,spring-data-redis提供了许多序列化类,这里建议使用Jackson2JsonRedisSerializer,默认为JdkSerializationRedisSerializer
3.JdkSerializationRedisSerializer: 使用JDK提供的序列化功能。 优点是反序列化时不需要提供类型信息(class),但缺点是序列化后的结果非常庞大,是JSON格式的5倍左右,这样就会消耗redis服务器的大量内存。
4.Jackson2JsonRedisSerializer:使用Jackson库将对象序列化为JSON字符串。优点是速度快,序列化后的字符串短小精悍。但缺点也非常致命,那就是此类的构造函数中有一个类型参数,必须提供要序列化对象的类型信息(.class对象)。

Verwenden Sie Spring-Annotationen, um Redis zu konfigurieren, konfigurieren Sie hier nur das Cluster-Beispiel

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

    //spring3支持注解方式获取value 在application里配置配置文件路径即可获取
    @Value("${spring.redis.cluster.nodes}")
    private String clusterNodes;

    @Value("${spring.redis.cluster.timeout}")
    private Long timeout;

    @Value("${spring.redis.cluster.max-redirects}")
    private int redirects;

    @Value("${redis.maxIdle}")
    private int maxIdle;

    @Value("${redis.maxTotal}")
    private int maxTotal;

    @Value("${redis.maxWaitMillis}")
    private long maxWaitMillis;

    @Value("${redis.testOnBorrow}")
    private boolean testOnBorrow;

    /**
     * 选择redis作为默认缓存工具
     * @param redisTemplate
     * @return
     */
    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate) {
        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
        //cacheManager.setDefaultExpiration(60);
        //Map<String,Long> expiresMap=new HashMap<>();
        //expiresMap.put("redisCache",5L);
        //cacheManager.setExpires(expiresMap);
        return cacheManager;
    }

    @Bean
    public RedisClusterConfiguration redisClusterConfiguration(){
        Map<String, Object> source = new HashMap<>();
        source.put("spring.redis.cluster.nodes", clusterNodes);
        source.put("spring.redis.cluster.timeout", timeout);
        source.put("spring.redis.cluster.max-redirects", redirects);
        return new RedisClusterConfiguration(new MapPropertySource("RedisClusterConfiguration", source));
    }

    @Bean
    public JedisConnectionFactory redisConnectionFactory(RedisClusterConfiguration configuration){
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxIdle(maxIdle);
        poolConfig.setMaxTotal(maxTotal); 
        poolConfig.setMaxWaitMillis(maxWaitMillis);
        poolConfig.setTestOnBorrow(testOnBorrow);
        return new JedisConnectionFactory(configuration,poolConfig);
    }

    /**
     * retemplate相关配置
     * @param factory
     * @return
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory factory) {

        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 配置连接工厂
        template.setConnectionFactory(factory);

        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
        Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper om = new ObjectMapper();
        // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
        //om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jacksonSeial.setObjectMapper(om);

        // 值采用json序列化
        template.setValueSerializer(jacksonSeial);
        //使用StringRedisSerializer来序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());

        // 设置hash key 和value序列化模式
        template.setHashKeySerializer(new StringRedisSerializer());
    
        template.setHashValueSerializer(jacksonSeial);
        template.afterPropertiesSet();

        return template;
    }
}

Hinweise:

1. Um Redis mithilfe von Anmerkungen zu konfigurieren oder @Configuration zu verwenden, müssen Sie in der Konfigurationsdatei angeben, welche Konfigurationsdateien unter welchen Paketen gescannt werden. Wenn es sich um Springboot handelt, habe ich dies natürlich nicht gesagt ...

<context:component-scan base-package="com.*"/>

2. spring3 unterstützt die Annotationsmethode, um den Wert zu erhalten, aber Sie müssen den Dateipfad in der geladenen Konfigurationsdatei konfigurieren. Sie können den spezifischen Wert selbst angeben...

<value>classpath:properties/spring-redis-cluster.properties</value>

3 Aufgrund des Originals unseres Unternehmens besteht der Hauptunterschied zwischen Spring2 und Spring2+ (meiner Meinung nach) darin, dass jedes Modul bei der Verwendung von Spring-Data-Redis als Vorlage für Redis verwendet wird Standalone-Situation Zwischen Spring 2.5.6 und Spring 4 wird es keinen Konflikt geben. Wenn Sie jedoch den Cluster-Modus verwenden und den Redis-Cluster konfigurieren müssen, kommt es zu Konflikten mit dem JAR-Paket. Dies hängt von Ihrer Entscheidung ab Sie können jedisCluster direkt verwenden, um eine Verbindung zum Redis-Cluster herzustellen (aber viele Methoden müssen selbst geschrieben werden). Sie können Spring2.5.6 auch durch eine höhere Version von Spring4 ersetzen. Beim Ersetzen des Frameworks sind jedoch noch weitere Dinge zu beachten ( Der direkte Ersatz für alles durch unser Unternehmen ist in Ordnung, O(∩_∩)O Haha~), was das Umschreiben von JedisConnectionFactory und RedisClusterConfiguration betrifft, habe ich es noch nicht ausprobiert. Dies kann als Folgeergänzung verwendet werden ...

4. Spring4 unterstützt übrigens nicht mehr. Wenn Sie Spring4 verwenden müssen, ist es am einfachsten, das Spring-Orm-Paket auf die Spring 3-Version zu ändern. und andere Gläser können weiterhin Version 4 sein. (Natürlich gibt es hier kein Problem mit einem direkten Ersatz, aber es kann zu potenziellen Problemen wie 3 kommen, daher muss das Unternehmen manchmal trotzdem aktualisieren ...)

Das obige ist der detaillierte Inhalt vonSpring-basierte Redis-Konfiguration (Standalone- und Cluster-Modus). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen