Maison > Java > javaDidacticiel > le corps du texte

Configuration Redis basée sur Spring (mode autonome et cluster)

不言
Libérer: 2019-02-21 14:47:52
avant
2184 Les gens l'ont consulté

Cet article vous apporte du contenu sur la configuration Redis basée sur Spring (mode autonome et cluster). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Package jar requis : version spring : 4.3.6.RELEASE, version jedis : 2.9.0, spring-data-redis:1.8.0.RELEASE si vous utilisez la sérialisation jackson, vous avez également besoin de : jackson - annotations et package jackson-databind

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>
Copier après la connexion

Brève description de la configuration de la sérialisation :

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对象)。
Copier après la connexion

Utilisez les annotations Spring pour configurer Redis, configurez ici uniquement l'exemple de cluster

@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;
    }
}
Copier après la connexion

Remarques :

1. Utilisez l'annotation pour configurer Redis ou utilisez @Configuration. Vous devez spécifier dans le fichier de configuration quels fichiers de configuration sous quels packages analyser. Bien sûr, s'il s'agit de Springboot, alors je ne l'ai pas fait. a dit ceci. En un mot...

<context:component-scan base-package="com.*"/>
Copier après la connexion

2. spring3 prend en charge la méthode d'annotation pour obtenir la valeur, mais vous devez configurer le chemin du fichier dans le fichier de configuration chargé. Vous pouvez spécifier vous-même la valeur spécifique. ...

<value>classpath:properties/spring-redis-cluster.properties</value>
Copier après la connexion

3. Puisque le framework original de notre entreprise utilise spring2.5.6, la principale différence entre spring2 et spring2+ (bien sûr ma propre opinion) est que chaque module est divisé en différents jars, et pour utilisation de Spring-Data - Si Redis est conçu pour gérer Redis, Spring 2.5.6 et Spring 4 ne seront pas en conflit dans une situation autonome. Cependant, si vous utilisez le mode cluster et devez configurer un cluster Redis, un conflit de package Jar se produira. Cela se produit à ce stade, cela dépend de la manière dont vous décidez. Vous pouvez l'utiliser directement jedisCluster pour vous connecter au cluster Redis (mais de nombreuses méthodes doivent être écrites par vous-même), vous pouvez également remplacer spring2.5.6 par une version supérieure de spring4. , mais il y a d'autres choses auxquelles il faut faire attention lors du remplacement du framework (il n'y a rien de mal à ce que notre entreprise remplace directement tout Eh bien, O(∩_∩)O haha~), quant à la réécriture de JedisConnectionFactory et RedisClusterConfiguration, je ne l'ai pas fait je l'ai déjà essayé. Cela peut être utilisé comme supplément de suivi...

4 À propos, spring4 n'est plus pris en charge par ibatis. Si vous avez besoin d'utiliser spring 4 et de vous connecter à ibatis, le moyen le plus grossier est de remplacer le package spring-orm par la version spring 3, et les autres pots peuvent toujours être en 4 versions. (Bien sûr, il n'y a pas de problème de remplacement direct ici, mais il peut y avoir des problèmes potentiels comme 3, donc l'entreprise doit encore parfois mettre à jour...)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:segmentfault.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!