Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Wydajny pamięciowo sposób przechowywania 32-bitowych liczb całkowitych ze znakiem w Redis

Wewnętrznie Redis przechowuje ciągi w najbardziej wydajny sposób. Wymuszenie na liczbach całkowitych ciągów o podstawie 10 spowoduje w rzeczywistości użycie większej ilości pamięci.

Oto jak Redis przechowuje ciągi —

  1. Liczby całkowite mniejsze niż 10000 są przechowywane w puli pamięci współużytkowanej i nie mają żadnych narzutów pamięci. Jeśli chcesz, możesz zwiększyć ten limit, zmieniając stałą REDIS_SHARED_INTEGERS w redis.hi rekompilując Redis.
  2. Liczby całkowite większe niż 10000 i mieszczące się w zakresie long zajmują 8 bajtów.
  3. Zwykłe łańcuchy zajmują len(string) + 4 bajty na długość + 4 bajty na oznaczenie wolnego miejsca + 1 bajt na terminator zerowy + 8 bajtów na narzuty malloc.

W cytowanym przez Ciebie przykładzie chodzi o 8 bajtów dla długiego v/s 21 bajtów dla ciągu.

EDYCJA:

Więc jeśli mam zestaw liczb mniej niż 10 000, w jaki sposób Redis przechowuje mój zestaw?

To zależy od tego, ile masz elementów.

Jeśli masz mniej niż 512 elementów w swoim zestawie (zobacz set-max-intset-entries ), to zestaw zostanie zapisany jako IntSet. IntSet to gloryfikowana nazwa tablicy Sorted Integer Array. Ponieważ twoje liczby są mniejsze niż 10000, użyje 16 bitów na element. Jest (prawie) tak wydajna pod względem pamięci jak tablica C.

Jeśli masz więcej niż 512 elementów, zestaw staje się HashTable. Każdy element w zestawie jest opakowany w strukturę o nazwie robj , który ma narzut 16 bajtów. robj struktura ma wskaźnik do wspólnej puli liczb całkowitych, więc nie płacisz nic więcej za samą liczbę całkowitą. I wreszcie robj instancje są przechowywane w tablicy mieszającej, która ma narzut proporcjonalny do rozmiaru zbioru.

Jeśli interesuje Cię dokładnie, ile pamięci zużywa dany element, uruchom redis-rdb-tools na swoim zestawie danych (zastrzeżenie:jestem autorem tego narzędzia). Możesz też przeczytać kod źródłowy klasy MemoryCallback, komentarze wyjaśniają, jak rozłożona jest pamięć.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Redis — połącz się ze zdalnym serwerem

  2. Pracujesz z dwoma oddzielnymi instancjami redis z sidekiq?

  3. Jest i Redis (problem testów jednostkowych z pamięcią podręczną bazy danych)

  4. Czego powinienem używać? Pokoje Socket.io czy pub-sub Redis?

  5. Czy powinienem zawsze używać potoku, gdy w Redis jest więcej niż 1 polecenie?