>  기사  >  백엔드 개발  >  Redis에서 고유 계산을 구현하는 3가지 방법

Redis에서 고유 계산을 구현하는 3가지 방법

高洛峰
高洛峰원래의
2017-02-08 09:39:572163검색

고유 계산은 웹사이트 시스템에서 매우 일반적인 기능입니다. 예를 들어 웹사이트는 매일 방문하는 고유 방문자 수(UV라고도 함)를 계산해야 합니다. 계산 문제는 매우 일반적이지만 해결하기가 매우 복잡할 수 있습니다. 첫째, 계산해야 하는 양이 매우 클 수 있습니다. 예를 들어 매일 수백만 명의 사람들이 대규모 사이트를 방문하고 데이터의 양은 둘째, 일반적으로 계산 차원을 확장하는 것이 바람직합니다. 예를 들어 일일 UV 외에도 주간 또는 월간 UV도 알고 싶어하므로 계산이 매우 복잡해집니다.

관계형 데이터베이스 저장 시스템에서 고유한 계산을 수행하는 방법은 select count(distinct 9582cf303f30b9f4319d93f9b5ae353f)입니다. 매우 간단하지만 데이터 양이 많은 경우 이 문을 실행하는 방법은 다음과 같습니다. 매우 느립니다. 관계형 데이터베이스를 사용할 때의 또 다른 문제점은 데이터 삽입 성능이 높지 않다는 것입니다.

Redis는 이러한 종류의 계산 문제를 매우 쉽게 해결하며, 관계형 데이터베이스보다 더 빠르고 리소스도 덜 소모합니다.

1. 집합 기반 집합

Redis는 고유한 데이터 컬렉션을 저장하는 데 사용됩니다. 이를 통해 집합에 요소가 존재하는지 빠르게 확인할 수 있으며, 계산도 빠르게 수행할 수 있습니다. 특정 숫자의 요소와 그 합계를 새로운 세트로 병합할 수 있습니다. 관련된 명령은 다음과 같습니다.

SISMEMBER key member  # 判断 member 是否存在
SADD key member  # 往集合中加入 member
SCARD key   # 获取集合元素个数

집합 기반 방법은 간단하고 효과적이며, 정확한 계산과 폭넓은 적용이 가능하며, 리소스를 많이 소모한다는 단점이 있습니다(물론). 관계형 데이터베이스보다 훨씬 적습니다.) 요소 수가 매우 크고(예: 수억 개) 메모리 소비가 끔찍한 경우입니다.

2. 비트 기반 비트

Redis는 설정된 메모리보다 더 압축된 계산을 구현하는 데 사용할 수 있습니다. 요소 존재 여부에 대한 정보를 저장하기 위해 비트 1 또는 0을 사용합니다. 예를 들어, 웹 사이트의 순 방문자 수를 계산하려면 user_id를 비트의 오프셋으로 사용하여 액세스를 나타낼 수 있으며, 1MB의 공간을 사용하여 800만 이상의 일일 액세스 횟수를 저장할 수 있습니다. 사용자. 관련된 명령은 다음과 같습니다.

SETBIT key offset value  # 设置位信息
GETBIT key offset        # 获取位信息
BITCOUNT key [start end] # 计数
BITOP operation destkey key [key ...]  # 位图合并

비트 기반 방식은 set 방식에 비해 훨씬 적은 공간을 차지하지만 요소를 단순히 비트 오프셋에 매핑할 수 있어야 하며 적용 가능한 범위가 훨씬 좁습니다. 또한, 카운트 값에 관계없이 최대 오프셋에 따라 많은 공간을 소모합니다. 최대 오프셋이 크면 메모리 소모도 상당합니다.

3. HyperLogLog

기반으로 엄청나게 많은 양의 데이터에 대해 정확한 고유 계산을 달성하는 것은 어렵지만, 단지 근사치에 불과하다면 컴퓨팅 과학에는 효율적인 알고리즘이 많이 있습니다. HyperLogLog Counting은 그 중 하나입니다. 매우 유명한 알고리즘으로 약 12K의 메모리만 사용하여 수억 개의 고유 카운트를 달성할 수 있으며 오류는 약 1%로 제어됩니다. 관련된 명령은 다음과 같습니다.

PFADD key element [element ...]  # 加入元素
PFCOUNT key [key ...]   # 计数

이 계산 방법은 정말 마술적이며 아직 완전히 이해하지 못했습니다. 관심이 있으시면 관련 기사를 깊이 공부할 수 있습니다.

redis에서 제공하는 세 가지 고유한 계산 방법은 각각 장점과 단점이 있으며 다양한 상황에서 계산 요구 사항을 완전히 충족할 수 있습니다.

Redis에서 고유 계산을 구현하는 3가지 방법과 관련 기사를 공유하려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.