您的位置:首页 > 数据库 > Redis

redis学习系列(二)--spring boot整合Redis集群

2018-01-24 10:59 756 查看

spring boot整合Redis集群

开发

项目地址 https://gitee.com/zhenhai_zheng/springboot_rediscluster.git


添加依赖,加载Jedis

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


添加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<HostAndPort> 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 的序列化方式
*</br>redisTemplate序列化默认使用的jdkSerializeable,存储二进制字节码,导致key会出现乱码,所以自定义
*序列化类
*
* @paramredisConnectionFactory
*/
@Bean
publicRedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)throws UnknownHostException {
RedisTemplate<Object,Object> redisTemplate = newRedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer =new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper =new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setKeySerializer(newStringRedisSerializer());

redisTemplate.afterPropertiesSet();

return redisTemplate;
}

}


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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: