Ruby / webes processzek közti osztott memória

Request-ek közti gyors permanens adat elérés a cél pár apróságra (eldobható statisztikák), amit nem akarok db-ben tárolni, mert ágyúval verébre lenne.

Redis vagy saját sima text fájlba írkálós megoldás? A tesztek alapján lehetne az utóbbi :)

Setup:

sudo apt install redis-server
sudo gem install redis

Saját megoldás:

http://paste.ubuntu.com/23211865/

Teszt:

irb

require "benchmark"
require "redis"

r = Redis.new

# 100k test (redis 4.5x gyorsabb)

r.set "test", (1..100_000).map{rand}

store "test", (1..100_000).map{rand}.join("\n")

Benchmark.realtime{ 100.times{ r.get("test") }}
=> 0.18753569299951778

Benchmark.realtime{ 100.times{ store("test") }}
=> 0.8518077170010656

# 1M test (redis 4.18x gyorsabb)

r.set "test", (1..1000_000).map{rand}

store "test", (1..1000_000).map{rand}.join("\n")

Benchmark.realtime{ 10.times{ r.get("test") }}
=> 0.2501866710008471

Benchmark.realtime{ 10.times{ store("test") }}
=> 1.0462167879995832

Meglepő hogy a tákolt cucc mennyire gyors egy C-ben írt és optimalizálthoz képest.

Nyilván marad a Redis a sebesség és a threadsafety miatt. A text fájlba írkálásnál lehetnének csúnya dolgok, vagy pedig hosszú lock wait ami nem kell ugye.

Hozzászólások

na, azert tegyuk mar ide azt a C-ben irt es optimalizalt dolgot is...

--
"nem tárgyszerűen nézem a dolgot, hanem a vádló szerepéből. Sok bosszúságot okoztak, örülnék ha megbüntetnék őket - tudom gyarló dolog, de hát nem vagyok tökéletes." (BehringerZoltan)