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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_41669919/article/details/79148203

spring boot整合Redis集群

开发


添加依赖,加载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);
}

没有更多推荐了,返回首页