sql-server - Redis 作为 RDBMS 的缓存

标签 sql-server caching nosql redis aggregate-functions

我计划使用 redis 作为现有数据库(MS SQL)的缓存。我想使用 redis 中的数据放在前端。我将处理大约 100GB 的大量数据一天。我将主要有包含时间值和一些计数器值(大约 10-100 列)的表。如果我要根据小时、天等对这些大量数据进行聚合,redis 将如何执行……(即基于时间列。) Redis 是正确的方法还是有其他选择?与 RDBMS 相比,我不知道在处理聚合时 nosql 有多好。 在这种情况下,MonogoDB 会怎么做?

谢谢

最佳答案

如果您需要存储 100Gb 并且您不希望您的数据集增长太多,请从 3 个 redis 实例开始,每个实例具有 64Gb 的 RAM,总共 192Gb,足以容纳您的数据集并且成长空间。

每个 redis 实例都是主实例,因此您的数据将在实例之间平均分配。您需要使用简单的哈希算法从应用程序层跨实例进行分片,例如...

(from your application layer)
shardKey = "redis" + getShardKey( cacheKey);
redisConnection = getRedisConnectionByShardKey( shardKey);
//do work with redisConnection here

getShardKey(string) 函数获取 cacheKey,将其转换为整数,然后根据 redis 实例的数量对其进行修改,返回 0、1 或 2。配置连接池每个redis实例,给每个实例起一个名字,比如redis0redis1等,调用hash函数后,使用shard key获取目标redis的连接实例。获得所需数据后,在应用层进行聚合。

这是一个简单的方法;它在 redis 实例之间平均分配数据(或多或少),并避免将所有内容都塞入单个 redis 实例。 Redis 是单线程的,所以如果你正在做大量的 I/O,你将受到你的 cpu 处理请求的速度的限制;使用多个实例来分配负载。

当您的数据集增长到超过 180Gb 时,此解决方案就会失效。如果您添加另一个 Redis 实例以容纳更大的数据集,则必须更新哈希函数以反射(reflect)模 4,而不是模 3,并且您将不得不移动大部分数据,这变得很丑陋,因此仅在以下情况下使用此方法您 100% 确定数据集将保持在 150Gb 以下。

关于sql-server - Redis 作为 RDBMS 的缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16168640/

相关文章:

sql-server - SQL Server : Indexing date column in a log table

sql - MS SQL Server : how to determine which field is causing Arifmetic error

java - Spring @CacheEvict 不工作

amazon-web-services - 如何使用多个索引查询 AWS DynamoDB?

mongodb - MongoDB 的最佳 Web 框架?

c# - 如何在 C# 中为以下 MongoDB 查询场景编写搜索查询

sql - 在每行上使用 T-SQL 进行条件插入

sql-server - 如何通过共享托管在 App_Data 中使用 mdf

jquery - 通过 AJAX 预期预加载 JS 和 CSS - 多少算太多?

HTTP 缓存测试