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为基础架构的开发中首选的依赖包。
废话不多说,具体的集成使用如下
org.springframework.boot
spring-boot-starter-data-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
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("缓存无数据");
}
}
同样可以进行数据的操作
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