我有一个Rails应用程序,在这个应用程序中,我必须维护一个同时被多个线程访问的散列。
大多数访问将被读取,并且很少有写入。我试图在使用Ruby哈希和Redis哈希之间做出决定。
Redis散列是线程安全的,可以将数据存储到磁盘。但是,持之以恒并不是唯一必要的。
此外,对哈希的写入并不频繁,要写入的数据基本上是写入它的时间本身。因此,即使它不是线程安全的,由于竞争条件而导致的精度损失也是可以接受的,因为并发写入之间的时间在最大情况下只会变化几秒。
我在使用单例Ruby哈希时唯一关心的是更新不是线程安全的,也不是原子的。那么,同时进行非原子键更新会导致异常吗?
如果没有,那么维护没有锁的单例Ruby哈希是否有意义?
我对使用Redis哈希的关注是内存中哈希的大小可能大于Ruby哈希以及调用redis服务器的开销。并发性和持久性是好的,但不是必要的。
请告诉我你的想法。谢谢。
发布于 2016-06-04 16:09:51
(这是一次基于Holger评论的更正,纠正了我。)
有一个专门为您设计的库,名为concurrent-ruby。
去https://github.com/ruby-concurrency/concurrent-ruby看看吧。
它有一个哈希类(http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Hash.html)和一个Map类(http://ruby-concurrency.github.io/concurrent-ruby/Concurrent/Map.html),他们说它更快,但不完全符合Ruby的语义(例如,不能保证按键插入顺序排序)。
请注意,安装创业板后,使用它所需的require与宝石名称不同;您可以使用require concurrent。
require 'concurrent'
h = Concurrent::Hash.new我没有使用它,所以我不能提供任何个人反馈。
https://stackoverflow.com/questions/37632170
复制相似问题