>  기사  >  PHP 프레임워크  >  Redis의 핵심 데이터 유형 이해

Redis의 핵심 데이터 유형 이해

coldplay.xixi
coldplay.xixi앞으로
2020-07-03 17:20:102713검색

Redis의 일반 문자열은 원래 인코딩 방법인 원시 인코딩을 사용합니다. 이 인코딩 방법은 중복 공간을 미리 동적으로 확장하고 사전 할당하여 빈번한 메모리 할당에 따른 오버헤드를 줄입니다. Redis의 핵심 데이터 유형 이해

문자열 길이가 1MB 미만인 경우 필요한 길이의 2배로 할당됩니다. 1MB를 초과하는 경우 매번 용량을 1MB씩 늘려서 사전 할당됩니다.

Redis의 숫자도 문자열 형식으로 저장되지만 인코딩 방법이 일반 문자열과 다릅니다. 숫자는 정수 인코딩을 사용하며 문자열 내용은 직접 설정됩니다. 정수 값의 이진 바이트 시퀀스입니다.

일반 문자열, 직렬화된 개체, 카운터 및 기타 시나리오를 저장할 때 Redis 문자열 유형을 사용할 수 있습니다. 문자열 데이터 유형에 해당하는 명령에는 set, get, mset, incr, decr 등이 포함됩니다.

tring 类型是二进制安全的,即 string 中可以包含任何数据。

Redis 中的普通 string 采用 raw encoding 即原始编码方式,该编码方式会动态扩容,并通过提前预分配冗余空间,来减少内存频繁分配的开销。

在字符串长度小于 1MB 时,按所需长度的 2 倍来分配,超过 1MB,则按照每次额外增加 1MB 的容量来预分配。

Redis 中的数字也存为 string 类型,但编码方式跟普通 string 不同,数字采用整型编码,字符串内容直接设为整数值的二进制字节序列

在存储普通字符串,序列化对象,以及计数器等场景时,都可以使用 Redis 的字符串类型,字符串数据类型对应使用的指令包括 set、get、mset、incr、decr 等。

list 列表

list 列表,是一个快速双向链表,存储了一系列的 string 类型的字串值

对于常规的 pop、push 元素,性能很高,时间复杂度为 O(1),因为是列表直接追加或弹出。但对于通过随机插入、随机删除,以及随机范围获取,需要轮询列表确定位置,性能就比较低下了。

操作 list 列表时,可以用 lpush、lpop、rpush、rpop、lrange 来进行常规的队列进出及范围获取操作,在某些特殊场景下,也可以用 lset、linsert 进行随机插入操作,用 lrem 进行指定元素删除操作;最后,在消息列表的消费时,还可以用 Blpop、Brpop 进行阻塞式获取,从而在列表暂时没有元素时,可以安静的等待新元素的插入,而不需要额外持续的查询。

set 集合

set 是 string 类型的无序集合,set 中的元素是唯一的,即 set 中不会出现重复的元素。Redis 中的集合一般是通过 dict 哈希表实现的,所以插入、删除,以及查询元素,可以根据元素 hash 值直接定位,时间复杂度为 O(1)。

操作

  • sismember 指令判断该 key 对应的 set 数据结构中,是否存在某个元素,如果存在返回 1,否则返回 0;

  • sdiff 指令来对多个 set 集合执行差集;

  • sinter 指令对多个集合执行交集;

  • sunion 指令对多个集合执行并集;

  • spop 指令弹出一个随机元素;

  • srandmember 指令返回一个或多个随机元素。

在社交系统中,可以用于存储关注的好友列表,用来判断是否关注,还可以用来做好友推荐使用。另外,还可以利用 set 的唯一性,来对服务的来源业务、来源 IP 进行精确统计。

sorted set 有序集合

有序集合中,每个元素都会关联一个 double 类型的 score 分数值。有序集合通过这个 score 值进行由小到大的排序。有序集合中,元素不允许重复,但 score 分数值却允许重复。

操作

  • zscan 指令:按顺序获取有序集合中的元素;

  • zscore 指令:获取元素的 score 值;

  • zrange指令:通过指定 score 返回指定 score 范围内的元素;

  • 在某个元素的 score 值发生变更时,还可以通过 zincrby 指令对该元素的 score 值进行加减。

  • 通过 zinterstore、zunionstore

  • list list

list list는 문자열 유형의 일련의 문자열 값을 저장하는 빠른 이중 연결 목록입니다.

일반 팝 및 push 요소는 목록을 직접 추가하거나 팝하기 때문에 성능이 매우 높으며 시간 복잡도는 O(1)입니다. 그러나 무작위 삽입, 무작위 삭제, 무작위 범위 획득의 경우 목록을 폴링하여 위치를 결정해야 하며 성능이 상대적으로 낮습니다. 목록을 조작할 때 lpush, lpop, rpush, rpop 및 lrange를 사용하여 일반 대기열 입력 및 종료 및 범위 획득 작업을 수행할 수 있습니다. 일부 특수 시나리오에서는 lset 및 linsert를 사용하여 무작위 삽입 작업을 수행할 수도 있습니다. 및 lrem을 사용하여 작업을 수행합니다. 마지막으로 메시지 목록을 사용할 때 Blpop 및 Brpop을 사용하여 획득을 차단할 수도 있습니다. 그러면 목록에 일시적으로 요소가 없을 때 새 항목이 삽입될 때까지 조용히 기다릴 수 있습니다. 추가 연속 쿼리가 필요 없는 요소입니다.

🎜set set 🎜🎜set는 순서가 지정되지 않은 문자열 유형의 집합입니다. 즉, 집합에 중복된 요소가 없습니다. Redis의 컬렉션은 일반적으로 dict 해시 테이블을 통해 구현되므로 삽입, 삭제, 쿼리 요소를 요소 해시 값을 기준으로 직접 찾을 수 있으며 시간 복잡도는 O(1)입니다. 🎜
🎜Operation🎜
  • 🎜sismember 명령어는 설정된 데이터 구조에 키에 해당하는 요소가 있는지 확인합니다. 존재하는 경우 1을 반환합니다. , 그렇지 않으면 0을 반환합니다. 🎜🎜
  • 🎜sdiff 다중 집합 컬렉션에서 차이 집합을 수행하는 명령 🎜🎜
  • 🎜sinter 다중 집합에서 교차를 수행하는 명령 🎜 🎜
  • 🎜sunion 명령은 여러 집합의 결합을 수행합니다. 🎜🎜
  • 🎜spop 명령은 임의의 요소를 표시합니다. li>🎜srandmember 지시문은 하나 이상의 임의 요소를 반환합니다. 🎜🎜🎜🎜소셜 시스템에서는 내가 팔로우하는 친구 목록을 저장하고 팔로우 여부를 결정하는 데 사용될 수 있으며 친구 추천을 하는 데에도 사용될 수 있습니다. 강하다>. 또한, 세트의 고유성을 활용하여 서비스의 소스 비즈니스 및 소스 IP에 대한 정확한 통계를 수행할 수도 있습니다. 🎜🎜🎜🎜sorted set Ordered set🎜🎜에서 각 요소는 이중 유형 점수 값과 연결됩니다. 정렬된 집합은 이 점수 값에 따라 작은 것부터 큰 것 순으로 정렬됩니다. Ordered Set에서는 요소의 반복은 허용되지 않지만, 점수 값의 반복은 허용됩니다. 🎜
    🎜Operation🎜
    • 🎜zscan 명령: 정렬된 세트의 요소를 순서대로 가져옵니다. 🎜🎜
    • 🎜zscore code> 명령어: 요소의 점수 값을 가져옵니다. 🎜🎜<li>🎜<code>zrange 명령어: 점수를 지정하여 지정된 점수 범위 내의 요소를 반환합니다. 요소의 변경 사항이 발생하면 아연rby 명령을 통해 요소의 점수 값을 더하거나 뺄 수도 있습니다. 🎜🎜
    • 🎜zinterstore, zunionstore 명령을 사용하여 여러 순서 집합을 교차하고 통합한 다음 새 순서 집합을 새 키에 저장합니다. 중복 요소가 있는 경우 반복 요소의 점수는 다음과 같습니다. 추가된 후 새 세트에 있는 요소의 점수 값으로 사용됩니다. 🎜🎜🎜🎜주문된 컬렉션을 사용하여 실시간으로 순위를 계산하고 순위를 새로 고칠 수 있으며, 학생 점수를 기록하여 특정 점수 범위 내의 학생 목록을 쉽게 추가하는 데에도 사용할 수 있습니다. 시스템 통계에 가중치가 실시간으로 표시됩니다. 🎜🎜🎜🎜해시 해시🎜🎜짧음🎜

      bitmap

      비트맵은 일련의 연속적인 이진수입니다. 기본 레이어는 실제로 string을 기반으로 캡슐화되어 저장됩니다. string 进行封装存储的

      按 bit 位进行指令操作的。bitmap 中每一 bit 位所在的位置就是 offset 偏移,可以用 setbit、bitfield 对 bitmap 中每个 bit 进行置 0 或置 1 操作,也可以用 bitcount 来统计 bitmap 中的被置 1 的 bit 数,还可以用 bitop 来对多个 bitmap 进行求与、或、异或等操作。

      Redis 笔记

      bitmap 位图的特点是按位设置、求与、求或等操作很高效,而且存储成本非常低,用来存对象标签属性的话,一个 bit 即可存一个标签。可以用 bitmap,存用户最近 N 天的登录情况,每天用 1 bit,登录则置 1。

      个性推荐在社交应用中非常重要,可以对新闻、feed 设置一系列标签,如军事、娱乐、视频、图片、文字等,用 bitmap 来存储这些标签,在对应标签 bit 位上置 1。对用户,也可以采用类似方式,记录用户的多种属性,并可以很方便的根据标签来进行多维度统计。bitmap 位图的重要指令包括:setbit、 getbit、bitcount、bitfield、 bitop、bitpos 等。

      使用经历

      统计用户登录情况 : 1 2 3 5 天内登录
      bitmap : 1 1 1 0 1

      GEO 地理位置

      在存储某个位置点时,首先利用 Geohash 算法,将该位置二维的经纬度,映射编码成一维的 52 位整数值,将位置名称、经纬度编码 score 作为键值对,存储到分类 key 对应的 sorted set 中。

      需要计算某个位置点 A 附近的人时,首先以指定位置 A 为中心点,以距离作为半径,算出 GEO 哈希 8 个方位的范围, 然后依次轮询方位范围内的所有位置点,只要这些位置点到中心位置 A 的距离在要求距离范围内,就是目标位置点。轮询完所有范围内的位置点后,重新排序即得到位置点 A 附近的所有目标。

      使用 geoadd,将位置名称(如人、车辆、店名)与对应的地理位置信息添加到指定的位置分类 key 中;

      使用 geopos 方便地查询某个名称所在的位置信息;

      使用 georadius 获取指定位置附近,不超过指定距离的所有元素;

      Redis GEO 地理位置,利用 Geohash 将大量的二维经纬度转一维的整数值,这样可以方便的对地理位置进行查询、距离测量、范围搜索。但由于地理位置点非常多,一个地理分类 key 下可能会有大量元素,在 GEO 设计时,需要提前进行规划,避免单 key 过度膨胀。

      Redis 的 GEO 地理位置数据结构,应用场景很多,比如查询某个地方的具体位置,查当前位置到目的地的距离,查附近的人、餐厅、电影院等。GEO 地理位置数据结构中,重要指令包括 geoadd、geopos、geodist、georadius、georadiusbymember 等。

      使用 geodist 来获取指定的两个位置之间的距离。

      hyperLogLog 基数统计

      hyperLogLog

      명령 작업은 비트 비트를 기반으로 수행됩니다. 비트맵의 각 비트 위치는 오프셋입니다. setbit 및 bitfield를 사용하여 비트맵의 각 비트에 대해 0 또는 1을 설정할 수 있습니다. 또한 bitcount를 사용하여 비트맵에서 1로 설정된 비트 수를 계산할 수도 있습니다. 또한 bitcount를 사용하여 비트맵에서 1로 설정된 비트 수를 계산할 수 있습니다. bitop을 사용하여 여러 비트맵에 대해 AND, OR, XOR 등과 같은 작업을 수행할 수 있습니다.

      Redis Notes

      비트맵 비트맵의 특징은 비트별 설정, AND, OR 등의 연산이 매우 효율적이며, 객체 라벨 속성을 저장하는 데 사용하면 1비트가 하나의 라벨을 저장할 수 있다는 것입니다. 비트맵을 사용하면 지난 N일 동안의 사용자 로그인 상태를 매일 1비트를 사용하고 로그인할 때 1로 설정하여 저장할 수 있습니다.

      개인화된 추천은 소셜 애플리케이션에서 매우 중요합니다. 군대, 엔터테인먼트, 비디오, 사진, 텍스트 등과 같은 뉴스 및 피드에 대한 일련의 태그를 설정할 수 있습니다. 비트맵을 사용하여 이러한 태그를 저장하고 해당 태그 비트를 1. 사용자의 경우 유사한 방법을 사용하여 사용자의 여러 속성을 기록할 수 있으며 태그를 기반으로 다차원 통계를 쉽게 수행할 수 있습니다. 비트맵 비트맵에 대한 중요한 지침에는 setbit, getbit, bitcount, bitfield, bitop, bitpos 등이 포함됩니다.

      사용 경험

      통계적인 사용자 로그인 상태: 1 2 3 5일 이내 로그인
      비트맵: 1 1 1 0 1🎜🎜🎜🎜GEO Geolocation🎜🎜특정 위치 포인트를 저장할 때 먼저 사용Geohash
    • 알고리즘은 위치의 2차원 경도와 위도를 1차원 52비트 정수 값으로 매핑하고 인코딩합니다. 위치 이름과 경도 및 위도 인코딩 점수는 키-값 쌍으로 사용되어 저장됩니다. 분류 키에 해당하는 정렬된 집합입니다. 🎜🎜특정 위치 A 지점 근처의 사람들을 계산해야 하는 경우 먼저 지정된 위치 A를 중심점으로 사용하고 거리를 반경으로 사용하여 GEO 해시의 8 방위각 범위를 계산한 다음 모든 위치 지점을 폴링합니다. 순서대로 방위각 범위 내에서 이 위치 지점과 중심 위치 A 사이의 거리가 필요한 거리 범위 내에 있으면 목표 위치 지점입니다. 범위 내의 모든 위치 포인트를 폴링한 후 위치 포인트 A 근처의 모든 타겟을 얻기 위해 재정렬합니다. 🎜🎜geoadd를 사용하여 위치 이름(예: 사람, 차량, 상점 이름) 및 해당 지리적 위치 정보를 지정된 위치 분류 키에 추가하세요. 🎜🎜gepos를 사용하여 특정 이름의 위치 정보를 쉽게 쿼리할 수 있습니다. 지정된 위치 근처에 있고 지정된 거리를 초과하지 않는 모든 요소 🎜🎜Redis GEO 지리적 위치, Geohash를 사용하여 수많은 2차원 경도 및 위도를 1차원 정수 값으로 변환하여 지리적 위치를 편리하게 쿼리할 수 있습니다. , 거리 측정 및 검색 범위 . 그러나 지리적 지점의 수가 많기 때문에 하나의 지리적 분류 키 아래에 많은 수의 요소가 있을 수 있습니다. GEO를 설계할 때 단일 키가 과도하게 확장되지 않도록 미리 계획해야 합니다. 🎜🎜Redis의 GEO 지리적 위치 데이터 구조에는 장소의 특정 위치 쿼리, 현재 위치에서 목적지까지의 거리 확인, 근처 사람, 레스토랑, 영화관 확인 등 다양한 응용 시나리오가 있습니다. GEO 지리적 위치 데이터 구조에서 중요한 지침에는 geoadd, geopos, geodist, georadius, georadiusbymember 등이 포함됩니다. 🎜🎜지오디스트를 사용하여 지정된 두 위치 사이의 거리를 알아보세요. 🎜🎜🎜🎜hyperLogLog 카디널리티 통계🎜🎜hyperLogLog는 카디널리티 통계에 사용되는 데이터 유형으로, 통계를 위해 수많은 요소가 입력될 때 이를 완료하는 데 약간의 메모리만 필요합니다. HyperLogLog는 메타데이터를 저장하지 않고 계산할 예상 요소 수만 기록합니다. 이 예상 수치는 표준 편차 0.81%의 근사치입니다. 대부분의 비즈니스 시나리오에서 대규모 데이터의 경우 1% 미만의 오류가 허용됩니다. . 🎜🎜Redis의 HyperLogLog는 개수가 많지 않은 경우 계산 시 희소 행렬 저장소를 사용합니다. 개수가 증가함에 따라 희소 행렬이 차지하는 공간이 점차 증가하여 임계값을 초과하면 조밀한 행렬로 변경됩니다. . 조밀한 매트릭스 점유 공간은 약 12KB 바이트로 고정되어 있습니다. 🎜🎜hyperLoglog 데이터 유형을 통해 pfadd를 사용하여 카디널리티 통계에 새 요소를 추가할 수 있고, pfcount를 사용하여 hyperLogLog 구조에 저장된 대략적인 기수 수를 얻을 수 있으며, hypermerge를 사용하여 여러 hyperLogLog를 하나의 hyperLogLog 구조로 인해 편리합니다. 결합된 기본 번호를 가져옵니다. 🎜🎜hyperLogLog의 특징은 통계 과정이 독립적인 요소를 기록하지 않고, 메모리를 거의 차지하지 않으며, 대용량 데이터를 계산하는 데 매우 적합하다는 것입니다. 대규모 및 중간 규모 시스템에서는 hyperLogLog 데이터 유형을 사용하여 일별 또는 월별 고유 방문자 수를 계산하거나 많은 수의 사용자가 검색한 독립적인 용어 수를 계산할 수 있습니다.​​ 🎜🎜🎜관련 학습 권장 사항: 🎜Laravel ​ 🎜 🎜🎜

위 내용은 Redis의 핵심 데이터 유형 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제