> 시스템 튜토리얼 > 리눅스 > Redis의 내부 작동 메커니즘에 대한 자세한 설명

Redis의 내부 작동 메커니즘에 대한 자세한 설명

WBOY
풀어 주다: 2024-03-10 09:13:09
앞으로
517명이 탐색했습니다.

Redis의 내부 작동 메커니즘에 대한 자세한 설명

Redis 데이터베이스(Redis가 데이터베이스를 표현하는 방법 및 데이터베이스 작업이 구현되는 방법)

Redis 서버가 초기화되면 redis.h/REDIS_DEFAULT_DBNUM(이하 N으로 약칭) 데이터베이스가 생성되며, 데이터베이스 ID는 0부터 N-1까지입니다. 모든 데이터베이스는 redis.h/redisServer.db 배열에 저장됩니다. .

클라이언트 측에서는 "SELECT" 명령을 통해 전환할 수 있습니다. 프로그램은 redis.h/redisServer.db[number]를 사용하여 직접 전환합니다. 그러나 AOF 프로그램, 복제 프로그램, RDB 프로그램 등 일부 내부 프로그램은 현재 데이터베이스의 번호를 알아야 합니다. id 필드가 없으면 프로그램은 현재 사용되는 데이터베이스와 redisServer의 모든 데이터베이스만 가리킬 수 있습니다. .db 배열. 포인터를 비교하여 사용 중인 데이터베이스를 알아보세요.

Redis 데이터베이스 구조:
으아악
데이터베이스 추가, 삭제, 수정, 쿼리 및 기타 작업을 위한 Redis 키 공간 작업:

새로운 내용:
Redis는 키-값 쌍을 키 공간 사전에 추가합니다. 여기서 키는 문자열이고 값은 모든 값 유형입니다.
삭제:
Redis는 키 공간 사전에 있는 해당 키의 키-값 쌍을 삭제합니다
업데이트:
Redis는 키 공간 사전의 이전 키에 해당하는 값 개체를 해제하고 키가 새 값 개체를 가리키도록 합니다
문의:
Redis는 키 공간 사전에서 해당 키의 값 개체를 쿼리합니다.
키가 존재하지 않습니다. NULL을 반환합니다
키가 존재하고 올바른 유형이므로 올바른 값을 반환합니다
키가 존재하지만 유형이 잘못되었으며 반환 유형이 잘못되었습니다
기타 작업:
위에 표시된 키 값 작업 외에도 데이터베이스 자체에 대한 많은 명령이 있으며 키 공간을 처리하여 완료됩니다.
FLUSHDB 키스페이스의 모든 키-값 쌍 삭제
RANDOMKEY 키 공간에서 임의의 키를 반환합니다
DBSIZE 키 공간에 있는 키-값 쌍의 수를 반환합니다
있음                                                                                                                                          주어진 키가 키 공간에 존재하는지 확인하세요
RENAME 키 공간에서 주어진 키의 이름을 바꿉니다

키 만료 시간

Redis 데이터베이스에서 모든 키의 만료 시간은 RedisDb 구조의 만료 사전에 저장됩니다. 여기서 키는 dict 사전(키 공간)의 키에 대한 포인터이고 값은 수정된 만료 시간입니다. long long 유형 표현을 사용합니다.

Redis에는 키의 생존 시간(키가 생존할 수 있는 기간)과 만료 시간(만료되는 시점)을 설정하는 네 가지 명령이 있습니다.
EXPIRE는 키의 수명을 초 단위로 설정합니다.
PEXPIRE는 키의 수명을 밀리초 단위로 설정합니다.
EXPIREAT는 키의 만료 UNIX 타임스탬프를 초 단위로 설정합니다. PEXPIREAT 키의 만료 UNIX 타임스탬프를 밀리초 단위로 설정합니다.

다양한 단위와 다양한 형태의 설정 방법이 있지만,expires 사전의 값은 "만료된 UNIX 타임스탬프(밀리초 단위)"만 저장합니다. 즉, 변환하면 결국 모든 명령의 효과가 PEXPIREAT와 동일해집니다. 명령의 효과는 동일합니다.

만료된 키 제거

定时清除:
在创建KEY的时候创建一个定时任务,在KEY到期时定时任务会被触发,第一时间清除过期KEY。
此种操作对内存最友好,不会有垃圾数据占用内存情况存在
缺点是会造成很大的服务器负载,特别是CPU负载高的时候,CPU很大一部分负载用在了删除不必要的KEY上了

惰性清除:
放任键空间的键不管,每次查询KEY的时候先去校验KEY是否过期,过期则删除,不过期则正常返回相应的VALUE。
此种操作对CPU最友好,这种策略仅限于当前KEY,相关不必要的KEY不会造成CPU负载
缺点是:容易造成内存空间浪费,特别是当系统中存在大量过期KEY且很少被用到,这十分影响非常依赖于内存大小Redis的性能

定期删除:
由定时脚本cron定时对expires的键扫描判断是否有过期的KEY存在,如存在,将其删除掉。
这是一种折中方案,既不会过多消耗CPU,又可以定时清楚惰性删除忽略到的不必要的内存消耗

Redis采用的“惰性清除”和“定期清楚”相结合的方式,其中定期删除模式是在规定的时间限制内,尽 可能地遍历各个数据库的 expires 字典,随机地检查一部分键的过期时间,并删除其中的过期键。

伪代码如下:

def activeExpireCycle():
# 遍历数据库(不一定能全部都遍历完,看时间是否足够)
for db in server.db:
# MAX_KEY_PER_DB 是一个 DB 最大能处理的 key 个数 # 它保证时间不会全部用在个别的 DB 上(避免饥饿) i=0                                    while (i 
<p>Redis 过期键删除的主从同步问题(Redis的机制是由主节点统一控制)</p>
<p>如果服务器是主节点,当它删除一个过期键之后,会显式的向所有附属节点发送一条DEL命令<br>
如果服务器是附属节点,当它判断到当前KEY已经过期,会将该键过期的消息发送给主服务器,主服务器删除后向所有的从服务器节点发送DEL命令。</p>
<p>从服务器节点不自主的对键进行删除是为了保持和主服务器数据的绝对一致性,即当一个过期键还存在主服务器上,这个键在所有的从服务器上也不会被删除。</p>
로그인 후 복사

위 내용은 Redis의 내부 작동 메커니즘에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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