Today I Learn ✍🏼
- 오늘 하루 가장 인상 깊었던 배움에는 뭐가 있었지?
- redis-stack 인상적
- JPA 좋아 보임
- 최근에 공부한 싱글톤, bean 복습으로 인해 이해력이 더 올라갔다
redis를 spring에서 간단히 테스트 코드를 짜는데
JPA로 하니까 dao도 안 만들어도 되고, 꽤나 코드 양이 줄어들고 더 쉬워보였다.
- 그 배움까지 다가가는데 어떤 어려움이 있었지?
동영상을 보는거라 지루했다.
오랫만에 도커를 띄어야해서 컴퓨터 내의 brew도 업데이트 하는데, 오류가 났다.
영상과 제공된 도커 compose 파일 내용이 달라서 둘다 시도 해봤다.
처음 영상에서 나온대로 했더니 포트에 요청해도 docker stack이 띄어지지 않았다.
- 그 어려움을 해결하기 위한 나의 시도들은 무엇이 있었지?
영상과 제공된 도커 compose 파일 내용이 달라서 둘다 시도 해봤다.
- 그 과정에서 나는 무엇을 깨달았고, 어떤 감정/생각이 들었었지?
동영상을 빨리 보고, 실행을 해봐야겠다.
- 이 상태에서 이후 더 나은 내가 되려면 무엇을 보완하지?
다른 영상도 빨리 봐서 java에 대한 이해도도 높이고, 현재 진행하고 있는 월요일 CS 스터디를 꾸준히 해야겠다.
서로 연관되어 있어서 이해력이 높아진다.
redis-stack
Docker에서 redis-stack을 선택하면
http://localhost:8001 dash board로 데이터를 확인 할 수 있다
IntelliJ에서도 확인 가능하다
Redis Data Type
Set
문자열의 집합입니다. 집합인 만큼 중복값을 제거하며, 순서가 존재하지 않습니다.
SADD user:java alex # [alex] # 추가
SADD user:java brad # [alex, brad] # 추가
SADD user:java chad # [alex, brad, chad] # 추가
SREM user:java alex # [brad, chad] # 삭제
SMEMBERS user:java # [alex, brad, chad] # 다 출력
SISMEMBER user:java brad # true # is? 있냐? 있음
SISMEMBER user:java dave # false # is? 있냐? 없음
Sorted Set
정렬된 집합입니다.
기본적으로 Set과 동일하게, 유일한 값들만 유지하지만
여기에 더해 각 값들에 score라고하는 실수를 함께 보관합니다.
데이터를 가져올 때, score를 바탕으로 정렬하여 값들을 가져올 수 있습니다.
ZADD user:ranks 10 alex
#key는 user:ranks score은 10 value는 alex
ZADD user:ranks 9 brad 11 chad
#key는 user:ranks /score은 9 value는 brad/ score은 11 value는 chad
ZADD user:ranks 8 dave
# 결과
# 0 8 dave
# 1 9 brad
# 2 10 alex
# 3 11 chad
ZINCRBY user:ranks 2 alex
# key increment member
# key의 Sorted Set의 member의 score를 increment 만큼 증가 (음수를 전달하면 감소)
ZRANK user:ranks alex
# member의 순위를 오름차순 기준으로 0에서 부터 세서 반환
# 2
ZRANGE user:ranks 0 3
# start 부터 stop 순위까지 오름차순 기준으로 반환
# dave, brad, alex, chad
ZREVRANK user:ranks alex
# 내림차순
# 1
ZREVRANGE user:ranks 0 3
# 반대로
# chad, alex, brad, dave
String
가장 기본적인 자료형이며, Redis가 Java의 Map<String, String>처럼 동작한다고 생각하면서 접근하면 편합니다.
저장할 수 있는 최대 크기는 512MB입니다.
SET user:email alex@example.com
GET user:email
SET user:count 1 # key는 user:count value는 1
INCR user:count # 증가시킴
DECR user:count # 감소시킴
# M: Multi 여러개를 적용
MSET user:name alex user:email alex@example.com
MGET user:name user:email
단순 문자열이지만, 문자열은 결국 바이트 배열입니다.
이미지, 음성, 영상, 파일, 또는 이메일 본문 등도 보관이 가능하다.
분산된 구조에서 비교적 큰 사이즈의 데이터를 주고받아야 하는 상황에
Key만 전달해서 데이터는 여기있다 전달하는 방식으로 활용할 수 있습니다.
Hash
Field - Value 쌍으로 이뤄진 자료형입니다.
Hash 데이터를 가져오기 위해 Key를 사용하고,
이후 다시 Key에 저장된 Hash 데이터에 Field - Value 쌍을 넣어주는 형식으로 동작하게 됩니다.
즉, Redis 전체가 Map 이라면 Hash는 Map<String, Map<String, String>>의 형식이라고 생각할 수 있습니다.
장바구니 기능
사용자별로, 어떤 물품이 몇개나 담겨있는지와 같은 정보가 포함되어야 합니다.
사용자 마다 Hash 데이터를 생성하고,
물품 - 갯수 형식으로 데이터를 저장하면 사용자별 장바구니를 쉽게 저장할 수 있습니다.
HSET user:alex name alex age 25
HSET user:alex major CSE
# HSET key field value [field value]
# key의 Hash에 field에 value를 넣는다
# 한번에 여러 field - value 쌍을 넣어줄 수 있다.
HGET user:alex name
HGET user:alex age
HMGET user:alex age major
HGETALL user:alex
HKEYS user:alex
HLEN user:alex
List
여러 문자열 데이터를 Linked List의 형태로 보관하는 자료형입니다.
Linked List이기 때문에, 중간의 데이터 보다는 양끝의 데이터, 즉 스택 또는 큐 처럼 사용할 수 있습니다.
LPUSH user:list alex # [alex]
LPUSH user:list brad # [brad, alex]
RPUSH user:list chad # [brad, alex, chad]
RPUSH user:list dave # [brad, alex, chad, dave]
LPOP user:list # brad
RPOP user:list # dave
# 현재 데이터 [alex, chad]
LLEN user:list # 2
LRANGE user:list 0 3 # [alex, chad] 오버되도 괜츈 있는 데이터까지만 출력
LRANGE user:list 0 -1 # [chad] 뒤에서 하나
공통
SET somekey "to be deleted"
DEL somekey # 삭제
SET expirekey "to be expired" # 수정
EXPIRE expirekey 5 # 시간 5초뒤 만료
EXPIRETIME expirekey # 언제 만료 됨?
KEYS *
# 저장된 모든 Key 확인
FLUSHDB
# 저장된 모든 Key 제거
Redis Hash 저장 in Spring
Data Type: Hash
HSET item:난수 name keyboard price 100000 description "Very Expensive Keyboard"
# HSET key field value [field value]
# key의 Hash에 field에 value를 넣는다
# 한번에 여러 field - value 쌍을 넣어줄 수 있다.
오늘의 조회 수
Data Type: String
SET user:count 1 # key는 user:count value는 1
INCR user:count # 증가시킴
문제
글 조회 수(아이디 중복 안됨) 정답
중복을 무시하는 Set 사용
# SCARD key: key에 저장된 집합의 크기를 반환
가장 높은 조회 수 of Article 정답
Spring에 redis를 활용한 상품 CRUD 실습
문제2
Redis template Bean 생성
'학습 기록 (Learning Logs) > Today I Learned' 카테고리의 다른 글
RabbitMQ, Kafka (0) | 2024.12.02 |
---|---|
Map 함수 (0) | 2024.08.14 |
Spring Security? OAuth2 ? (0) | 2024.08.06 |
MSA, Spring Cloud (0) | 2024.08.06 |
DI, IoC (0) | 2024.07.30 |