728x90
반응형
SMALL
학습내용
- Redis 주요 데이터 타입
- Redis 데이터 타입 활용 예제
- Redis CLI 기본명령어 (간단)
학습정리
1. Redis 주요 데이터 타입
public void redisTypeExample() {
log.info("RedisTypeExample");
//===String==========
//하나의 키에 하나의 문자열, 숫자 데이터 저장
//숫자를 문자로 저장해도 숫자로 인식을 해서 더하기 빼기가 가능
jedis.set("username", "꿀승");
jedis.set("userAge", "30");
String name = jedis.get("username");
String age = jedis.get("userAge");
log.info("[redisTypeExample] name:{}, age:{}", name, age);
jedis.incr("userAge");
age = jedis.get("userAge");
log.info("[redisTypeExample] age:{}", age);
jedis.decr("userAge");
age = jedis.get("userAge");
log.info("[redisTypeExample] age:{}", age);
//===List==========
//삽입순서를 유지하며, FIFO, LIFO 방식으로 더이터 처리 가능
//하나의 키에 여러 값을 저장
//기본적으로 한방향으로 정해서 사용
jedis.rpush("Tasks1","task1","task2","task3");
//Task1 : task1->task2->task3 rpush 는 왼쪽->오른쪽으로 가면서 저장
jedis.lpush("Tasks2","task1","task2","task3");
//Task2 : task3->task2->task1 lpush 는 오른쪽->왼쪽으로 가면서 저장
String tasks1 = jedis.lpop("Tasks1"); //왼쪽부터 제거 =>task1
String tasks2 = jedis.rpop("Tasks1"); //오른쪽부터 제거 =>task3
log.info("[redisTypeExample] tasks1:{}, tasks2:{}", tasks1,tasks2);
String tasks3 = jedis.lpop("Tasks2"); //왼쪽부터 제거 =>task3
String tasks4 = jedis.rpop("Tasks2"); //오른쪽부터 제거 =>task1
log.info("[redisTypeExample] tasks3:{}, tasks4:{}", tasks3,tasks4);
//========Set===========
//중복을 허용하지 않는 데이터 구조, 순서없음
//다양한 집합 연산이 가능(교집합,합집합,차집합) 지원
jedis.sadd("event1", "user1", "user2");
jedis.sadd("event2", "user2", "user3");
//교집합
Set<String> commonUser = jedis.sinter("event1", "event2");
log.info("[redisTypeExample] commonUser:{}", commonUser); //user2
//========Hash=======
//구조 : 레디스키 :{ 키 : 벨류}
//레디스키 userId는 실제사용시에는 db의 id 값
jedis.hset("userId", "name", "꿀승");
jedis.hset("userId", "email", "email@email.com");
jedis.hset("userId", "age", "30");
String userName = jedis.hget("userId", "name"); //꿀승
Map<String, String> userProfile = jedis.hgetAll("userId");
log.info("[redisTypeExample] userName:{}", userName);
log.info("[redisTypeExample] userProfile:{}", userProfile); //{name=꿀승, email=email@email.com, age=30}
//=======Sorted set (정렬된 집합)======
//값과 점수를 저장하여 점수기준으로 정렬, 특정 범위 데이터를 효율적으로 조회 가능
//key, score, value 순
jedis.zadd("leaderboard", 1500, "player1");
jedis.zadd("leaderboard", 2000, "player2");
//0은 시작지점, 1은 끝나는 지점 인덱스처럼
// start,stop 은 각각의 지점을 말하는 것
// 0, -1 은 전부나옴
//zrange 스코어 낮은거 부터, 오름차순
//zrevrange 스코어 높은거 부터, 내림차순
List<String> players1 = jedis.zrange("leaderboard", 0, 1);
log.info("[redisTypeExample] players1:{}", players1); // player1(1500) ->player2(2000)
//해당 스코어 더하기
jedis.zincrby("leaderboard", 1000, "player1");
List<String> players2 = jedis.zrange("leaderboard", 0, 1);
log.info("[redisTypeExample] players2:{}", players2); // player2(2000) ->player1(2500)
}
2. Redis 데이터 타입 활용 예제
문자열 데이터를 사용한 캐싱
public void redisStringExample() { //{userId} 실제 id 값 jedis.set("user-{userId}-name", "꿀승"); String value = jedis.get("user-{userId}-name"); log.info("[redisStringExample] value:{}", value); //만료시간 설정 (1시간) jedis.expire("user-{userId}-name", 3600); //만료시간 확인 long ttl = jedis.ttl("user-{userId}-name"); log.info("[redisStringExample] ttl:{}", ttl); //ttl:3600 }
리스트와 큐 구현
public void redisListExample() { jedis.lpush("tasks123","Task1","Task2","Task3"); //Task3->Task2->Task1 long queueSize = jedis.llen("tasks123"); //사이즈 log.info("[redisListExample] queueSize:{}", queueSize); //선입선출 FIFO String task = jedis.rpop("tasks123"); //rpop이니깐 Task1 꺼내기 log.info("[redisListExample] task:{}", task); //만약 rpush로 넣고 rpop으로 가져오면 Task1->Task2->Task3 으로 들어가고 그중 오른쪽꺼를 꺼내니 LIFO //llen으로 구한 사이즈만큼 반복문 돌면서 꺼내기 가능 // for (int i =0; i< queueSize; i++) { // String taskValue = jedis.rpop("tasks123"); //rpop이니깐 Task1 꺼내기 // log.info("[redisListExample] task:{}", taskValue); // } //잔여 전체 가져오기 log.info("[redisListExample] task:{}", jedis.lrange("tasks123", 0, -1)); //[Task3, Task2] }
해시를 활용한 키-값 관리
public void redisHashExample() { //단건으로 가져올지 map으로 가져올지 판단 후 사용 jedis.hset("user:34534", "name", "꿀승"); jedis.hset("user:34534", "email", "email@email.com"); jedis.hset("user:34534", "age", "30"); String value = jedis.hget("user:34534", "name"); //꿀승 log.info("[redisHashExample] value:{}", value); log.info("info : {}",jedis.hgetAll("user:34534")); Map<String, String> userProfile = jedis.hgetAll("user:34534"); log.info("[redisHashExample] userProfileName:{}", userProfile.get("name")); }
정렬된 집합을 활용한 리더보드 관리
public void redisSortedSetExample() { jedis.zadd("leaderboard1", 1500, "player1"); jedis.zadd("leaderboard1", 2000, "player2"); jedis.zadd("leaderboard1", 1200, "player3"); //상위 2명 List<String> topPlayer = jedis.zrevrange("leaderboard1", 0, 1); log.info("[redisSortedSetExample] topPlayer:{}", topPlayer); //[player2,player1] // 하위 2명의 순위 조회 (점수 오름차순) List<String> topPlayersAsc = jedis.zrange("leaderboard1", 0, 1); log.info("RedisSortedSetExample topPlayers Asc: {}", topPlayersAsc); //[player3,player1] //스코어 1000 add jedis.zincrby("leaderboard1",1000,"player1"); // 특정 플레이어 점수 조회 Double score = jedis.zscore("leaderboard1", "player1"); log.info("RedisSortedSetExample score : {}", score); //2500 }
3. Redis cli 명령어
- 만료시간 설정 : EXPIRE [KEY] [시간] : EXPIRE user 3600.
- 남은 만료시간 확인 : TTL [KEY] : TTL user
- 데이터 삭제 : DEL [KEY] : DEL user
- 모든 Key 조회 : KEYS *
- 모든 Key 개수확인 : DBSIZE
- 모든 데이터 삭제 : FLUSHALL
참고자료
- Redis CLI 기본 명령어 : Redis
728x90
반응형
LIST
'TIL' 카테고리의 다른 글
4_5.리더보드와 Sorted Set 실습 (0) | 2025.01.17 |
---|---|
4_4.Redis와 캐싱 전략, 최적화 실습 (0) | 2025.01.16 |
4_2.인메모리 저장소 및 캐싱 전략 개요 (0) | 2025.01.14 |
4_1.HTTP Session과 Session Clustering (0) | 2025.01.13 |
3_5.단위 테스트 작성 연습 (0) | 2025.01.13 |