Redis: 확장성이 뛰어난 시스템을 구축하기 위한 강력한 도구

王林
풀어 주다: 2023-11-07 10:45:20
원래의
724명이 탐색했습니다.

Redis: 확장성이 뛰어난 시스템을 구축하기 위한 강력한 도구

Redis: 확장성이 뛰어난 시스템을 구축하기 위한 강력한 도구이며 특정 코드 예제가 필요합니다.

Redis는 메시지 대기열 및 캐시 데이터베이스로도 사용할 수 있는 오픈 소스 인메모리 데이터 구조 스토리지 시스템입니다. 이는 확장성이 뛰어난 시스템을 구축하는 데 도움이 되는 강력한 도구입니다. 이 문서에서는 Redis의 몇 가지 일반적인 기능과 해당 구현 코드를 소개합니다.

  1. Sentinel Mode

Redis의 Sentinel 모드는 고가용성을 달성하는 데 도움이 될 수 있습니다. 마스터 노드가 다운되면 Sentinel은 자동으로 새 마스터 노드를 선택할 수 있습니다. 다음은 간단한 감시 모드 구현 예입니다.

구성 파일:

sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
로그인 후 복사

Code:

# 使用redis-py实现哨兵模式
import redis

sentinel = redis.RedisSentinel(
    [('127.0.0.1', 26379)],
    socket_timeout=0.1,
)

redis_master = sentinel.master_for('mymaster', socket_timeout=0.1)
redis_slave = sentinel.slave_for('mymaster', socket_timeout=0.1)

redis_master.set('key', 'value')
print(redis_slave.get('key'))
로그인 후 복사
  1. 분산 잠금

분산 시스템에서 동시성 문제를 방지하려면 분산 잠금을 사용하여 공유를 제어해야 합니다. 리소스에 대한 액세스. Redis는 SETNX 및 GETSET 명령을 통해 분산 잠금을 구현할 수 있습니다. 다음은 Redis 분산 잠금 구현의 간단한 예입니다.

Code:

import redis

class RedisLock(object):
    def __init__(self, name, acquire_timeout=10, expire_time=60):
        self.redis = redis.Redis()
        self.name = 'redis_lock_key_{}'.format(name)
        self.acquire_timeout = acquire_timeout
        self.expire_time = expire_time

    def acquire_lock(self):
        start_time = time.time()
        while True:
            end_time = time.time()
            if self.redis.setnx(self.name, 1):
                self.redis.expire(self.name, self.expire_time)
                return True
            elif end_time - start_time > self.acquire_timeout:
                return False
            time.sleep(0.1)

    def release_lock(self):
        self.redis.delete(self.name)
        
redis_lock = RedisLock('test')
if redis_lock.acquire_lock():
    try:
        # 操作共享资源
        pass
    finally:
        redis_lock.release_lock()
로그인 후 복사
  1. Publish/Subscribe Mode

Redis의 게시/구독 모드를 사용하면 여러 클라이언트가 채널을 통해 실시간으로 통신할 수 있습니다. 다음은 게시/구독 패턴의 간단한 구현 예입니다.

Code:

import redis
import threading

def subscribe_channel(redis, channel):
    pub_sub = redis.pubsub()
    pub_sub.subscribe(channel)
    for message in pub_sub.listen():
        print(message)

redis_sub = redis.StrictRedis(decode_responses=True)
redis_pub = redis.StrictRedis(decode_responses=True)

redis_thread = threading.Thread(target=subscribe_channel, args=(redis_sub, 'test_channel'))
redis_thread.start()

redis_pub.publish('test_channel', 'Hello, Redis!')
로그인 후 복사
  1. Lua script

Redis는 원자적이고 Redis에서 효율적으로 실행될 수 있는 Lua 스크립트를 실행하여 복잡한 작업을 지원합니다. 다음은 간단한 Lua 스크립트 구현 예입니다.

코드:

import redis

redis_client = redis.Redis()

add_script = redis_client.register_script("""
    local current_value = redis.call('get', KEYS[1])
    current_value = tonumber(current_value) or 0
    current_value = current_value + tonumber(ARGV[1])
    redis.call('set', KEYS[1], current_value)
    return current_value
""")

add_script(keys=['test_lua_key'], args=[1])
로그인 후 복사

Summary

이 문서에서는 Redis의 네 가지 공통 기능을 소개하고 해당 코드 예제를 제공합니다. Sentinel 모드와 분산 잠금은 고가용성 및 동시성 제어를 달성하는 데 도움이 될 수 있으며 게시/구독 모드는 실시간 통신을 달성하는 데 도움이 될 수 있으며 Lua 스크립트는 복잡한 작업을 구현하는 데 도움이 될 수 있습니다. Redis의 이러한 기능을 학습함으로써 확장성이 뛰어난 시스템을 더 효과적으로 구축할 수 있습니다.

위 내용은 Redis: 확장성이 뛰어난 시스템을 구축하기 위한 강력한 도구의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿