[python] Redis

About_work·2023년 3월 8일
0

python database

목록 보기
1/1

Redis 데이터베이스

  • Redis는 고성능 key-value 데이터베이스 시스템
  • 다양한 데이터 구조와 함께 분산 캐시, 메시징 대기열, 세션 저장소 등으로 사용
  • Redis는 클라이언트-서버 모델로 구성되어 있으며, 네트워크를 통해 클라이언트와 서버 간의 통신을 수행합니다.
  • Redis 서버는 TCP 프로토콜을 사용하여 클라이언트와 연결하고, 클라이언트의 요청을 처리합니다.
  • 클라이언트는 Redis 서버에 요청을 보내기 위해 Redis 클라이언트 라이브러리를 사용합니다.
    • Redis 클라이언트 라이브러리는 Redis 프로토콜을 구현하여 Redis 서버와 통신합니다.
    • Redis 명령어는 텍스트 형식으로 작성되며, Redis 클라이언트 라이브러리는 이 명령어를 Redis 프로토콜로 변환하여 Redis 서버에 보냅니다.
  • Redis는 단일 스레드로 동작합니다.
  • Redis 서버는 요청을 처리하기 위해 요청을 큐에 저장하고, 요청을 처리하는 스레드가 큐에서 요청을 꺼내 처리합니다. 이를 통해 Redis는 매우 빠른 응답 시간을 제공할 수 있습니다.
  • Redis는 데이터를 메모리에 저장하며, Redis는 스냅샷과 로그 방식을 사용하여 데이터를 디스크에도 저장합니다.
    • 스냅샷은 Redis의 메모리 상태를 디스크에 저장하는 방식입니다.
    • 스냅샷은 주기적으로 수행되거나, 명령을 수행하는 등의 이벤트가 발생할 때 수행됩니다.
    • 로그 방식은 Redis가 실행 중인 동안, 변경된 데이터를 디스크에 로그하는 방식입니다.
    • 로그 방식은 스냅샷 방식에 비해 더 빠르게 데이터를 저장할 수 있습니다.

redis 와 shared memory 의 차이점

  • Redis

    • 대규모 분산 시스템에서 데이터 처리를 위해 사용
    • Redis는 인메모리 데이터 저장소(In-memory Data Store)로, 데이터를 메모리에 저장하고 디스크에도 저장할 수 있습니다.
    • 대량의 데이터를 빠르게 처리하는 데 적합
    • Redis는 자체적으로 데이터의 영속성(Persistence)을 지원하며, 캐싱(Caching), 세션 관리(Session Management), 메시지 브로커(Message Broker) 등 다양한 용도로 사용됩니다.
    • Redis는 오픈 소스로, 많은 기능을 제공하며 클러스터링(Clustering)을 지원합니다.
    • 다수의 클라이언트가 동시에 접근하여 데이터를 읽고 쓰는 데 적합하며, 클러스터링(Clustering)을 지원하여 높은 가용성을 제공합니다.
      • 따라서, 대규모 분산 시스템에서 데이터를 처리하는 데 많이 사용됩니다.
  • Shared memory

    • IPC를 위한 프로세스 간 통신에서 사용됩니다.
    • 반면, shared memory는 여러 프로세스가 공유할 수 있는 메모리 영역을 제공하는 기술입니다.
    • 각 프로세스가 데이터를 읽고 쓸 때, 커널이 복사 없이 메모리를 공유하여 빠른 처리 속도를 보장합니다.
    • Shared memory는 IPC(Inter-Process Communication) 기술의 한 종류로, 프로세스 간 통신(IPC)에서 공유 메모리를 이용하여 데이터를 전달하거나, 여러 프로세스가 공통으로 사용해야 하는 데이터를 저장하는 데 사용됩니다.
    • 대규모 분산 시스템에서는 Redis보다는 사용 빈도가 낮습니다.
    • 다수의 클라이언트가 동시에 접근하는 경우에는 Redis보다는 부적합합니다.
    • Shared memory는 프로세스 간 통신(IPC)을 위한 기술 중 하나이며, 따라서 클라이언트-서버 모델을 사용하여 데이터를 공유하는 Redis와는 차이가 있습니다.
  • 따라서, Redis와 shared memory는 모두 데이터를 저장하는 기술이지만, 기본적인 동작 방식에서 차이가 있습니다.

  • Redis는 인메모리 데이터 저장소로, 클라이언트-서버 모델을 사용하여 데이터를 공유합니다.

  • 반면, shared memory는 여러 프로세스가 공유할 수 있는 메모리 영역을 제공하는 기술로, IPC 기술 중 하나입니다.

  • Shared Memory는 프로세스 간의 통신을 위해 네트워크 통신을 사용하지 않으며, 동일한 컴퓨터에서 실행되는 프로세스 간에만 사용됩니다.

  • Shared Memory는 운영체제에서 제공하는 시스템 콜(System Call)을 사용하여 공유 메모리 영역을 생성하고, 여러 프로세스가 이 영역을 참조할 수 있도록 합니다.

  • 이 때, 프로세스는 일반적인 메모리 접근 방식으로 공유 메모리 영역을 읽거나 쓸 수 있습니다.

  • 또한, Shared Memory는 메모리 영역을 물리적인 주소 공간에서 공유하기 때문에 빠른 속도를 제공합니다.

  • 이는 Shared Memory가 프로세스 간 데이터 공유 시에 매우 효율적으로 동작하는 이유 중 하나입니다.

  • 그러나 Shared Memory를 사용할 때는 데이터 동기화 문제에 대한 고려가 필요합니다.

  • 여러 프로세스가 공유 메모리 영역에 접근하면서 동시에 데이터를 읽거나 쓸 때, 데이터 일관성을 유지하기 위해 동기화 작업이 필요합니다.

  • 이를 위해 Locking 등의 동기화 기술을 사용할 수 있습니다.

  • 또한, Shared Memory는 데이터 공유를 위해 물리적인 메모리 공간을 공유하기 때문에, 보안 이슈에 대한 고려가 필요합니다.

  • Shared Memory를 사용할 때는 보안을 위해 권한 설정 등의 작업이 필요할 수 있습니다.

  • 요약하면, Shared Memory는 IPC의 한 형태로, 여러 프로세스가 동시에 메모리 공간을 공유하여 데이터를 공유하는 기술입니다.

  • 이는 네트워크 통신을 사용하지 않으며, 빠른 속도를 제공합니다.

  • 그러나 데이터 동기화 문제와 보안 이슈에 대한 고려가 필요합니다.


Redis 장점

  • 높은 성능
    • Redis는 메모리 내에서 작동하므로 데이터베이스 쿼리를 빠르게 처리할 수 있습니다.
    • 데이터를 디스크에 저장하지 않기 때문에 I/O 부하가 없습니다.
  • 다양한 데이터 구조
    • Redis는 string, list, 해시, set 등 다양한 데이터 구조를 지원합니다.
    • 이러한 데이터 구조들은 고성능 캐시, 메시징 대기열, 세션 저장소 등으로 사용됩니다.
  • 확장성
    • Redis는 수평 확장에 용이합니다.
    • Redis 클러스터는 여러 대의 서버에 데이터를 분산하여 저장하며, 이를 통해 처리량을 높일 수 있음
  • 편리한 운영
    • Redis는 대부분의 운영 체제와 호환되며, 편리한 모니터링 및 관리 도구가 제공됩니다.

Redis 단점

  • 메모리 한계

    • Redis는 메모리에 데이터를 저장하기 때문에, 데이터의 크기가 메모리 용량보다 큰 경우 문제가 발생할 수 있습니다.
  • 데이터 영속성

    • Redis는 메모리에서 작동하므로, 서버가 종료될 때 데이터를 영속적으로 저장하지 않는 한 데이터가 손실될 수 있습니다.
    • 하지만 Redis는 스냅샷, AOF 등의 방법으로 데이터를 디스크에 영속적으로 저장할 수 있습니다.
  • 높은 부하

    • Redis는 고성능을 보장하기 위해 매우 빠른 속도로 데이터를 처리하므로, 과도한 부하가 발생할 수 있습니다.
    • 따라서 Redis 서버를 선정할 때 적절한 하드웨어 및 운영 체제를 선택해야 합니다.
  • 설계한 목적에 따라서는 다른 솔루션을 선택해야 할 수도 있습니다.

    • 예를 들어, 관계형 데이터베이스에서는 SQL 쿼리 기능을 제공하기 때문에 Redis보다 유연한 데이터 조작이 가능합니다.

Python redis

  • Python Redis를 사용하려면 먼저 Redis 서버가 설치되어 있어야 합니다.
  • 그런 다음 Python Redis를 설치하고, Redis 서버와 연결하여 작업을 수행할 수 있습니다.
pip install redis

사용법

redis 클라이언트가 서버에 연결

import redis

redis_host = "localhost"
redis_port = 6379
redis_password = ""

# Redis 클라이언트 생성
r = redis.Redis(host=redis_host, port=redis_port, password=redis_password)

# 연결 테스트
r.ping()

redis에 data 추가, 조회, 삭제

# Redis 데이터 추가
r.set("key1", "value1")
# Redis 데이터 조회
value = r.get("key1")
print(value)
# Redis 데이터 삭제
r.delete("key1")
  • 이외에도 Redis에는 여러 가지 데이터 구조가 있으며, Python Redis는 이러한 데이터 구조를 사용하는 방법도 제공. 예는 아래에 있음. 이러한 메서드는 Redis 데이터 구조를 Python에서 직접 조작할 수 있도록 해줍니다.
    • Redis에서 리스트를 사용하려면 lpush()lrange() 메서드를 사용
    • Redis에서 집합을 사용하려면 sadd()smembers() 메서드를 사용
profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글