Redis 用于非常大的内存缓存
Usage of Redis for very large memory cache
我打算考虑使用 Redis 在缓存中存储大量数据。目前,我将它们存储在我自己的 java 中编写的缓存中。我的用例如下。
我从源获取 15 分钟的数据,我需要每小时汇总一次数据。因此,对于给定的对象 A,每小时我将获得 4 个值,我需要将它们聚合为一个值,我将使用的公式将是最大/最小/总和。
敌人制作钥匙我打算像下面这样使用
a) 对象 ID - 长
b) 时间 - 长
c) 属性 id - int(每个对象可能有很多 属性,我需要分别为每个 属性 聚合)
所以最终密钥看起来像;
objectid_time_propertyid
每 15 分钟我可能会得到大约 50 到 6000 万个密钥,每次我都需要获取这些密钥将 属性 值转换为两倍并应用公式(max/min/sum 等)然后转换回字符串并存储回去。
因此,我看到每个键在每种情况下都有一个读取和一个写入和转换。
我的问题如下。
- 建议在此类用例中使用 Redis,今后我可能会将每小时数据聚合到每日、每日聚合到每周等等。
- 在缓存中读取和写入的性能如何(我在 Windows 上做了一个示例测试,100K 键的读取和写入花费了 30-40 秒,这不是很好,但我在 windows 我终于需要在 linux.
上 运行
- 我想使用redis的持久化功能,有什么优缺点?
如果哪位有实际使用redis做memcache的经验,需要经常更新的请给个建议
- Is is advisable to use redis for such use case , going forward I may aggregate hourly data to daily , daily to weekly and so on.
是否合适取决于你问谁,但我当然觉得 Redis 可以胜任这项工作。如果单个服务器不够,您的描述表明数据集可以轻松分片,因此集群可以让您扩展。
不过,我建议您以稍微不同的方式存储数据。首先,Redis 中的每个键都有开销,因此开销越多,您需要的 RAM 就越多。因此,与其在每个对象时间 属性 中保留一个键,我建议使用哈希作为将一些值聚合在一起的方法。例如,您可以使用 object_id:timestamp
键并在其下存储 property_id:value 对。
此外,我建议您不要保留每个对象的 4 个离散测量值-属性 并重新计算您的聚合,而是只保留聚合并使用新的测量值更新它们。所以,你基本上有一个 object_id
哈希,具有以下结构:
object_id:hourtimestamp -> property_id1:max = x
property_id1:min = y
property id1:sum = z
当获取对象的 属性 的新数据 - d - 时,只需重新计算聚合:
property_id1:max = max(x, d)
property_id1:min = min(y, d)
property_id1:sum = z + d
对所需的每个分辨率重复相同的操作,例如使用 object_id:daytimestamp
保留日级聚合。
最后,不要忘记在不再需要密钥后让它们过期(即为每小时计数器等设置 24 小时 TTL)。
还有其他可能的方法,主要是使用排序集,可用于解决您的查询需求(请记住,存储数据是容易的部分 - 取回数据通常更难;))。
- What would be performance of read and writes in cache (I did a sample test on Windows and 100K keys read and write took 30-40 seconds thats not great , but I did on windows and I finally need to run on linux.
Redis,当 运行 在我的笔记本电脑上 Linux 上的虚拟机中时,每秒读取和写入的次数超过 500K。性能在很大程度上取决于您如何使用 Redis 的数据类型和 API。考虑到您在 15 分钟内吞吐了 6000 万个值,或者每秒约 70K 的小数据写入,Redis 完全有能力处理这个问题。
- I want to use persistence function of redis, what are pros and cons of it ?
这是一个非常有据可查的主题 - 初学者请参考 http://redis.io/topics/persistence and http://oldblog.antirez.com/post/redis-persistence-demystified.html。
我打算考虑使用 Redis 在缓存中存储大量数据。目前,我将它们存储在我自己的 java 中编写的缓存中。我的用例如下。
我从源获取 15 分钟的数据,我需要每小时汇总一次数据。因此,对于给定的对象 A,每小时我将获得 4 个值,我需要将它们聚合为一个值,我将使用的公式将是最大/最小/总和。
敌人制作钥匙我打算像下面这样使用
a) 对象 ID - 长
b) 时间 - 长
c) 属性 id - int(每个对象可能有很多 属性,我需要分别为每个 属性 聚合)
所以最终密钥看起来像;
objectid_time_propertyid
每 15 分钟我可能会得到大约 50 到 6000 万个密钥,每次我都需要获取这些密钥将 属性 值转换为两倍并应用公式(max/min/sum 等)然后转换回字符串并存储回去。 因此,我看到每个键在每种情况下都有一个读取和一个写入和转换。
我的问题如下。
- 建议在此类用例中使用 Redis,今后我可能会将每小时数据聚合到每日、每日聚合到每周等等。
- 在缓存中读取和写入的性能如何(我在 Windows 上做了一个示例测试,100K 键的读取和写入花费了 30-40 秒,这不是很好,但我在 windows 我终于需要在 linux. 上 运行
- 我想使用redis的持久化功能,有什么优缺点?
如果哪位有实际使用redis做memcache的经验,需要经常更新的请给个建议
- Is is advisable to use redis for such use case , going forward I may aggregate hourly data to daily , daily to weekly and so on.
是否合适取决于你问谁,但我当然觉得 Redis 可以胜任这项工作。如果单个服务器不够,您的描述表明数据集可以轻松分片,因此集群可以让您扩展。
不过,我建议您以稍微不同的方式存储数据。首先,Redis 中的每个键都有开销,因此开销越多,您需要的 RAM 就越多。因此,与其在每个对象时间 属性 中保留一个键,我建议使用哈希作为将一些值聚合在一起的方法。例如,您可以使用 object_id:timestamp
键并在其下存储 property_id:value 对。
此外,我建议您不要保留每个对象的 4 个离散测量值-属性 并重新计算您的聚合,而是只保留聚合并使用新的测量值更新它们。所以,你基本上有一个 object_id
哈希,具有以下结构:
object_id:hourtimestamp -> property_id1:max = x
property_id1:min = y
property id1:sum = z
当获取对象的 属性 的新数据 - d - 时,只需重新计算聚合:
property_id1:max = max(x, d)
property_id1:min = min(y, d)
property_id1:sum = z + d
对所需的每个分辨率重复相同的操作,例如使用 object_id:daytimestamp
保留日级聚合。
最后,不要忘记在不再需要密钥后让它们过期(即为每小时计数器等设置 24 小时 TTL)。
还有其他可能的方法,主要是使用排序集,可用于解决您的查询需求(请记住,存储数据是容易的部分 - 取回数据通常更难;))。
- What would be performance of read and writes in cache (I did a sample test on Windows and 100K keys read and write took 30-40 seconds thats not great , but I did on windows and I finally need to run on linux.
Redis,当 运行 在我的笔记本电脑上 Linux 上的虚拟机中时,每秒读取和写入的次数超过 500K。性能在很大程度上取决于您如何使用 Redis 的数据类型和 API。考虑到您在 15 分钟内吞吐了 6000 万个值,或者每秒约 70K 的小数据写入,Redis 完全有能力处理这个问题。
- I want to use persistence function of redis, what are pros and cons of it ?
这是一个非常有据可查的主题 - 初学者请参考 http://redis.io/topics/persistence and http://oldblog.antirez.com/post/redis-persistence-demystified.html。