Redis 해시 자료구조는 필드-값 쌍의 컬렉션으로 구성된 데이터 구조이다.
redis-cli
127.0.0.1:6379> HSET player:42 name jinjin race elf level 4 hp 20 gold 20
(integer) 5
127.0.0.1:6379> HGETALL player:42
1) "name"
2) "jin"
3) "race"
4) "elf"
5) "level"
6) "4"
7) "hp"
8) "20"
9) "gold"
10) "20"
127.0.0.1:6379> HSET player:42 status dazed
(integer) 1
127.0.0.1:6379> HDEL player:42 status
(integer) 1
127.0.0.1:6379> HGET player:42 level
"4"
127.0.0.1:6379> HINCRBY player:42 gold 120
(integer) 140
Redis 해시의 대부분의 명령어는 O(1)
복잡도를 가진다. 이는 명령어의 실행 시간이 해시의 크기에 관계없이 상수 시간에 유지된다는 것을 의미한다. 따라서 해시의 크기가 증가해도 명령어의 실행 시간에는 영향을 미치지 않는다.
그러나 몇 가지 명령어는 O(n)
복잡도를 가진다. 예를 들어, HKEYS
, HVALS
, HGETALL
과 같은 명령어는 필드-값 쌍의 개수(n)에 비례하여 실행 시간이 증가한다. 이는 해당 명령어가 모든 필드나 모든 값을 반환해야 하기 때문에 발생한다. 필드나 값의 수가 증가하면 이러한 명령어의 실행 시간도 증가할 수 있다.
Redis의 HSET
명령어는 해시(hash) 데이터 구조에 새로운 필드-값 쌍을 추가하거나 기존 필드의 값을 업데이트하는 명렁어이다.
HSET key field value [field value ...]
key
는 해시의 키를 나타내며, field
는 추가하거나 업데이트하고자 하는 필드를 나타낸다. value
는 해당 필드에 설정하고 하는 값이다.field
가 이미 존재하는 경우에는 해당 필드의 값을 value
로 업데이트하고, 존재하지 않는 경우에는 새로운 필드-값 쌍을 추가한다.HSET user:1000 username cindy age 15 email cindy@email.com
HSET user:1000 age 20 # user:1000 해시의 age 필드의 값을 20으로 업데이트한다.
Redis의 HINCRBY
명령어는 해시(hash) 데이터 구조에서 지정된 필드(field)의 값을 정수로 증가시키는 명령어이다. 만약 해당 필드가 존재하지 않는 경우, 새로운 필드를 생성하고 값을 증가시킨다.
HINCRBY key field increment
key
는 해시의 키를 나타내며, field
는 증가시킬 값을 갖는 필드를 나타낸다. increment
는 해당 필드의 값을 증가시킬 양을 나타낸다. increment
는 반드시 정수여야 한다.HSET user:1000 visits 10
HINCRBY user:1000 visits 1 # user:100 해시의 visits 필드의 값을 1 증가시킨다.
# 실행 후의 값은 11이 된다.
Redis의 HGET
명령어는 해시(hash) 데이터 구조에서 지정된 필드(field)에 해당하는 값을 가져오는 명령어이다. 해시는 키(key)와 여러 개의 필드-값 쌍으로 구성된 데이터 구조로, 필드는 고유한 식별자이며 값은 해당 필드에 저장된 데이터이다.
HGET key field
key
는 해시의 키를 나타내며, field
는 가져오고자 하는 값의 필드를 나타낸다.HSET user:1000 username cindy
HSET user:1000 age 15
HGET user:1000 username # cindy 반환
HGET user:1000 age # 15 반환
HGET user:1000 what # nil 반환
Redis의 HGETALL
명령어는 해시(hash) 데이터 구조 내의 모든 필드-값 쌍을 가져오는 명령어이다. 해시는 키(key)와 여러 개의 필드-값 쌍으로 구성된 데이터 구조이며, HGETALL
명령어를 사용하면 해당 해시의 모든 내용을 가져올 수 있다.
HGETALL key
key
는 해시의 키를 나타낸다.HSET user:1000 username cindy
HSET user:1000 age 15
HGETALL user:1000 # 아래 결과를 반환한다
1) "username" # field1
2) "cindy" # value1
3) "age" # field2
4) "15" # value2
HGETALL
명령어를 사용할 때 몇 가지 주의할 점이 있다.
HGETALL
명령어는 해시에 저장된 모든 필드-값 쌍을 가져오므로, 해시의 크기가 크면 성능에 영향을 줄 수 있다. 특히, 큰 해시를 사용할 때는 네트워크 대역폭이나 Redis 인스턴스의 메모리 사용량을 고려해야 한다.HGETALL
은 전체 해시를 가져오므로, Redis 인스턴스의 메모리 사용량에 영향을 줄 수 있다. 만약 메모리 사용량이 중요한 경우, 필요한 필드만 가져오는 개별적인 HGET
명령어를 사용하는 것이 더 효율적일 수 있다.HGETALL
명령어는 모든 필드-값 쌍을 한 번에 가져오므로, 네트워크 부하를 유발할 수 있다. 특히, 클라이언트와 Redis 서버 간의 네트워크가 느린 경우에는 이러한 부하에 대해 고려해야 한다.HGETALL
명령어는 필드-값 쌍을 반환할 때 순서를 보장하지 않는다. 따라서 반환된 필드-값 쌍의 순서가 항상 일정하지 않을 수 있다. 필요에 따라 명시적으로 정렬을 수행해야 할 수 있다.16GB RAM 컴퓨터와 4GB RAM 컴퓨터에서 3GB HGETALL을 한다면 성능적으로 어떤 차이가 있을까?
HMSET user:1 name "John" email "john@example.com" age 30
HMSET product:1234 name "Smartphone" description "High-end smartphone"
HMSET session:abcd1234 user_id 1234 login_time 2024-02-20T15:00:00 expiry_time 2024-02-20T16:00:00
HINCRBY event:login:20240220 user_count 1
LINK