Post

railsで重複送信を防ぐ調査の知見

採用

Rails.cacheを使用

[Rails.cacheについて 酒と涙とRubyとRailsと](https://morizyun.github.io/ruby/rails-function-cache-fetch-write-delete.html)

始めは下記で実装しようとしたが、上記で良さそう(細かなメソッドは使用できないけど) petergoldstein/dalli: High performance memcached client for Ruby

  config.cache_store = :dalli_store, 'localhost:21211'
Rails.cache.dalli.with do |client| # client is a Dalli::Client instance which you can # use ONLY within this block end
内部的にはmemcachedを使用します。

メモリの解放は、 Least Recently Used というサイクルで自動で行なってくれる。

memcached - a distributed memory object caching system

調査

memcachedのcas

【Ruby】【キャッシュ】dalli(memcachedのクライアントgem)を使ってみました - blog.waterlow.work

同時書き込みさせて、falseだった方をエラーにすれば実装できそう?

multithreading - Is Memcached get and put methods are thread safe - Stack Overflow にて、値の保証はされていると記載されているが、その元のドキュメントのURLが閲覧できない。。。

redisまたはmemcachedを使用して、PHP同時実行でロック制御を実装します - コードチュートリアル

Memcached Example も処理が終わるまで待機(ループ)されるようだ。 ちなみに、 $cas はどこからきた?

redisのsetnx

SETNX Redis

exist -> set を一連で行なってくれると思われる。 multithreading - Redis is single-threaded, then how does it do concurrent I/O? - Stack Overflow より、redisは、 シングルスレッド らしいのでスレッド障害を考えなくてよいっぽい。 ただ今回は、memcachedなのでメモ。

This post is licensed under CC BY 4.0 by the author.