Redis学习笔记11:基于spring的Lettuce redis客户端普通指令、RedisCallback、SessionCallback建立连接数

一个对springboot redis框架进行重写,支持lettuce、jedis、连接池、同时连接多个集群、多个redis数据库、开发自定义属性配置的开源SDK

xml 复制代码
<dependency>
    <groupId>io.github.mingyang66</groupId>
    <artifactId>emily-spring-boot-redis</artifactId>
    <version>4.3.9</version>
</dependency>

GitHub地址:https://github.com/mingyang66/spring-parent

一、StringRedisTemplate普通指令建立连接数
java 复制代码
        stringRedisTemplate.opsForValue().set("test1", "2", 10, TimeUnit.SECONDS);
        stringRedisTemplate.opsForValue().set("test2", "2", 10, TimeUnit.SECONDS);
        stringRedisTemplate.opsForValue().set("test3", "2", 10, TimeUnit.SECONDS);

执行上述三条指令,日志如下:

sh 复制代码
2023-11-01 21:40:10.716 DEBUG default --- [se-nio-8080-exec-7] o.s.d.r.core.RedisConnectionUtils   :143  : Fetching Redis Connection from RedisConnectionFactory 
2023-11-01 21:40:10.722 DEBUG default --- [se-nio-8080-exec-7] o.s.d.r.core.RedisConnectionUtils   :379  : Closing Redis Connection 
2023-11-01 21:40:10.723 DEBUG default --- [se-nio-8080-exec-7] o.s.d.r.core.RedisConnectionUtils   :143  : Fetching Redis Connection from RedisConnectionFactory 
2023-11-01 21:40:10.729 DEBUG default --- [se-nio-8080-exec-7] o.s.d.r.core.RedisConnectionUtils   :379  : Closing Redis Connection 
2023-11-01 21:40:10.730 DEBUG default --- [se-nio-8080-exec-7] o.s.d.r.core.RedisConnectionUtils   :143  : Fetching Redis Connection from RedisConnectionFactory
2023-11-01 21:40:10.736 DEBUG default --- [se-nio-8080-exec-7] o.s.d.r.core.RedisConnectionUtils   :379  : Closing Redis Connection 

如上述日志所示,每条指令都会建立一个redis连接,指令执行完成后关闭。看日志确实是建立了三条连接,但是我有个疑惑lettuce redis客户端默认不是shareNativeConnection为true公用一条本地物理连接?那就通过netstat -an|grep ip地址查看本地建立连接数发现确实只有一条,通过debug代码org.springframework.data.redis.core.RedisConnectionUtils#doCloseConnection发现其实不是真正的关闭物理连接,综上分析:多条普通指令是公用一个本地物理连接的。

二、StringRedisTemplate管道pipelined RedisCallback回调建立连接数
复制代码
       List<Object> results = stringRedisTemplate.executePipelined(new RedisCallback<Object>() {
            @Override
            public Object doInRedis(RedisConnection connection) throws DataAccessException {
                StringRedisConnection stringRedisConn = (StringRedisConnection) connection;
                for (int i = 0; i < 10; i++) {
                    stringRedisConn.setEx("test" + i, 100, i + 100 + "");
                }
                return null;
            }
        });

执行上述管道指令,管道中发送10条指令,执行日志结果如下:

sh 复制代码
2023-11-01 21:54:11.475 DEBUG default --- [se-nio-8080-exec-8] o.s.d.r.core.RedisConnectionUtils   :143  : Fetching Redis Connection from RedisConnectionFactory 
2023-11-01 21:54:11.559 DEBUG default --- [se-nio-8080-exec-8] o.s.d.r.core.RedisConnectionUtils   :379  : Closing Redis Connection 

发送指令SETEX日志一共有10条:

sh 复制代码
2023-11-01 21:54:11.534 DEBUG default --- [se-nio-8080-exec-8] io.lettuce.core.RedisChannelHandler :202  : dispatching command AsyncCommand [type=SETEX, output=StatusOutput [output=null, error='null'], commandType=io.lettuce.core.protocol.Command] 

管道建立一个连接,封装多条指令,一次性提交后关闭连接,返回执行结果集合,能有效提升性能。可以通过netstat -an|grep ip地址观察本地连接的建立和销毁,可以发现即使shareNativeConnection为true,也会新建一条新的本地物理连接,管道中的所有指令执行完成后则会立马关闭新建的连接。

三、StringRedisTemplate管道pipelined SessionCallback回调建立连接数
java 复制代码
        stringRedisTemplate.executePipelined(new SessionCallback<String>() {
            @Override
            public String execute(RedisOperations operations) throws DataAccessException {
                operations.opsForValue().set("test","t",10,TimeUnit.SECONDS);
                operations.opsForValue().set("test","t",10,TimeUnit.SECONDS);
                operations.opsForValue().set("test","t",10,TimeUnit.SECONDS);
                operations.opsForValue().set("test","t",10,TimeUnit.SECONDS);
                return null;
            }
        });

执行日志如下:

sh 复制代码
2023-11-03 14:40:23.527 DEBUG default --- [se-nio-8080-exec-7] o.s.d.r.core.RedisConnectionUtils   :143  : Fetching Redis Connection from RedisConnectionFactory 
2023-11-03 14:40:27.007 DEBUG default --- [se-nio-8080-exec-7] o.s.d.r.core.RedisConnectionUtils   :379  : Closing Redis Connection 

通过日志可以看到管道建了一条连接,指令执行完成后则直接关闭;通过netstat -an|grep ip地址 观察到新建了一条本地物理连接,指令执行完成后则直接关闭了连接。

相关推荐
weixin_4383354017 小时前
Redis:分组与设备在 Redis 中缓存存储设计
redis·缓存·bootstrap
JAVA坚守者17 小时前
Redis Desktop Manager 使用前的准备工作
redis·centos·网络配置·redis manager·安全设置
秋也凉21 小时前
redis的命令集合
数据库·redis·缓存
都叫我大帅哥1 天前
Redis内存淘汰策略:从OOM崩溃到丝滑运行的终极指南
java·redis
R-sz1 天前
java内存缓存实现 与 redis缓存实现 (ConcurrentHashMap 应用)
java·redis·缓存
岁岁岁平安1 天前
Redis基础学习(五大值数据类型的常用操作命令)
数据库·redis·学习·redis list·redis hash·redis set·redis string
来自宇宙的曹先生2 天前
用 Spring Boot + Redis 实现哔哩哔哩弹幕系统(上篇博客改进版)
spring boot·redis·后端
灵犀学长2 天前
解锁Spring Boot多项目共享Redis:优雅Key命名结构指南
数据库·redis
都叫我大帅哥2 天前
Redis哨兵完全指南:从救火队员到集群守护神
redis
都叫我大帅哥2 天前
Redis主从架构:从菜鸟到大神的通关秘籍
redis