[Docker应用系列·1] 浅析Jedis Pool

简介: >本文环境: jedis 2.1.0 redis 2.8.13 ###Redis无响应 我们的各个子系统均使用Jedis作为Redis的Java Client读写数据。 Jedis底层使用Apache的Common Pool,每个Jedis对象在底层都视为一个Object。 当释放连接失败后,我们的做法只是输出错误日志,这会导致该连接无法回收再利用,最终服务器的连接池会被拖

本文环境:
jedis 2.1.0

redis 2.8.13

Redis无响应

我们的各个子系统均使用Jedis作为Redis的Java Client读写数据。

Jedis底层使用Apache的Common Pool,每个Jedis对象在底层都视为一个Object。

当释放连接失败后,我们的做法只是输出错误日志,这会导致该连接无法回收再利用,最终服务器的连接池会被拖垮,现象就是我们遇到的无响应、重启就好。

此前我们分析过,现在得出的结论是:这不是服务器操作系统连接数的问题,也不是数据频繁读写的问题,而是释放资源时遇到异常时,我们没有将该连接直接断掉、丢弃。

如下是AEnv代码的相关变更情况,仅做参考:

高效读写调研

常用的Jedis读写方式包括:set/get、hset/hget和mset/mget,分别用作基本读写、hash读写和批量读写。

对此,我进行了一次性能测试(见下图)。
jedis_release_connection

从结果上看,批量读写的优势是非常明显的,如果子系统有类似业务逻辑,希望考虑这种形式。对于hash读写,在数据量聚集在某个特殊范围内时,其效率是比基本读写要高的。

另外,Jedis的单点是线程不安全的,通过Apache的Common Pool获取的Jedis实例是线程安全的,因此不建议子系统使用new一个实例的方式。
jedis_rw

Master-Slave调研

Redis的主从环境,我已经使用Docker搭建好,参见[[Docker系列·10] 搭建Redis服务器](http://www.atatech.org/articles/21551)

本次调研的目的是:观察主从复制、读写分离是否可以提高读写效率(虽然主从模式会提供高可用性,但目前子系统更关注的是速度)。

测试采用两个Jedis线程池一主一辅,主写、辅读。

单线程的测试结果如读写性能并不高。

100个线程的测试情况如下。从图中可以看出,数据量增到10000条的时候是个拐点,读写分离在此处开始呈现优势。不管是否读写分离,单次SET永远不是高效的写入方式。
HSET在5万条数据的单机读写时出现过读超时,怀疑在做rehash(表中红色条目)。
jedis_rw2

附:

Docker Redis示意图:

![2014_08_27_redis_master_slave]
(http://img1.tbcdn.cn/L1/461/1/519d6d0663bda5dbd512829b3da221f1e0872743)

目录
相关文章
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
1532 108
|
监控 Kubernetes 安全
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
蒋星熠Jaxonic,技术探索者,以代码为笔,在二进制星河中书写极客诗篇。专注Docker与容器化实践,分享从入门到企业级应用的深度经验,助力开发者乘风破浪,驶向云原生新世界。
937 52
还没搞懂Docker? Docker容器技术实战指南 ! 从入门到企业级应用 !
|
存储 监控 Java
如何对迁移到Docker容器中的应用进行性能优化?
如何对迁移到Docker容器中的应用进行性能优化?
780 59
|
监控 Java Go
无感改造,完美监控:Docker 多阶段构建 Go 应用无侵入观测
本文将介绍一种基于 Docker 多阶段构建的无侵入 Golang 应用观测方法,通过此方法用户无需对 Golang 应用源代码或者编译指令做任何改造,即可零成本为 Golang 应用注入可观测能力。
798 85
|
前端开发 JavaScript 应用服务中间件
在Docker部署的前端应用中使用动态环境变量
以上步骤展示了如何在 Docker 配置过程中处理并注入环墨遁形成可执行操作流程,并确保最终用户能够无缝地与之交互而无须关心背后复杂性。
666 13
|
缓存 Java Docker
如何对应用代码进行优化以提高在Docker容器中的性能?
如何对应用代码进行优化以提高在Docker容器中的性能?
573 1
|
安全 Java Docker
Docker 部署 Java 应用实战指南与长尾优化方案
本文详细介绍了Docker容器化部署Java应用的最佳实践。首先阐述了采用多阶段构建和精简JRE的镜像优化技术,可将镜像体积减少60%。其次讲解了资源配置、健康检查、启动优化等容器化关键配置,并演示了Spring Boot微服务的多模块构建与Docker Compose编排方案。最后深入探讨了Kubernetes生产部署、监控日志集成、灰度发布策略以及性能调优和安全加固措施,为Java应用的容器化部署提供了完整的解决方案指南。文章还包含大量可落地的代码示例,涵盖从基础到高级的生产环境实践。
963 3
|
Linux 数据库 虚拟化
Docker的常见应用部署技巧
以上就是一些Docker的常见应用部署技巧。使用Docker,你可以更容易地部署和管理你的应用,而不需要关心底层的硬件和操作系统。只要你掌握了这些技巧,你就可以更有效地使用Docker来部署你的应用。
337 25
|
运维 Cloud Native Docker
Docker:重塑现代应用交付的基石
Docker:重塑现代应用交付的基石
|
运维 应用服务中间件 nginx
docker运维查看指定应用log文件位置和名称
通过本文的方法,您可以更高效地管理和查看Docker容器中的日志文件,确保应用运行状态可控和可监测。
3008 28

热门文章

最新文章