我应该使用Redis哈希还是Ruby哈希?

时间:2016-06-04 15:49:56

标签: ruby-on-rails ruby multithreading hash redis

我有Rails应用程序,其中我必须维护一个将由多个线程同时访问的哈希。

大多数访问都是读取,写入很少。我试图在使用Ruby哈希和Redis哈希之间做出决定。

Redis哈希是线程安全的,可以将数据存储到磁盘。但是,持久性并非一切必要。

此外,对散列的写入很少,要写入的数据基本上是写入的时间本身。因此,即使它不是线程安全的,由于竞争条件导致的精度损失也是可以接受的,因为并发写入之间的时间最多只能变化几秒钟。

我唯一关心的是使用单例Ruby哈希是更新不是线程安全的而不是原子的。那么,同时进行非原子密钥更新是否会导致异常?

如果没有,那么维护没有锁的单例Ruby哈希是否有意义?

我对使用Redis哈希的担心是内存中哈希的大小可能大于Ruby哈希以及调用redis-server的开销。并发和持久性很好,但不是必需的。

请让我知道你的想法。谢谢。

1 个答案:

答案 0 :(得分:3)

(这是基于Holger Just的评论纠正我的修正。)

有一个专门为您的需求而设计的图书馆,名为concurrent-ruby

https://github.com/ruby-concurrency/concurrent-ruby处查看。

它有一个Hash类(http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Hash.html)和一个Map类(http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Map.html),他们认为它更快但不完全符合Ruby Hash的语义(例如不保证按键插入顺序排序。

请注意,安装gem后,使用它所需的require与gem名称不同;你require concurrent

require 'concurrent'
h = Concurrent::Hash.new

我还没有使用它,所以我无法提供任何个人反馈。