Search
Duplicate
📒

[고성능 서비스를 위한 Redis] 03. Redis 세션 스토어

상태
완료
수업
고성능 서비스를 위한 Redis
주제
Redis
연관 노트
3 more properties
참고

Redis 세션 스토리지

Session

NOTE
Session은 네트워크 상에서 2개 이상의 통신장치간에 유지되는 상호 연결이다!
HTTP는 상태가 유지되지 않는 Stateless한 비접속형 프로토콜이다.
그래서 서버는 클라이언트의 이전 상태를 기억하기 위해 Session이라는 개념을 사용한다!
클라이언트는 쿠키를 가지고 서버에 보낸다 서버는 쿠키를 읽어서 SessionID를 읽은뒤 처리한다.
Session의 가장 대표적인 사례가 바로 로그인이다,
브라우저는 Cookie를, 서버는 해당 Cookie에 연관된 세션 정보를 저장한다.
유저가 로그아웃하거나, 세션이 만료될 때 까지 유지되어 유저에게 특정한 서비스가 가능하다!
ex) 다시 접속해도 유저의 장바구니가 유지된다.

스프링부트 Session

NOTE
HashMap<String, String> sessionMap = new HashMap<>(); @GetMapping("/login") public String login(HttpSession session, @RequestParam String name) { session.setAttribute("name", name); return "saved"; } @GetMapping("/myName") public String myName(HttpSession session) { String myName = sessionMap.get(session.getId()); return myName; }
Java
복사
HttpSession을 활용해서 Session을 편리하게 관리한다.
서블릿이 제공하는 HttpSession은 JESSIONID라는 이름의 Cookie를 자동으로 생성한다!
실제 조회가능한 쿠키값

분산 환경에서의 Session처리(세션 클러스터링)

NOTE
분산환경의 경우 각 웹서버별로 세션정보가 다른데 이를 알지 못한다!
WEB1과 WEB2의 Session 정보는 다르지만 각 서버는 이를 모른다! (공유할 방법이 필요) ⇒ 세션 클러스터링

세션 데이터의 특징

Session은 아래의 특징들로 RDB보다는 Redis가 더 효율적!
빠른 접근 시간이 필요하다.
세션 데이터는 영속성을 필요로하지 않는다.
로그인하는 동안만 필요하고, 시간이 지나면 사라진다.
세션 데이터는 자주 변경된다.
사이트나 앱을 사용하는 동안의 상호작용에 대한 정보를 가지기 때문이다.
저장 용량이 적다.

Spring에서 Redis 사용하기 (RedisTemplate)

NOTE
spring: redis: host: localhost port: 6379
YAML
복사
Redis 등록
@Autowired StringRedisTemplate redisTemplate; // setFruit?name=banana // /getFruit @GetMapping("/setFruit") public String setFruit(@RequestParam String name) { ValueOperations<String, String> ops = redisTemplate.opsForValue(); ops.set("fruit", name); return "saved"; } @GetMapping("/getFruit") public String getFruit() { ValueOperations<String, String> ops = redisTemplate.opsForValue(); String fruitName = ops.get("fruit"); return fruitName; }
Java
복사
RedisTemplate를 활용한 코드

세션 클러스터링(Redis를 통한 Session 관리)

NOTE
최종적인 아키텍
spring: session: store-type: redis
YAML
복사
yaml에서 session타입을 Redis로하면 쉽게 설정가
@GetMapping("/login") public String login(HttpSession session, @RequestParam String name) { session.setAttribute("name", name); return "saved"; } @GetMapping("/myName") public String myName(HttpSession session) { String myName = (String) session.getAttribute("name"); return myName; }
Java
복사
ehd