转载于: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的String类型不仅可以存储二进制安全的字符串,还可以存储数字,并支持对数字执行加减操作。这为计数器或者序列号生成等提供了便利。同时,String类型还支持对其部分内容进行修改和...
在这个例子中,`getUserById` 方法会被缓存,当相同 `id` 被再次调用时,会直接从 Redis 中获取结果,而不会再次执行数据库查询。 综上所述,"redis-cluster和spring集成,基于cache注解" 的项目是一个使用 Spring ...
Redis集群是一个高度可扩展和容错的分布式数据库系统,旨在提供高可用性和可伸缩性。Redis集群的主要优点是将数据自动分割到多个节点,并且能够继续操作而不需要整个集群可用。理解Redis集群的架构和配置方法对于...
Redis 集群是Redis数据库的一种分布式实现,它将数据分散存储在多个节点上,提供高可用性和可扩展性。在Redis Cluster中,数据被分割成多个槽(slots),每个节点负责一部分槽,当写入或读取数据时,Redis Cluster会...
此外,如果要实现一个秒杀系统,使用Redis可以将并发请求的压力从数据库转移到Redis服务端。在秒杀场景中,可以利用Redis的原子操作进行库存控制,这样可以避免多个用户同时操作时产生的超卖或少卖问题。而在分布式...
【数据库设计与SQL查询】 数据库设计是IT领域中至关重要的部分,它确保数据的组织和存储方式能够高效、准确地支持...同时,了解并掌握如Redis这样的NoSQL数据库在特定场景下的优势也是现代数据库开发者必备的技能。
在使用Redis作为数据库存储和Python进行交互的过程中,我们经常遇到一个问题:从Redis中取出的数据类型是bytes,而不是我们需要的字符串类型。这种情况在使用Python 3版本时尤其常见,因为在Python 2中,从Redis取出...
综上所述,这个压缩包中的代码样例展示了Go语言在数据库操作、缓存管理、设计模式应用以及日志处理方面的基本用法,是学习和理解Go语言实际开发中常见场景的好例子。通过深入研究这些代码,开发者可以更好地掌握Go...
Jedis是Java的Redis客户端,Redis是一个内存中的数据结构存储系统,可以作为数据库、缓存和消息代理。在Storm中,Jedis常用来实现Bolt之间的共享状态,例如在我们的例子中存储单词计数。 4. **Aggregator Bolt (可...
- **性能优化**:使用索引提升查询速度,定期清理无用数据以降低存储开销,使用缓存技术(如Redis)减轻数据库压力。 - **分布式部署**:采用负载均衡器(如Nginx)分配请求至多台服务器,使用数据库集群或主从...
在IT行业中,分页是网页设计中不可或缺的一部分,特别是在处理大量数据时,如论坛、博客或电子商务网站。... 首先,让我们了解一下...同时,这也是一个学习数据库操作、URL参数处理、用户接口设计和安全实践的好例子。
分页是将一个大结果集分割成多个小部分,每个部分称为一页。用户可以逐页浏览数据,而不需要等待整个数据集加载完成。这在数据库查询、Web应用和API接口设计中非常常见。 在Java中,最常用的分页库是JPA(Java ...
- `explode("\t", $str)` 会按照制表符分割字符串,但在这个例子中并不适用,因为字符串中没有制表符。 - `sscanf($str, "%d %s %d")` 会按照格式匹配字符串,将整数`1109063`、字符串`milo`、整数`1`分别赋值给`$...
- **InputSplit和OutputSplit**:解释MapReduce任务中的输入分割和输出分割机制。 - **Block Size配置**:探讨HDFS块大小的配置选项及其对性能的影响。 - **最少副本数配置**:说明如何通过配置副本数量来确保数据的...
在这个例子中,查询显示了使用了索引,但仍然出现慢查询,这可能是因为虽然索引帮助快速找到行,但在"Sending data"阶段,非索引字段导致了额外的数据读取。 2. **`SHOW PROCESSLIST`检查**:当`EXPLAIN`无法揭示...
这1200个例子覆盖了从基础到高级的各种主题,可能包括但不限于以下知识点: 1. **PHP基础**:变量、数据类型、控制结构(if-else、switch)、循环(for、while、do-while)、数组操作、函数定义与调用等。 2. **...