Nosql 优化大型Redis散列和排序集的内存使用

Nosql 优化大型Redis散列和排序集的内存使用,nosql,redis,in-memory-database,in-memory,memory-optimization,Nosql,Redis,In Memory Database,In Memory,Memory Optimization,作为分布式爬虫程序的一部分,我们将所有URL存储在一个Redis排序集中,即爬虫队列和Redis哈希(用于消除重复并标记访问的URL) 我们希望在一个文件中访问的各个域有大约1100万个URL,该文件在磁盘上占用506 MB的空间 但是,当放入Redis排序集中时,相同的URL集将占用1.759 GB的RAM,优先级从整数11M一直降低到0,并且从键:URL->值:相同URL开始的Redis哈希将占用2.048 GB的RAM空间 redis服务器托管在AWS的高内存(17GB)超大EC2实例中

作为分布式爬虫程序的一部分,我们将所有URL存储在一个Redis排序集中,即爬虫队列和Redis哈希(用于消除重复并标记访问的URL)

我们希望在一个文件中访问的各个域有大约1100万个URL,该文件在磁盘上占用506 MB的空间

但是,当放入Redis排序集中时,相同的URL集将占用1.759 GB的RAM,优先级从整数11M一直降低到0,并且从键:URL->值:相同URL开始的Redis哈希将占用2.048 GB的RAM空间

redis服务器托管在AWS的高内存(17GB)超大EC2实例中

我想找出是什么导致了Redis中的空间膨胀,是因为存储它们的方式效率低下,还是我们应该以某种方式优化内存以避免空间膨胀?任何关于提高记忆性能的建议都是gr8。提前感谢您的帮助

这是redis信息转储:

redis_version:2.4.14
redis_git_sha1:00000000
redis_git_dirty:0
arch_bits:64
multiplexing_api:epoll
gcc_version:4.6.3
process_id:739
uptime_in_seconds:329647
uptime_in_days:3
lru_clock:1603627
used_cpu_sys:9521.58
used_cpu_user:3165.06
used_cpu_sys_children:19535.11
used_cpu_user_children:126500.32
connected_clients:76
connected_slaves:0
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
used_memory:12794713864
used_memory_human:11.92G
used_memory_rss:13586632704
used_memory_peak:16575849280
used_memory_peak_human:15.44G
mem_fragmentation_ratio:1.06
mem_allocator:jemalloc-2.2.5
loading:0
aof_enabled:0
changes_since_last_save:46321
bgsave_in_progress:1
last_save_time:1358213403
bgrewriteaof_in_progress:0
total_connections_received:1702
total_commands_processed:95112145
expired_keys:3488037
evicted_keys:0
keyspace_hits:43443780
keyspace_misses:38945
pubsub_channels:2
pubsub_patterns:0
latest_fork_usec:3820832
vm_enabled:0
role:master
db0:keys=116,expires=25

您说您使用有序集作为队列,这意味着您在访问URL后将其从集合中删除,对吗?是的,一旦访问URL,它将从排序集合中删除,并在hashUse列表中标记为已完成(整数值1),而不是需要队列的排序集合。使用set而不是字典url->url。在本例中,请参见完全同意@DidierSpezia。事实上,我编写了一个由Redis支持的Python类队列实现工具箱。我在Redis列表中实现了
Queue
,但对总是维护唯一项的队列使用了排序集。详情请参见此处