我有Rails应用程序,其中我必须维护一个将由多个线程同时访问的哈希。
大多数访问都是读取,写入很少。我试图在使用Ruby哈希和Redis哈希之间做出决定。
Redis哈希是线程安全的,可以将数据存储到磁盘。但是,持久性并非一切必要。
此外,对散列的写入很少,要写入的数据基本上是写入的时间本身。因此,即使它不是线程安全的,由于竞争条件导致的精度损失也是可以接受的,因为并发写入之间的时间最多只能变化几秒钟。
我唯一关心的是使用单例Ruby哈希是更新不是线程安全的而不是原子的。那么,同时进行非原子密钥更新是否会导致异常?
如果没有,那么维护没有锁的单例Ruby哈希是否有意义?
我对使用Redis哈希的担心是内存中哈希的大小可能大于Ruby哈希以及调用redis-server的开销。并发和持久性很好,但不是必需的。
请让我知道你的想法。谢谢。
答案 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
我还没有使用它,所以我无法提供任何个人反馈。