Redis
 sql >> Database >  >> NoSQL >> Redis

Redis AOF fsync (SEMPRE) rispetto all'albero LSM

LSM è AOF che a volte vuoi effettivamente leggere. Fai un po' di lavoro in testa in modo da poterlo leggere più velocemente in seguito. Redis è progettato in modo da non leggerlo mai o solo in un caso speciale. Cassandra invece lo legge spesso per servire le richieste.

E ciò che Redis chiama lento è in realtà molto molto veloce per un db come Cassandra.

=============================AGGIORNAMENTO

Si scopre che sono saltato alle conclusioni troppo presto. Dal punto di vista del design, tutto quanto sopra è vero, ma l'implementazione differisce molto. Nonostante Cassandra rivendichi la durabilità assoluta, non fsync su ogni transazione e non c'è modo di forzarlo (ma ogni transazione potrebbe essere sincronizzata). Il meglio che posso fare è "fsync in modalità batch almeno 1 ms dopo il precedente fsync". Significa che per il benchmark a 4 thread che stavo usando stavo facendo 4 scritture per fsync e i thread stavano aspettando che fsync fosse fatto. D'altra parte, Redis ha eseguito fsync su ogni scrittura, quindi 4 volte più spesso. Con l'aggiunta di più thread e più partizioni del tavolo, Cassandra potrebbe vincere ancora più grande. Ma nota che il caso d'uso che hai descritto non è tipico. E si applicano ancora altre differenze architettoniche (Cassandra è bravo a partizionare, Redis è bravo a contatori, LUA e altro).

Numeri:

Comando Redis:set(KEY + (tstate.i++), TEXT);

Comando Cassandra:execute("insert into test.test (id,data) values (?,?)", state.i++, TEXT)

Dove TEXT = "Wake up, Neo. We have updated our privacy policy."

Redis sincronizza ogni secondo, HDD

Benchmark              (address)   Mode  Cnt      Score      Error  Units
LettuceThreads.shared  localhost  thrpt   15  97535.900 ± 2188.862  ops/s

  97535.900 ±(99.9%) 2188.862 ops/s [Average]
  (min, avg, max) = (94460.868, 97535.900, 100983.563), stdev = 2047.463
  CI (99.9%): [95347.038, 99724.761] (assumes normal distribution)

Redis sincronizza ogni scrittura, HDD

Benchmark              (address)   Mode  Cnt   Score   Error  Units
LettuceThreads.shared  localhost  thrpt   15  48.862 ± 2.237  ops/s

  48.862 ±(99.9%) 2.237 ops/s [Average]
  (min, avg, max) = (47.912, 48.862, 56.351), stdev = 2.092
  CI (99.9%): [46.625, 51.098] (assumes normal distribution)

Redis, fsync ogni scrittura, NVMe (Samsung 960 PRO 1tb)

Benchmark              (address)   Mode  Cnt    Score   Error  Units
LettuceThreads.shared     remote  thrpt   15  449.248 ± 6.475  ops/s

  449.248 ±(99.9%) 6.475 ops/s [Average]
  (min, avg, max) = (441.206, 449.248, 462.817), stdev = 6.057
  CI (99.9%): [442.773, 455.724] (assumes normal distribution)

Cassandra, sincronizza ogni secondo, HDD

Benchmark                  Mode  Cnt      Score     Error  Units
CassandraBenchMain.write  thrpt   15  12016.250 ± 601.811  ops/s

  12016.250 ±(99.9%) 601.811 ops/s [Average]
  (min, avg, max) = (10237.077, 12016.250, 12496.275), stdev = 562.935
  CI (99.9%): [11414.439, 12618.062] (assumes normal distribution)

Cassandra, sincronizza ogni batch, ma attendi almeno 1 ms, HDD

Benchmark                  Mode  Cnt    Score   Error  Units
CassandraBenchMain.write  thrpt   15  195.331 ± 3.695  ops/s

  195.331 ±(99.9%) 3.695 ops/s [Average]
  (min, avg, max) = (186.963, 195.331, 199.312), stdev = 3.456
  CI (99.9%): [191.637, 199.026] (assumes normal distribution)