Netty-Redis-Lettuce 关于闲置连接和活动连接的一点心得

2024-06-08 01:18

本文主要是介绍Netty-Redis-Lettuce 关于闲置连接和活动连接的一点心得,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写netty项目的时候,学习了一下相关的Redis API.(Lettuce框架的)

了解了一下redis缓冲池中的连接分配机制:

拿来与大家分享,简要说明一下,觉得不好的不要喷....

这也是做笔记的一种方式:

(如果有不对的希望大家帮忙指出来 感谢感谢!!)

 

//redis pool
private static final RedisConnectionPool<RedisAsyncCommands<String, String>>  pool;//init pool
static {//创建一个RedisURI对象 并为其设置必要的参数RedisURI redisURI = new RedisURI();redisURI.setHost( ConstUtil.REDIS_HOST );redisURI.setPort( ConstUtil.REDIS_PORT );redisURI.setPassword( ConstUtil.REDIS_PASSWORD );redisURI.setTimeout( ConstUtil.REDIS_EXPIRE );redisURI.setUnit( TimeUnit.SECONDS );//也可直接将url的字符串传入 RedisClient.create()方法中  eg:redis://[password@]host[:port][/databaseNumber]RedisClient client = RedisClient.create( redisURI );//从redis客户端中获取一个异步的redis缓冲池pool = client.asyncPool( ConstUtil.REDIS_MAX_IDLE, ConstUtil.REDIS_MAX_ACTIVE );//参数说明:REDIS_MAX_IDLE 为本缓冲池中最大闲置连接数量 REDIS_MAX_ACTIVE 为本缓冲池中最大活动连接数量
}//从缓冲池中获取一个连接
public static RedisAsyncCommands<String, String> getRedisConnection() {return pool.allocateConnection();
}//关闭服务器时 关闭缓冲池
public static void shutDown(){pool.close();
}//以下为测试代码
public static void main( String[] args ) {//RedisAsyncCommands<String, String> commands = getRedisConnection();//RedisAsyncCommands<String, String> commands1 = getRedisConnection();RedisURI redisURI = new RedisURI();redisURI.setHost( ConstUtil.REDIS_HOST );redisURI.setPort( ConstUtil.REDIS_PORT );redisURI.setPassword( ConstUtil.REDIS_PASSWORD );redisURI.setTimeout( ConstUtil.REDIS_EXPIRE );redisURI.setUnit( TimeUnit.SECONDS );RedisClient client = RedisClient.create( redisURI );//此处将redis缓冲池中 最大闲置连接数量控制为1RedisConnectionPool<RedisAsyncCommands<String, String>> pool = client.asyncPool( 1, ConstUtil.REDIS_MAX_ACTIVE );//打印当前缓冲池中的 连接情况 活动连接为0 闲置连接也为0System.out.println("Before NumActive is: " + pool.getNumActive() + " NumIdel is: " +pool.getNumIdle());//此处使用try(){}语句块获得一个新连接try(RedisAsyncCommands<String, String> connection = pool.allocateConnection()){connection.get( "key" );//该连接当前状态为ALLOCATED//此处加断点可观察到该连接为 1e8b7643System.out.println("call try-catch");}//由于RedisAsyncCommands继承了closeable接口 所以此处语句块执行完毕后connection将被自动关闭 缓冲池中连接为1e8b7643 当前状态为IDLE//打印当前缓冲池中的 连接情况 活动连接为0 闲置连接也为1 System.out.println( "After call{ 01 } NumActive is: " + pool.getNumActive() + " NumIdel is: " + pool.getNumIdle() );//此处使用try(){}语句块获得一个连接try(RedisAsyncCommands<String, String> connection = pool.allocateConnection()){//此处返回连接为 1e8b7643 为刚才的连接  当前状态为ALLOCATEDconnection.get( "key" ); System.out.println( "call try-catch" );try(RedisAsyncCommands<String, String> connection2 = pool.allocateConnection()){//此处返回一个新的连接为 3f57bcadconnection2.get( "key" );System.out.println("call try-catch");}//此处释放connection2 System.out.println("isAuto-close?”);//此处添加断点 缓存池中连接为 3f57bcad 状态为 IDLE}//打印当前缓冲池中的 连接情况 活动连接为0 闲置连接也为1 System.out.println( "After call{ 02 } NumActive is: " + pool.getNumActive() + " NumIdel is: " + pool.getNumIdle() );//此处使用try(){}语句块获得一个连接 该链接为3f57bcad 由此可见先被放回缓冲池的连接 状态由ALLOCATED 置为 IDLE后被释放的连接如果缓存池中的闲置连接数量达到了设置的最大闲置数量 则不放入缓冲池作为IDLE连接try(RedisAsyncCommands<String, String> connection = pool.allocateConnection()){connection.get( "key" );System.out.println("call try-catch");}//pool.close();//打印当前缓冲池中的 连接情况 活动连接为0 闲置连接也为1     System.out.println( "After call{ 03 } NumActive is: " + pool.getNumActive() + " NumIdel is: " + pool.getNumIdle() );RedisConnectionPool<RedisAsyncCommands<String, String>> pool2 = client.asyncPool( 1, ConstUtil.REDIS_MAX_ACTIVE );RedisAsyncCommands<String, String> connection = pool2.allocateConnection();connection.get( "key" );System.out.println( "unused TRY Before NumActive is: " + pool2.getNumActive() + " NumIdel is: " + pool2.getNumIdle() );pool2.freeConnection( connection );System.out.println( "unused TRY After call{ 03 } NumActive is: " + pool2.getNumActive() + " NumIdel is: " + pool2.getNumIdle() );}

 

 

 

这篇关于Netty-Redis-Lettuce 关于闲置连接和活动连接的一点心得的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1040842

相关文章

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

Spring Boot 整合 MyBatis 连接数据库及常见问题

《SpringBoot整合MyBatis连接数据库及常见问题》MyBatis是一个优秀的持久层框架,支持定制化SQL、存储过程以及高级映射,下面详细介绍如何在SpringBoot项目中整合My... 目录一、基本配置1. 添加依赖2. 配置数据库连接二、项目结构三、核心组件实现(示例)1. 实体类2. Ma

电脑win32spl.dll文件丢失咋办? win32spl.dll丢失无法连接打印机修复技巧

《电脑win32spl.dll文件丢失咋办?win32spl.dll丢失无法连接打印机修复技巧》电脑突然提示win32spl.dll文件丢失,打印机死活连不上,今天就来给大家详细讲解一下这个问题的解... 不知道大家在使用电脑的时候是否遇到过关于win32spl.dll文件丢失的问题,win32spl.dl

redis+lua实现分布式限流的示例

《redis+lua实现分布式限流的示例》本文主要介绍了redis+lua实现分布式限流的示例,可以实现复杂的限流逻辑,如滑动窗口限流,并且避免了多步操作导致的并发问题,具有一定的参考价值,感兴趣的可... 目录为什么使用Redis+Lua实现分布式限流使用ZSET也可以实现限流,为什么选择lua的方式实现

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、

Windows Server服务器上配置FileZilla后,FTP连接不上?

《WindowsServer服务器上配置FileZilla后,FTP连接不上?》WindowsServer服务器上配置FileZilla后,FTP连接错误和操作超时的问题,应该如何解决?首先,通过... 目录在Windohttp://www.chinasem.cnws防火墙开启的情况下,遇到的错误如下:无法与

Redis中的常用的五种数据类型详解

《Redis中的常用的五种数据类型详解》:本文主要介绍Redis中的常用的五种数据类型详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis常用的五种数据类型一、字符串(String)简介常用命令应用场景二、哈希(Hash)简介常用命令应用场景三、列表(L

Redis解决缓存击穿问题的两种方法

《Redis解决缓存击穿问题的两种方法》缓存击穿问题也叫热点Key问题,就是⼀个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击,本文给大家介绍了Re... 目录引言解决办法互斥锁(强一致,性能差)逻辑过期(高可用,性能优)设计逻辑过期时间引言缓存击穿:给