Spring Boot(五):集成Redis和使用Redis实现缓存共享

Redis(REmote DIctionary Server)是一个key-value存储系统,是当下互联网公司最常用的NoSQL数据库之一。支持存储的value类型有string、list、set、zset(sorted set --有序集合)和hash。Redis的数据是存储在内存中的,通过磁盘的高速写入存储数据,存储速度和多种数据类型是Redis的两大优点,同时还有操作的原子性,以及它的通用性,这使得Redis在NoSQL里算的上是首屈一指的了。

Java对Redis的支持体现在Jedis,Jedis 是 Redis 的 Java 版客户端实现,它封装了对 Redis 的各种操作,并且支持事务、管道及 Jedis 自身实现的分布式。在Spring家族日渐扩大的情况下,Spring自然也整合了Redis的功能,Spring Data Redis就是这么一个模块,它实现了对 Jedis 客户端 API 的高度封装,使对 Redis 的操作更加便捷。在SpringBoot诞生后,spring-boot-starter-data-redis这个依赖包更是整合了它前辈的功能,也就是Spring Data Redis 和 Jedis 所具备的功能。由于使用Jedis会导致架构中ElasticSearch的功能出问题,所以spring-boot-starter-data-redis成为以SpringBoot为基础架构的开发中首选的依赖包。

废话不多说,具体的集成使用如下

  • 增加Redis依赖


    org.springframework.boot
    spring-boot-starter-data-redis
  • 对Redis进行配置

spring:
  //数据源配置
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3306/springboot_test?useSSL=true&characterEncoding=utf-8
  //redis配置
  redis:
    //数据库索引,默认0
    database: 5
    //本机ip
    host: 192.168.1.22
    //端口,默认6379
    port: 6379
    jedis:
      pool:
        //最大连接数、最小空闲连接、最大空闲连接、最大阻塞等待时间(使用负值表示没有限制)
        max-active: 1000
        min-idle: 10
        max-idle: 500
        max-wait: 5000ms
    //连接超时时间
    timeout: 10000ms
  • 增加Redis配置类

SpringBoot中去掉了繁琐的配置,设置好了初始配置,如果要进行更改需要自己手写配置类

package pers.hong.config;

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.lang.reflect.Method;

/**
 * @Description:Redis配置类
 * @Auther: hong
 * @Date: 2018/09/16
 */
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {

    //主键生成策略,默认使用参数名
    @Bean
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object o, Method method, Object... objects) {
                StringBuilder sb = new StringBuilder();
                sb.append(o.getClass().getName());
                sb.append(method.getName());
                for (Object obj : objects) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }
}
  • 测试

package pers.hong;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * @Description:Redis缓存测试类
 * @Auther: hong
 * @Date: 2018/09/16
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisTemplateTest {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    public void stringTest(){
        stringRedisTemplate.opsForValue().set("rng","uzi");
        if ("uzi".equals(stringRedisTemplate.opsForValue().get("rng"))){
            System.out.println("数据已存进缓存中");
        }else {
            System.out.println("缓存无数据");
        }
    }
}

测试结果为:

说明set的键值对已经存进缓存中了,同时我们测试下hash类型的数据


    @Test
    public void testHash(){
        HashOperations hash = stringRedisTemplate.opsForHash();
        hash.put("faker","skt","mid");
        if("mid".equals(hash.get("faker","skt"))){
            System.out.println("数据已存进缓存中");
        }else {
            System.out.println("缓存无数据");
        }
    }

同样可以进行数据的操作

  • 增加缓存依赖和session配置类


	org.springframework.boot
	spring-boot-starter-cache
@Configuration
//配置session过期时间
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400)
public class SessionConfig {
}
  • 测试

package pers.hong.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * @Description:
 * @Auther: hong
 * @Date: 2018/09/15
 */
@RestController
public class RedisController {
    @RequestMapping("setSession")
    public Map setSession(HttpServletRequest request){
        Map resultMap = new HashMap<>();
        request.getSession().setAttribute("URL",request.getRequestURL());
        resultMap.put("req URL:",request.getRequestURI());
        return resultMap;
    }


//    @RequestMapping("setSession")
//    public Map setSession(HttpServletRequest request){
//        Map resultMap = new HashMap<>();
//        request.getSession().setAttribute("message",request.getRequestURL());
//        resultMap.put("req URL:",request.getRequestURI());
//        return resultMap;
//    }

    @RequestMapping("getSession")
    public Map getSession(HttpServletRequest request){
        Map resultMap = new HashMap<>();
        resultMap.put("message",request.getSession().getAttribute("message"));
        resultMap.put("sessionId",request.getSession().getId());
        return resultMap;
    }
}

拷贝一份项目,将第二个方法放在放在第二个项目,设置第二个项目端口号为8090,同时跑两个项目。

访问http://localhost:8080/setSession,然后再访问http://localhost:8080/getSession,得到结果

{"sessionId":"582363e4-049e-4e76-980c-d8fwu275f93j","message":"http://localhost:8080/setSession"}

再访问http://localhost:8090/getSession,得到的结果也是一样的,说明已经实现了session共享了

demo地址:https://github.com/hong52ni/SpringBoot-Demo-Aggregate

你可能感兴趣的:(Spring,Boot,Redis)