美文网首页
SpringBoot全景速学3——Redis集成

SpringBoot全景速学3——Redis集成

作者: 千淘萬漉 | 来源:发表于2019-03-30 15:01 被阅读0次

Redis是目前使用最为广泛的缓存中间件,也是排名热度最高的KV型Nosql,这里着重记录一下在SpringBoot中如何快速集成Redis,以及一些基本的操作用法。

Spring Boot 提供了对 Redis 集成的组件包:spring-boot-starter-data-redis,它依赖于 spring-data-redis 和 lettuce。Spring Boot 1.0 默认使用的是 Jedis 客户端,2.0 替换成了Lettuce。

Redis集成

1.依赖与配置

SpringBoot中集成Redis只需要添加两个依赖项即可,其中commons-pool2是为创建Redis的连接池。

<!-- redis支持 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

application配置Redis的环境信息

# Redis 数据库索引(默认为 0)
spring.redis.database=0
# Redis 服务器器地址
spring.redis.host=localhost
# Redis 服务器器连接端⼝口
spring.redis.port=6379
# Redis 服务器器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大空闲连接默认 8
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接默认 0
spring.redis.lettuce.pool.min-idle=0

以上就可以完成了对Redis的环境配置。

2.Redis开发使用

Redis 支持多种数据类型,实体、哈希、列列表、集合、有序集合,现在就把对常用的数据类型操作进行逐一展示:

  • Pojo类型,支持对象的直接存储:
@Test
public void testObj(){
    User user=new User("Micheal", "JorDon", 44, "American");
    ValueOperations<String, User> operations=redisTemplate.opsForValue();
    operations.set("com.example", user);
    User u=operations.get("com.example");
    System.out.println("user: "+u.toString());
}

对于每一个数据的时候都可以设置一个超时时间:

operations.set("expire", user,100,TimeUnit.MILLISECONDS);
  • HASH,一般传入三个参数,第一个为Key,后面两个才是Hash对。
@Test
public void testHash() {
    HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();
    hash.put("hash","you","you");
    String value=(String) hash.get("hash","you");
    System.out.println("hash value :"+value);
}

除了单个Hash操作还可以利用putAll()批量存入:

Map<Object, Object> userMap= Maps.newHashMap();
userList.forEach( user-> {
     userMap.put(user.getId(), user.getName());
});
redisTemplate.opsForHash().putAll(redisKey, userMap);
  • List类型,Redis的List类型是双向链表实现,可支持左右方向的操作。
@Test
public void testList() {
     ListOperations<String, String> list = redisTemplate.opsForList();
     list.leftPush("list","1");
     list.leftPush("list","2");
     list.leftPush("list","3");
     String value=(String)list.leftPop("list");
     System.out.println("list value :"+value.toString());
}
  • Set类型,无序自动排重
SetOperations<String, String> set = redisTemplate.opsForSet();
  • ZSet,有序自动排重
ZSetOperations<String, String> zset = redisTemplate.opsForZSet();

Redis的多源配置

在一些业务场景上,有可能会使用到多源Redis的情景,这个时候需要提供一些区别数据源的配置来声明使用对应的Redis。

1.声明一个抽象Redis配置类:

public abstract class AbstractRedisConfig {   
    //redis集群节点 redis-1:4307,redis-2:4744格式,以英文逗号为分隔
    private String nodes;
    //redis集群密码
    private String password;
    
    public String getNodes(){
        return nodes;
    }
    
    public void setNodes(String nodes){
        this.nodes = nodes;
    }
    
    public String getPassword(){
        return password;
    }
    
    public void setPassword(String password){
        this.password = password;
    }
    
    public RedisConnectionFactory connectionFactory() throws Exception{
        RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(Arrays.asList(nodes.split(",")));
        redisClusterConfiguration.setPassword(RedisPassword.of(password));
        LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(redisClusterConfiguration);
        // 需要手动调用下才会初始化
        lettuceConnectionFactory.afterPropertiesSet();
        return lettuceConnectionFactory;
    }
    
    /**
     * 定义模板多数据源方法
     * @return
     */
    public abstract StringRedisTemplate getRedisTemplate() throws Exception;
}

2.代码实现不同Redis数据源的读取

不同源的写法在下面都一样,主Redis源会比其他的多一个@Primary注解,其他写法都是仿照来配置,在前缀和Bean声明上来区分即可:

主Redis源代码:

@ConfigurationProperties(prefix = "spring.redis.cluster.one")
@Configuration
public class FirstRedisConfig extends AbstractRedisConfig {
    /**
     * 生成redis集群操作diversityRedisTemplate<br/>
     * 注意使用 @Resource 注解,如果是用@Autoware时 需要@Qualifier指定别名
     */
    @Bean(name = "firstRedisTemplate")
    @Primary
    @Override
    public StringRedisTemplate getRedisTemplate() throws Exception
    {
        return new StringRedisTemplate(connectionFactory());
    }
}

第二套Redis源代码:

@ConfigurationProperties(prefix = "spring.redis.cluster.second")
@Configuration
public class SecondRedisConfig extends AbstractRedisConfig {
    /**
     * 生成redis集群操作moRedisTemplate<br/>
     * 注意使用 @Resource 注解,如果是用@Autoware时 需要@Qualifier 指定别名
     */
    @Bean(name = "secondRedisTemplate")
    @Override
    public StringRedisTemplate getRedisTemplate() throws Exception{
        return new StringRedisTemplate(connectionFactory());
    }
}

3.配置文件声明

在application配置文件里写好两套Redis的环境信息,密码如果无可以空白。

spring.redis.cluster.first.nodes=redis-1:6379,redis-1:6380,redis-1:6381
spring.redis.cluster.first.password=

spring.redis.cluster.second.nodes=redis-2:6379,redis-2:6380,redis-2:6381
spring.redis.cluster.second.password=

4.注入使用

在别的类中,声明使用Redis的方法,即可通过在数据源中@Bean中指定的名称直接注入使用即可:

@Resource
private StringRedisTemplate firstRedisTemplate;

相关文章

网友评论

      本文标题:SpringBoot全景速学3——Redis集成

      本文链接:https://www.haomeiwen.com/subject/ibvjbqtx.html