Výběr hash
přes string
má mnoho výhod a některé nevýhody v závislosti na případech použití. Pokud se chystáte zvolit hash, je lepší navrhnout objekt json jako hash pole a hodnoty jako;
127.0.0.1:6379> hset user:1 ssn 10101010101 name john surname wick date 2020-02-02 location continental
(integer) 5
127.0.0.1:6379> hgetall user:1
1) "ssn"
2) "10101010101"
3) "name"
4) "john"
5) "surname"
6) "wick"
7) "date"
8) "2020-02-02"
9) "location"
10) "continental"
Zde jsou výhody hash
přes řetězce, když uděláte správné datové modelování.
- Pokud jde o výkon, většina příkazů pro řetězce i hash je stejně složitá.
- Přístup/aktualizace/mazání jednotlivých polí json na hash je snazší, když je porovnáváme s řetězci. Nemusíte získat celý řetězec, dekódovat, provádět změny a znovu jej nastavovat. Pro tyto operace můžete použít HDEL, HSET nebo HGET, aniž byste získali celý objekt.
- Pokud se zvětší velikost vašeho objektu typu string, budete trpět sítí a šířkou pásma při přenosu (získání/nastavení) celého objektu. Jak je uvedeno v dokumentaci
Rychlost paměti RAM a šířka pásma paměti se zdají být méně důležité pro globální výkon, zejména u malých objektů. U velkých objektů (>10 KB) to však může být patrné.
- Haše jsou šetrnější k paměti než řetězec, pokud pro návrh velikosti dat uděláte dobrý benchmark. Jak je uvedeno v dokumentaci a příkladu použití instagramového inženýrství, můžete získat obrovskou výhodu se speciálním kódováním.
Hashe, seznamy, množiny složené pouze z celých čísel a tříděné množiny, pokud jsou menší než daný počet prvků a do maximální velikosti prvku, jsou kódovány velmi paměťově efektivním způsobem, který využívá až 10krát méně paměti (s 5 čas méně použité paměti je průměrná úspora).
Na druhou stranu, v závislosti na vašem případu použití;
ziplist
nepřichází zdarma, je to kompromis mezi pamětí a procesorem.- Nemůžete částečně vypršet platnost polí hash. Pokud rozdělíte do více řetězců, můžete
EXPIRE
ale v hash může vypršet platnost pouze klíče nejvyšší úrovně se všemi hodnotami.