`
zhaomengsen
  • 浏览: 207388 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

分割超大Redis数据库例子

阅读更多
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/124.html?1455853509
薄荷 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 命令:
代码如下:#p#分页标题#e#

redis-cli KEYS "<pattern>" | xargs redis-cli DEL

改成实际的模式,如
代码如下:

redis-cli KEYS "user:*:followers" | xargs redis-cli DEL

表示删除 user followers 数据。
最后通过来回切换并重启 Redis 实例达到完全分割 Redis 实例。
分享到:
评论

相关推荐

    Redis技术分享资料

    作为数据类型方面的例子,Redis的String类型不仅可以存储二进制安全的字符串,还可以存储数字,并支持对数字执行加减操作。这为计数器或者序列号生成等提供了便利。同时,String类型还支持对其部分内容进行修改和...

    redis-cluster和spring集成,基于cache注解

    在这个例子中,`getUserById` 方法会被缓存,当相同 `id` 被再次调用时,会直接从 Redis 中获取结果,而不会再次执行数据库查询。 综上所述,"redis-cluster和spring集成,基于cache注解" 的项目是一个使用 Spring ...

    Redis-cluster

    Redis集群是一个高度可扩展和容错的分布式数据库系统,旨在提供高可用性和可伸缩性。Redis集群的主要优点是将数据自动分割到多个节点,并且能够继续操作而不需要整个集群可用。理解Redis集群的架构和配置方法对于...

    redis集群搭建.docx

    Redis 集群是Redis数据库的一种分布式实现,它将数据分散存储在多个节点上,提供高可用性和可扩展性。在Redis Cluster中,数据被分割成多个槽(slots),每个节点负责一部分槽,当写入或读取数据时,Redis Cluster会...

    redis 队列操作的例子(php)

    此外,如果要实现一个秒杀系统,使用Redis可以将并发请求的压力从数据库转移到Redis服务端。在秒杀场景中,可以利用Redis的原子操作进行库存控制,这样可以避免多个用户同时操作时产生的超卖或少卖问题。而在分布式...

    26数据库相关内容1

    【数据库设计与SQL查询】 数据库设计是IT领域中至关重要的部分,它确保数据的组织和存储方式能够高效、准确地支持...同时,了解并掌握如Redis这样的NoSQL数据库在特定场景下的优势也是现代数据库开发者必备的技能。

    解决redis与Python交互取出来的是bytes类型的问题

    在使用Redis作为数据库存储和Python进行交互的过程中,我们经常遇到一个问题:从Redis中取出的数据类型是bytes,而不是我们需要的字符串类型。这种情况在使用Python 3版本时尤其常见,因为在Python 2中,从Redis取出...

    Go语言代码样例

    综上所述,这个压缩包中的代码样例展示了Go语言在数据库操作、缓存管理、设计模式应用以及日志处理方面的基本用法,是学习和理解Go语言实际开发中常见场景的好例子。通过深入研究这些代码,开发者可以更好地掌握Go...

    storm实时单词计数

    Jedis是Java的Redis客户端,Redis是一个内存中的数据结构存储系统,可以作为数据库、缓存和消息代理。在Storm中,Jedis常用来实现Bolt之间的共享状态,例如在我们的例子中存储单词计数。 4. **Aggregator Bolt (可...

    百度2008笔试题,华中科技大等5套

    - **性能优化**:使用索引提升查询速度,定期清理无用数据以降低存储开销,使用缓存技术(如Redis)减轻数据库压力。 - **分布式部署**:采用负载均衡器(如Nginx)分配请求至多台服务器,使用数据库集群或主从...

    bbs-paging.rar_site:www.pudn.com

    在IT行业中,分页是网页设计中不可或缺的一部分,特别是在处理大量数据时,如论坛、博客或电子商务网站。... 首先,让我们了解一下...同时,这也是一个学习数据库操作、URL参数处理、用户接口设计和安全实践的好例子。

    JAVA上百实例源码以及开源项目源代码

    EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件...

    Pagination(分页)

    分页是将一个大结果集分割成多个小部分,每个部分称为一页。用户可以逐页浏览数据,而不需要等待整个数据集加载完成。这在数据库查询、Web应用和API接口设计中非常常见。 在Java中,最常用的分页库是JPA(Java ...

    PHP高级面试题分享.pdf

    - `explode("\t", $str)` 会按照制表符分割字符串,但在这个例子中并不适用,因为字符串中没有制表符。 - `sscanf($str, "%d %s %d")` 会按照格式匹配字符串,将整数`1109063`、字符串`milo`、整数`1`分别赋值给`$...

    大数据课程体系.docx

    - **InputSplit和OutputSplit**:解释MapReduce任务中的输入分割和输出分割机制。 - **Block Size配置**:探讨HDFS块大小的配置选项及其对性能的影响。 - **最少副本数配置**:说明如何通过配置副本数量来确保数据的...

    深入分析MySQL Sending data查询慢问题

    在这个例子中,查询显示了使用了索引,但仍然出现慢查询,这可能是因为虽然索引帮助快速找到行,但在"Sending data"阶段,非索引字段导致了额外的数据读取。 2. **`SHOW PROCESSLIST`检查**:当`EXPLAIN`无法揭示...

    php1200:PHP开发实战1200例原始码

    这1200个例子覆盖了从基础到高级的各种主题,可能包括但不限于以下知识点: 1. **PHP基础**:变量、数据类型、控制结构(if-else、switch)、循环(for、while、do-while)、数组操作、函数定义与调用等。 2. **...

Global site tag (gtag.js) - Google Analytics