欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

分割超大Redis数据库例子

程序员文章站 2022-03-14 17:51:49
薄荷 app 上的伙伴功能大量使用了内存数据库 redis,随着数据量的快速增长,redis 膨胀得很快,已经接近 12 gb规模,这些数据全部放在单个 redis 实例中...

薄荷 app 上的伙伴功能大量使用了内存数据库 redis,随着数据量的快速增长,redis 膨胀得很快,已经接近 12 gb规模,这些数据全部放在单个 redis 实例中。单个巨大 redis 实例有如下几个坏处:

1.首先,需要一台内存很大的机器。redis 是内存数据库,它需要把所有需求全部放在内存中,需要为之装下 12 gb的 redis 实例,至少需要 12 gb 内存大小的机器,考虑的预留增长空间,一般需要 12 * 1.5 约 18 gb 内存。 另外还有一个考虑的因素是,redis 进行硬盘数据存储时,fork 进程需要消耗同样大小的内存,因此一个 12gb 的 redis 实例需要 32 gb左右的内存比较合适,这对机器提出了很高的要求,常常难以满足。

2.然后,redis 容易成为性能瓶颈。redis 的并发模型是单进程单线程,它不能充分利用多核 cpu,在请求数很高,或者某一些请求处理比较慢时(比如一些大的数据排序),可能会成为系统的性能瓶颈。有方法可以缓解甚至这个问题,就是建立多个 redis 实例,通过多个 redis 连接来实现。

3.另外,单个巨大的 redis 实例也会增加数据管理难度,因为这么大的数据量,无论是复制,备份操作都比较慢,容易对线上系统造成冲击。

因此,十分有必要把单个巨大的 redis 实例分割成多个小的 redis 实例。

使用 redis 的复制机制,可以在线平滑处理 redis 实例分割,几乎不会对系统有很大的影响。

分割的具体操作思路如下:

1.首先,规划 redis 分割策略,通常是基于业务划分,比如薄荷伙伴是基于业务分成 timeline, user_relationship, other 3个 redis 实例。规划好之后,需要根据规划结果对应用程序中 redis 程序代码做修改,通常是有一个统一的 redis 链接修改为多个 redis 连接,不同业务使用不同的连接。

2.然后,通过 redis 复制功能建立多个 redis 副本,让不同 redis 连接使用不同的 redis 副本,在 redis 副本中删除多余的数据。批量删除某个模式的 keys,可以使用下面的 shell 命令:

复制代码 代码如下:

redis-cli keys "<pattern>" | xargs redis-cli del

改成实际的模式,如

复制代码 代码如下:

redis-cli keys "user:*:followers" | xargs redis-cli del

表示删除 user followers 数据。

最后通过来回切换并重启 redis 实例达到完全分割 redis 实例。