当前位置 : 首页 » 文章分类 :  开发  »  Spring-Data-Redis

Spring-Data-Redis

Spring Data Redis 使用笔记


SpringBoot2.2 连接 Redis 集群

spring.redis.cluster.nodes 逗号分割的集群节点
spring.redis.cluster.max-redirects 最大重定向数
spring.redis.timeout 连接超时时长(毫秒)
spring.redis.pool.max-active 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-wait 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-idle 连接池中的最大空闲连接
spring.redis.pool.min-idle 连接池中的最小空闲连接

application.properties 配置文件

spring.redis.cluster.nodes=10.153.177.20:8479,10.153.177.20:8579,10.153.177.20:8679
spring.redis.cluster.max-redirects=3
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=1

使用这种默认配置可以触发 SpringBoot 的自动配置,然后直接注入 redisTemplate 就可以使用。

@Autowired
private RedisTemplate<String, Object> redisTemplate;

@Test
public  void test1(){
    redisTemplate.opsForValue().set("k","vvv");
    System.out.println(redisTemplate.opsForValue().get("k"));
}

ConnectionWatchdog Reconnecting, last destination was

正常的

11:11:07.101 [lettuce-eventExecutorLoop-1-23] INFO  i.l.core.protocol.ConnectionWatchdog - Reconnecting, last destination was /10.153.177.20:8479
11:11:07.104 [lettuce-nioEventLoop-4-11] INFO  i.l.c.protocol.ReconnectionHandler - Reconnected to 10.153.177.20:8479

spring.redis.cluster.max-redirects

只留一个这个参数,也会去尝试连接集群。
所以要删集群配置就要删干净。


无密码redis配置密码导致连不上

假如 redis 无密码,但是在 spring 配置文件中配置了密码
spring.redis.password=123 会导致 lettuce 客户端连不上 redis,报如下错误:

org.springframework.data.redis.connection.PoolException: Could not get a resource from the pool; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to localhost:6379
...
Caused by: io.lettuce.core.RedisConnectionException: Unable to connect to localhost:6379
...
Caused by: io.lettuce.core.RedisCommandExecutionException: ERR AUTH <password> called without any password configured for the default user. Are you sure your configuration is correct?
    at io.lettuce.core.ExceptionFactory.createExecutionException(ExceptionFactory.java:135)

解决方法,去掉密码配置,如果 jar 包中已经配置了密码,可以在命令行配置空密码覆盖
比如命令行参数 --spring.redis.password=""
或 jvm 参数中配置 -Dspring.redis.password=""


SpringBoot2.x中jedis改为Lettuce

随着 SpringBoot2.x 的到来,支持的组件越来越丰富,也越来越成熟,其中对 Redis 的支持不仅仅是丰富了它的 API,更是替换掉底层 Jedis 的依赖,取而代之换成了 Lettuce(生菜)

Lettuce
Lettuce 和 Jedis 的都是连接Redis Server的客户端程序。Jedis在实现上是直连redis server,多线程环境下非线程安全,除非使用连接池,为每个Jedis实例增加物理连接。Lettuce基于Netty的连接实例(StatefulRedisConnection),可以在多个线程间并发访问,且线程安全,满足多线程环境下的并发访问,同时它是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。

一起来学SpringBoot | 第九篇:整合Lettuce Redis
https://blog.battcn.com/2018/05/11/springboot/v2-nosql-redis/

Lettuce - Advanced Java Redis client
lettuce-io / lettuce-core
https://www.processon.com/diagrams


RedisTemplate中的executePipelined

// 创建结果集
Map<Long, Long> result = Maps.newLinkedHashMap();

// 加入从redis中没取到
// values为空时从数据库查
userIds.forEach(u -> result.put(u, getAccountIdByUserId(u)));

// 查完批量放入redis(其实直接用mset一条命令即可,不用管道)
executorService.execute(() -> {
    try {
        // 批量放入redis
        redisClient.executePipelined(redisConnection -> {
            RedisSerializer<String> serializer = new StringRedisSerializer();
            result.forEach((userId, accountId) -> {
                if (accountId != null) {
                    String key = Joiner.on("-").join(USER_ID_PRE, userId);
                    redisConnection.set(serializer.serialize(key), serializer.serialize(String.valueOf(accountId)));
                }
            });
            return null;
        });
    } catch (RedisConnectionFailureException e) {
        logger.error("[Redis] Exception catched when set mapping of user id and account id", e);
    }
});

redis pipeline简介
https://www.jianshu.com/p/a8e33e058518


RedisTemplate

package org.springframework.data.redis.core;
public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperations<K, V>, BeanClassLoaderAware {
}

类型参数:
K 模板中的Redis key的类型(通常为String)如:RedisTemplate<String, Object>
V 模板中的Redis value的类型

RedisTemplate 中定义了对5种数据结构操作

redisTemplate.opsForValue();//操作字符串
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set

StringRedisTemplate

package org.springframework.data.redis.core;
public class StringRedisTemplate extends RedisTemplate<String, String> {
}

StringRedisTemplate与RedisTemplate区别

两者的关系是StringRedisTemplate继承RedisTemplate。

两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。

StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。

RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

如何使用RedisTemplate访问Redis数据结构
https://www.jianshu.com/p/7bf5dc61ca06


上一篇 MySQL-事务与锁

下一篇 Nginx

阅读
评论
1,100
阅读预计5分钟
创建日期 2018-10-20
修改日期 2020-08-08
类别

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论