添加依赖,加载Jedis
org.springframework.boot
spring-boot-starter-data-redis
添加redis配置
springboot配置文件中添加集群的信息
# Redis服务器地址
#spring.redis.host=10.100.50.23
# Redis服务器连接端口
#spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=0
spring.redis.commandTimeout=5000
# redis.cluster
spring.redis.cluster.nodes=10.100.50.23:6380,10.100.50.23:6381,10.100.50.23:6382,10.100.50.23:6383,10.100.50.23:6384,10.100.50.23:6385
项目入口类加入注解@EnableCaching,添加到缓存
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@SpringBootApplication
@MapperScan("com.example.dao")
@EnableCaching
public class DemoApplication {
public static voidmain(String[] args) {
SpringApplication.run(DemoApplication.class,args);
}
}
自定义redis配置,加入集群
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
import java.net.UnknownHostException;
import java.util.HashSet;
import java.util.Set;
/**
* @authorzhenhai.zheng
* @describe
*@date 2018/1/23
**/
@Configuration
@ConditionalOnClass({JedisCluster.class})
public class RedisConfig {
@Value("${spring.redis.cluster.nodes}")
privateString clusterNodes;
@Value("${spring.redis.timeout}")
private inttimeout;
@Value("${spring.redis.pool.max-idle}")
private intmaxIdle;
@Value("${spring.redis.pool.max-wait}")
private longmaxWaitMillis;
@Value("${spring.redis.commandTimeout}")
private intcommandTimeout;
@Bean
publicJedisCluster getJedisCluster() {
String[] cNodes = clusterNodes.split(",");
Set nodes =new HashSet<>();
//分割出集群节点
for(String node : cNodes) {
String[] hp = node.split(":");
nodes.add(newHostAndPort(hp[0],Integer.parseInt(hp[1])));
}
JedisPoolConfig jedisPoolConfig =new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
//创建集群对象
// JedisCluster jedisCluster = new JedisCluster(nodes,commandTimeout);
return newJedisCluster(nodes,commandTimeout,jedisPoolConfig);
}
/**
* 设置数据存入redis 的序列化方式
*redisTemplate序列化默认使用的jdkSerializeable,存储二进制字节码,导致key会出现乱码,所以自定义
*序列化类
*
* @paramredisConnectionFactory
*/
@Bean
publicRedisTemplate
Service实现类中,自动注入jedisCluster
@Autowired
private JedisCluster jedisCluster;
并写入一个测试方法
public String findRedis() {
jedisCluster.set("userName", "hello wenqy");
return jedisCluster.get("userName");
}
在控制层加入调用刚才的service方法
@RequestMapping("/redis")
public String findRedis() {
return userService.findRedis();
}
在findRedis方法中打断点,第一次访问时建立缓存,第二次访问发现没有进入该函数。但返回的结果是一样的。
最后访问
spring boot集成redis进行数据缓存功能
@Cacheable 表明Spring在调用方法之前,首先应该在缓存中查找方法的返回值。如果这个值能够找到,就会返回缓存的值。否则的话,这个方法就会被调用,返回值会放到缓存之中
@cacheput 表明Spring应该将方法的返回值放到缓存中。在方法的调用前并不会 检查缓存,方法始终都会被调用
@cacheevict 表明Spring应该在缓存中清除一个或多个条目
@caching 这是一个分组的注解,能够同时应用多个其他的缓存注解
@cacheconfig 可以在类层级配置一些共用的缓存配置
项目地址https://gitee.com/zhenhai_zheng/springboot_rediscluster.git
将相关注解添加到接口方法上即可
/**
* 指定id的数据
* @param id
* @return
*/
@Cacheable(value = "user_",key = "#root.caches[0].name+#id")
@RequestMapping("get/{id}")
public User get(@PathVariable("id") String id){
User user = userService.getUser(id);
return user;
}
/**
*
* @param user
*/
@RequestMapping("/updateUser")
@CachePut(value = "user_",key = "#root.caches[0].name+#user.id")
public void updateUser(User user){
userService.updateByPrimaryKey(user);
}
/**
*
* @param id
*/
@RequestMapping("/delete/{id}")
@CacheEvict(value = "user_",key = "#root.caches[0].name+#id")
public void delete(@PathVariable("id") String id){
userService.deleteByPrimaryKey(id);
}