为什么要使用Redis的多数据库呢?

原创 吴就业 184 0 2020-04-13

本文为博主原创文章,未经博主允许不得转载。

本文链接:https://wujiuye.com/article/00250ef96ea649059818fd5bac341fc4

作者:吴就业
链接:https://wujiuye.com/article/00250ef96ea649059818fd5bac341fc4
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。

为什么要使用redis的多数据库,我们项目中就这么用了,这点我也想不明白。如果是要做业务隔离,那么可以给不同业务的缓存key添加一个前缀,如果因此导致key过长,可以把一个大的redis集群拆分为对应多个业务的集群。不管分多少个库,集群总的内存大小是不变的,所能存储的数据也是一样多的,为何不把一个大的集群拆分给每个业务使用呢?

既然要做业务隔离,将一个大的redis集群拆分给不同业务使用,根据不同业务对缓存大小的要求以及并发访问量拆分,这样不是能更好的做到业务上的隔离吗。用不同数据库隔离也没有多大毛病,但如果各服务不是按业务拆分的情况下,这种方式会导致项目中每操作一次redis都需要切换数据库,对服务来说,平白无辜添加了一次网络I/O,降低缓存读写的性能,并发量越大所展现出来的毛病就越多,这与高并发性能调优背道而驰。

java项目中,除了jedis会支持动态切换数据库之外,使用其它框架要么通过动态修改连接池的配置,要么就是为每个库配置一个连接池来实现,而这些都会影响到性能,因此jedis成了最优的选择。为什么这些框架都不支持动态切换库,因为没有人会这么使用,显然动态切换库是不推荐的。

我在Google网上论坛的Redis DB论坛上看到这么一篇帖子,链接:https://groups.google.com/forum/?spm=a2c4e.11153987.0.0.1d6e4e37polahb#!forum/redis-db

img

图为redis作者antireztim lossen发表的一个帖子database names?中的回复,tim lossen在帖子中提问,为什么redis的多数据库不支持使用名称,而只能使用数字?正如你在图中所看到的,redis作者antirez的回复大致意思是:Redis多数据库是我在Redis设计中最糟糕的决定,我希望在某种程度上,我们可以放弃多个数据库的支持,但我认为可能已经太晚了,因为有很多人在工作中使用这个特性。

在以往的redis文章中,我也提到过,使用jedis配置连接池时,建议把每次从连接池中获取一个连接时都向服务端发送一个ping命令检测连接是否可用的配置关掉,因为高并发场景下,该操作会导致服务频繁的向redis服务端发送ping命令,也会导致服务自身相当于多了一次get请求的耗时,因为网络I/O

项目不是按业务拆分导致各项目之间耦合严重,多个数据库的使用更是增加了项目的维护难度,增加了各小组之间的沟通成本,而“key是什么,在哪个库?”也成了我们沟通的常用语。当你想修改某个key时,你需要询问各小组的意见,各个项目都得修改,而当你想添加一个key时,你需要询问各个小组,这个key有没有使用,避免覆盖别人的key,当然,这也是系统架构层面最大的错误。而抛开系统架构问题,显然无论通过加key前缀,还是使用多个集群,都比使用不同库隔离业务的方案更合适。

#后端

声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。

文章推荐

在同一个线程下数据源多次切换的回溯问题

在某些场景下,我们可能需要多次切换数据源才能处理完同一个请求,也就是在一个线程上多次切换数据源。

深入理解类加载阶段之准备阶段

准备阶段是为类中定义的静态变量分配内存并设置初始化值的阶段,这里的初始值通常情况下指的是对应类型的零值,比如int类型的零值为0。

访问者模式在ASM框架中的使用

访问者模式的定义是:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

遇到VerifyError束手无策?从虚拟机源码分析原因

在学习使用asm动态生成字节码的过程中,我们或多或少都会遇到这样个错误,那么越到这个问题我们该如何解决呢?

教你如何将开源项目发布到maven中央仓库

如何将开源项目发布到maven中央仓库,让别人通过依赖使用你的开源项目,想必很多朋友都有过这个想法。

如何优化大表分页查询的Limit性能问题?

如果表的数据量非常大,我们除了优化查询总数的`sql`之外,还是需要优化`limit`的。