안녕하세요 😉
유유자적한 개발자 유로띠 입니다 😀
👏👏👏👏
이번 포스팅에서는
✅ Redis란?
✅ docker Redis 설치
✅ Redis 기본 명령어
✅ Spring boot에서 Redis 테스트
에 대해서 알아보겠습니다
🎉 REDIS
Redis 란
REmote DIctionary Server의 약자로
키-값 기반의 인 메모리 데이터 구조 저장소입니다
한 가지씩 살펴보겠습니다 👀
✅ 키-값 기반
비 관계형 데이터베이스 유형이며, 키를 사용하여 저장되고 검색되며 이를 통해 저장소에서 빠르게 찾을 수 있습니다.
✅ 인 메모리 데이터 저장소
Mysql, PostgreSQL, Oracle 등 대부분의 데이터 베이스는 디스크 또는 SSD에 저장하지만 모든 Redis는 서버의 주 메모리에 저장됩니다. 정보의 처리나 조회를 위해 디스크까지 왕복해야 하는 다른 데이터베이스와 달리 Redis와 같은 인 메모리 데이터 저장소는 이러한 단점이 없기 때문에 더 많은 작업을 처리하고 더 빠른 응답 시간을 지원할 수 있습니다.
그렇다면 Redis는 어떠한 특징들이 있을까요? 🧐
✅ 다양한 데이터 구조(Collection)
아래와 같은 7가지의 데이터 구조를 제공합니다
strings
키와 연결할 수 있는 가장 간단한 유형의 값으로 키-값 구조입니다. 값은 최대 512MB보다 클 수 없습니다.
hashes
값의 목록을 저장하는 구조입니다.
lists
순서가 유지되는 문자열 모음입니다.
sets
정렬되지 않은 문자열 모음입니다. 중복을 허용하지 않습니다.
sorted sets
값을 기준으로 순서가 정렬된 세트
bitmaps
실제 데이터 유형이 아닌 문자열 유형에 정의된 비트 지향 연산의 집합
hyperLogLogs(HLL)
데이터 세트 내 고유 항목을 추정하리 위한 확률적 데이터 구조
✅ 싱글 스레드
Redis는 싱글 스레드 형식의 Event Loop 방식이며, I/O Multiplexing을 통해 처리됩니다.
📢 Redis 설치하기
사실 설치는 너무 간단하지만
docker 기반의 redis를 설치해 보도록 하겠습니다.
✅ redis 설치
redis 이미지를 다운받습니다. 👍
$ docker pull redis
docker 기반의 redis 설치가 완료되었습니다.
redis를 기동해 보도록 하겠습니다.
✅ redis 실행
redis는 6379를 기본 포트로 사용합니다.
$ sudo docker run -p 6379:6379 redis
✅ redis 접속
redis에 접속하기 전에 redis가 설치된 docker 컨테이너 내부로 접속합니다.
$ docker exec -it redis /bin/bash
💡 참고
만약 아래와 같은 에러가 발생한다면 다음과 같이 접속하시면 됩니다.
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "/bin/bash": stat /bin/bash: no such file or directory: unknown
$ docker exec -it redis /bin/sh
컨테이너 내부로 접속하였고 redis에 접속해 보겠습니다.
redis-cli 명령어를 이용하여 redis에 접속합니다.
접속이 완료되면 IP:port > 프롬프트로 변경됩니다.
/data# redis-cli
127.0.0.1:6379>
✅ redis 버전 확인
info 명령어를 사용하면 다양한 정보를 알 수 있으며, redis version도 확인 가능합니다.
127.0.0.1:6379> info
# Server
redis_version:4.0.14
📢 Redis 기본 명령어
앞서 소개한 redis의 데이터 구조 중 strings, list, set의 기본 명령어에 대해서 알아봅시다.
✅ strings
키-값 구조로 데이터를 저장하고 조회해보도록 하겠습니다.
set 명령어를 이용하여 key - value를 저장합니다.
get 명령어를 이용하여 key에 해당하는 value를 조회합니다.
del 명령어를 이용하여 key를 삭제합니다.
✅ list
순서가 유지되고 중복을 허용하는 문자열 모음입니다.
lpush: [ lpush key value ]
left push이며 왼쪽부터 즉, index 0부터 데이터를 저장합니다.
lpop: [ lpop key ]
left pop이며, list의 index 0 부터 데이터를 추출합니다.
rpush: [ rpush key value ]
right push이며 오른쪽부터 즉, index last부터 데이터를 저장합니다.
rpop: [ rpop key ]
right pop이며, list의 index last 부터 데이터를 추출합니다.
lrange: [ lrange key start end ]
list의 데이터를 start부터 end까지의 데이터를 추출합니다.
lrange에서 end를 -1로 선언하면 해당 list의 데이터를 전부 추출합니다.
✅ set
정렬되지 않고 순서가 없는 문자열 모음입니다.
set에서는 value를 member로 표시합니다.
sadd: [ sadd key member ]
set의 key에 member를 추가합니다.
srem: [ srem key member]
set의 key에 member를 삭제합니다.
smembers: [ smembers key ]
set의 key의 모든 member를 조회합니다.
📢 Spring boot에서 Redis 테스트
spring boot에서 redis의 기본 명령어 중
push, pop에 대해서 테스트를 해보겠습니다. 😀
✅ build.gradle.kts
redis gradle 의존성을 주입합니다.
dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-redis")
}
✅ RedisTest.kt
leftPush를 통해 key-value 형식으로 foo: {bar: 123} 정보를 저장합니다.
rightPop을 통해 데이터를 가져옵니다.
이렇게 하면 마치 queue처럼 데이터를 가져오게 됩니다.
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.data.redis.core.RedisTemplate
import org.springframework.test.context.ActiveProfiles
import org.springframework.test.context.junit.jupiter.SpringExtension
import org.assertj.core.api.Assertions.assertThat
@ActiveProfiles("local")
@ExtendWith(SpringExtension::class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
class RedisTest @Autowired constructor(
val redisTemplate: RedisTemplate<String, Any>
) {
@Test
fun `push and pop `() {
//given
val data = "{bar:123}"
redisTemplate.opsForList().leftPush("foo", data)
//when
val result = redisTemplate.opsForList().rightPop("foo")
//then
assertThat(data).isEqualTo(result)
}
}
'Programming > redis' 카테고리의 다른 글
redis의 pub/sub 이란? (0) | 2021.07.14 |
---|