1. 程式人生 > >springboot-整合redis:做快取,做分散式共享session

springboot-整合redis:做快取,做分散式共享session

springboot-整合redis:做快取,做分散式共享session

文章目錄

完整程式碼下載連結:

https://github.com/2010yhh/springBoot-demos.git

環境

idea2018,jdk1.8,

springboot版本:springboot1.5.9.RELEASE,

1.redis應用場景

參見這篇

Redis的7個應用場景

2配置

pom需要:

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>

redis配置類:RedisConfig

@Configuration
@EnableCaching//開啟快取註解
//maxInactiveIntervalInSeconds:session的統一過期時間,預設是1800秒過期,這裡測試修改為60秒
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 60)//註解,開啟redis集中session管理
public class RedisConfig {
    // 以下redisTemplate自由根據場景選擇
    //預設的String-String
    //    @Bean
    public RedisTemplate RedisTemplate(RedisConnectionFactory factory) {
        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
        stringRedisTemplate.setConnectionFactory(factory);
        return stringRedisTemplate;
    }

    @Bean
    public RedisTemplate<String, Object> RedisTemplate2(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(factory);
        template.setKeySerializer(new StringRedisSerializer());
        //GenericJackson2JsonRedisSerializer方便反序列化,redis中也方便檢視json
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        template.setHashKeySerializer(new GenericJackson2JsonRedisSerializer());
        template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        template.afterPropertiesSet();
        return template;
    }
    @Bean
    public RedisTemplate<Object, Object> RedisTemplate3(RedisConnectionFactory factory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        //使用Jackson2JsonRedisSerializer來序列化和反序列化redis的value值(預設使用JDK的序列化方式)
        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(mapper);
        //使用StringRedisSerializer來序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());
        //使用Jackson2JsonRedisSerializer來序列化和反序列化redis的value值(預設使用JDK的序列化方式)
        template.setValueSerializer(serializer);
        // 設定hash key 和value序列化模式
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(serializer);
        template.afterPropertiesSet();
        return template;
    }
    /**
     * redis作為快取
     * @param redisTemplate
     * @return
     */
    @Bean
    public CacheManager cacheManager(RedisTemplate<String, Object>  redisTemplate) {
        RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
        // 多個快取的名稱,目前只定義了一個
        rcm.setCacheNames(Arrays.asList("user"));
        //設定快取過期時間(秒)
        rcm.setDefaultExpiration(60);
        return rcm;
    }

    /**
     * 在springboot中使用spring-session的時候,
     * 在不同的域名下面需要配置cookie主域否則session共享不生效
     * @return
     */
    @Bean
    public CookieSerializer cookieSerializer() {
        DefaultCookieSerializer defaultCookieSerializer = new DefaultCookieSerializer();
        //cookie名字
        defaultCookieSerializer.setCookieName("sessionId");
        //不同子域時設定
        //defaultCookieSerializer.setDomainName("xxx.com");
        //設定各web應用返回的cookiePath一致
        defaultCookieSerializer.setCookiePath("/");
        return defaultCookieSerializer;
    }
}

3.測試

3.1redis基本儲存
在這裡插入圖片描述
新增後:
在這裡插入圖片描述
在這裡插入圖片描述

3.2redis結合db做快取

1)多次查詢結果(設定redis快取過期時間1分鐘:)
在這裡插入圖片描述
2)插入後(設定redis快取過期時間30s:)多次查詢結果
在這裡插入圖片描述
在這裡插入圖片描述
3)更新後(設定redis快取過期時間1分鐘:)多次查詢結果

在這裡插入圖片描述
在這裡插入圖片描述

3.3redis做分散式session共享
1)沒有設定spring-session共享時: 無法共享session
在這裡插入圖片描述
在這裡插入圖片描述

2)設定了spring-session共享時: 共享了session
http://localhost:8090/testredis/ 設定session
在這裡插入圖片描述
http://localhost:8090/testredis/ get session
在這裡插入圖片描述

在這裡插入圖片描述
http://localhost:8091/testredis1/ get session
在這裡插入圖片描述

在這裡插入圖片描述