- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个键是通过连接许多不同的元素生成的。:
[15,000 个唯一字符串] + [:] + [5 个唯一字符串] + [:] + [1 或 0] + [:] + [15,000 个唯一字符串] + [:] + [5 个唯一字符串] + [ :] + [1 or 0] = 长度在 20 到 50 个字符之间的字符串(例如:Vancouver:temp:1:Kelowna:high:0)
根据我的计算,将有大约 10 亿种组合,每种组合都是一把 key 。阅读 redis 文档(http://redis.io/topics/memory-optimization),他们建议您散列 key :例如。 "object:11558960"=> "1"可以变成 "object:1155""8960"=> "1"。
我正在考虑应用内存优化的最佳方法。我的第一个想法是为字符串创建一个数字表示。所以我会使用 MySQL 并创建查找表,其中每个字符串都有一个对应的数字整数。这样我可以更适本地散列,因为我可以比字符串更容易地划分数字。同样,这些数字会创建更短的键,我认为这会节省内存。这里的问题是 10 亿个键,这对 MySQL 来说是很大的开销,因为我必须创建连接等等。
我读到的另一种解决方案是获取我创建的字符串,然后在插入到 redis 之前使用 php 的 gzcompres 之类的工具对其进行压缩。 (http://labs.octivi.com/how-we-cut-down-memory-usage-by-82/)。
是否有任何最佳实践优化我可以用来降低我的 redis 内存消耗,因为目前它仍然太高?我愿意放弃 CPU 的能力来节省更多的内存。我的值只会是 0-50 之间的一位或两位整数。
最佳答案
查找表完全出问题了,别费心了。哈希解决方案似乎很适合您的需求。您可能希望您的 key 在 15,000 个唯一字符串之前立即拆分,以便为您提供足够的哈希 key ,使它值得付出努力。
所以代替:
SET Vancouver:temp:1:Kelowna:high:0 10
你会用
HSET Vancouver:temp:1 Kelowna:high:0 10
现在第一个 [1 或 0] 之后的所有内容都是哈希键,因此每个哈希大约有 150,000 个可能的键。
我对你的总 key 空间的计算与你的有点不同:
15000 * 5 * 2 * 15000 * 5 * 2 == 22500000000 (22.5 billion)
这样一来,您将拥有 150,000 个可能的键(redis 键),每个键都有 150,000 个可能的哈希键。
你在 redis key 和 hash key 之间做的间隔越靠左,hash key 的数字倾斜度就越大。例如,如果您将其拆分为
HSET Vancouver:temp 1:Kelowna:high:0 10
那么您将拥有 75,000 个用于散列的 Redis 键,每个散列可能包含 300,000 个键/值对。
另一种方法是使用整数值作为 key 。如果您的两组 15,000 个唯一字符串和 5 个唯一字符串中的每一个都有整数映射,那么您可以使用总共 34 位来表示任何 key 。例如。
0000000000000 000 0 0000000000000 000 0
| 13 | | 3 | |1| | 13 | | 3 | |1|
这 13 位给出了 0-16383 的范围(涵盖了所需的 1-15,000)这 3 位给出了 0-7 的范围(涵盖了所需的 1-5)1 位为您提供所需的二进制 1 或 0 范围。
所以假设这些组成的值:温哥华 == 9,987温度== 3基洛纳 == 3,454高 = 2
你会:
(9987 << 21) + (3 << 18) + (1 << 17) + (3454 << 4) + (2 << 1) + (0 << 0)
==
20945229796
要从给定的键中取回值,您只需进行位移和屏蔽
20945229796 >> 20
9987
(20945229796 >> 4) & ((1 << 13) - 1)
3454
这是一个简单的 python 脚本,它将值转换为 int,并将 int 转换为值:
values = [9987, 3, 1, 3454, 2, 0]
bits = [21, 18, 17, 4, 1, 0]
value_and_shift = zip(values, bits)
def key_from_values(values_and_shift):
return sum(x << y for x, y in value_and_shift)
def extract_values(values_and_shift):
last_shift = 35
for value, shift in value_and_shift:
print "Value should be:", value
print "Value extracted:", (key >> shift) & ((1 << (last_shift - shift)) - 1)
print
last_shift = shift
key = key_from_values(value_and_shift)
print "Using value of:", key
extract_values(value_and_shift)
输出
Using value of: 20945229796
Value should be: 9987
Value extracted: 9987
Value should be: 3
Value extracted: 3
Value should be: 1
Value extracted: 1
Value should be: 3454
Value extracted: 3454
Value should be: 2
Value extracted: 2
Value should be: 0
Value extracted: 0
关于redis 减少 20-50 个字符长度的字符串键的内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25858461/
我有一个关于 Redis Pubsub 的练习,如下所示: 如果发布者发布消息但订阅者没有收到服务器崩溃。订阅者如何在重启服务器时收到该消息? 请帮帮我,谢谢! 最佳答案 在这种情况下,消息将永远消失
我们正在使用 Service Stack 的 RedisClient 的 BlockingDequeue 来保存一些数据,直到它可以被处理。调用代码看起来像 using (var client =
我有一个 Redis 服务器和多个 Redis 客户端。每个 Redis 客户端都是一个 WebSocket+HTTP 服务器,其中包括管理 WebSocket 连接。这些 WebSocket+HTT
我有多个 Redis 实例。我使用不同的端口创建了一个集群。现在我想将数据从预先存在的 redis 实例传输到集群。我知道如何将数据从一个实例传输到集群,但是当实例多于一个时,我无法做到这一点。 最佳
配置:三个redis集群分区,跨三组一主一从。当 Master 宕机时,Lettuce 会立即检测到中断并开始重试。但是,Lettuce 没有检测到关联的 slave 已经将自己提升为 master
我想根据从指定集合中检索这些键来删除 Redis 键(及其数据集),例如: HMSET id:1 password 123 category milk HMSET id:2 password 456
我正在编写一个机器人(其中包含要禁用的命令列表),用于监视 Redis。它通过执行禁用命令,例如 (rename-command ZADD "")当我重新启动我的机器人时,如果要禁用的命令列表发生变化
我的任务是为大量听众使用发布/订阅。这是来自 docs 的订阅的简化示例: r = redis.StrictRedis(...) p = r.pubsub() p.subscribe('my-firs
我一直在阅读有关使用 Redis 哨兵进行故障转移的内容。我打算有1个master+1个slave,如果master宕机超过1分钟,就把slave变成master。我知道这在 Sentinel 中是
与仅使用常规 Redis 和创建分片相比,使用 Redis 集群有哪些优势? 在我看来,Redis Cluster 更注重数据安全(让主从架构解决故障)。 最佳答案 我认为当您需要在不丢失任何数据的情
由于 Redis 以被动和主动方式使 key 过期, 有没有办法得到一个 key ,即使它的过期时间已过 (但 在 Redis 中仍然存在 )? 最佳答案 DEBUG OBJECT myKey 将返回
我想用redis lua来实现monitor命令,而不是redis-cli monitor。但我不知道怎么办。 redis.call('monitor') 不起作用。 最佳答案 您不能从 Redis
我读过 https://github.com/redisson/redisson 我发现有几个 Redis 复制设置(包括对 AWS ElastiCache 和 Azure Redis 缓存的支持)
Microsoft.AspNet.SignalR.Redis 和 StackExchange.Redis.Extensions.Core 在同一个项目中使用。前者需要StackExchange.Red
1. 认识 Redis Redis(Remote Dictionary Server)远程词典服务器,是一个基于内存的键值对型 NoSQL 数据库。 特征: 键值(key-value)型,value
1. Redis 数据结构介绍 Redis 是一个 key-value 的数据库,key 一般是 String 类型,但 value 类型多种多样,下面就举了几个例子: value 类型 示例 Str
1. 什么是缓存 缓存(Cache) 就是数据交换的缓冲区,是存贮数据的临时地方,一般读写性能较高。 缓存的作用: 降低后端负载 提高读写效率,降低响应时间 缓存的成本: 数据一致性成本 代码维护成本
我有一份记录 list 。对于我的每条记录,我都需要进行一些繁重的计算,因为我要在Redis中创建反向索引。为了达到到达记录,需要在管道中执行多个redis命令(sadd为100 s + set为1
我有一个三节点Redis和3节点哨兵,一切正常,所有主服务器和从属服务器都经过验证,并且哨兵配置文件已与所有Redis和哨兵节点一起更新,但是问题是当Redis主服务器关闭并且哨兵希望选举失败者时再次
我正在尝试计算Redis中存储的消息之间的响应时间。但是我不知道该怎么做。 首先,我必须像这样存储chat_messages的时间流 ZADD conversation:CONVERSATION_ID
我是一名优秀的程序员,十分优秀!