Redis의 일반 문자열은 원래 인코딩 방법인 원시 인코딩을 사용합니다. 이 인코딩 방법은 중복 공간을 미리 동적으로 확장하고 사전 할당하여 빈번한 메모리 할당에 따른 오버헤드를 줄입니다.
문자열 길이가 1MB 미만인 경우 필요한 길이의 2배로 할당됩니다. 1MB를 초과하는 경우 매번 용량을 1MB씩 늘려서 사전 할당됩니다.Redis
의 숫자도 문자열 형식으로 저장되지만 인코딩 방법이 일반 문자열과 다릅니다. 숫자는 정수 인코딩을 사용하며 문자열 내용은 직접 설정됩니다. 정수 값의 이진 바이트 시퀀스입니다. tring
类型是二进制安全的,即 string
中可以包含任何数据。
Redis 中的普通 string 采用 raw encoding 即原始编码方式,该编码方式会动态扩容,并通过提前预分配冗余空间,来减少内存频繁分配的开销。
在字符串长度小于 1MB 时,按所需长度的 2 倍来分配,超过 1MB,则按照每次额外增加 1MB 的容量来预分配。
Redis
中的数字也存为 string 类型,但编码方式跟普通 string 不同,数字采用整型编码,字符串内容直接设为整数值的二进制字节序列。
在存储普通字符串,序列化对象,以及计数器等场景时,都可以使用 Redis 的字符串类型,字符串数据类型对应使用的指令包括 set、get、mset、incr、decr 等。
list
列表,是一个快速双向链表,存储了一系列的 string 类型的字串值
对于常规的 pop、push 元素,性能很高,时间复杂度为 O(1),因为是列表直接追加或弹出。但对于通过随机插入、随机删除,以及随机范围获取,需要轮询列表确定位置,性能就比较低下了。
操作 list 列表时,可以用 lpush、lpop、rpush、rpop、lrange 来进行常规的队列进出及范围获取操作,在某些特殊场景下,也可以用 lset、linsert 进行随机插入操作,用 lrem 进行指定元素删除操作;最后,在消息列表的消费时,还可以用 Blpop、Brpop 进行阻塞式获取,从而在列表暂时没有元素时,可以安静的等待新元素的插入,而不需要额外持续的查询。
set 是 string 类型的无序集合,set 中的元素是唯一的,即 set 中不会出现重复的元素。Redis 中的集合一般是通过 dict 哈希表实现的,所以插入、删除,以及查询元素,可以根据元素 hash 值直接定位,时间复杂度为 O(1)。
操作
sismember
指令判断该 key 对应的 set 数据结构中,是否存在某个元素,如果存在返回 1,否则返回 0;
sdiff
指令来对多个 set 集合执行差集;
sinter
指令对多个集合执行交集;
sunion
指令对多个集合执行并集;
spop
指令弹出一个随机元素;
srandmember
指令返回一个或多个随机元素。
在社交系统中,可以用于存储关注的好友列表,用来判断是否关注,还可以用来做好友推荐使用。另外,还可以利用 set 的唯一性,来对服务的来源业务、来源 IP 进行精确统计。
有序集合中,每个元素都会关联一个 double 类型的 score 分数值。有序集合通过这个 score 值进行由小到大的排序。有序集合中,元素不允许重复,但 score 分数值却允许重复。
操作
zscan
指令:按顺序获取有序集合中的元素;
zscore
指令:获取元素的 score 值;
zrange
指令:通过指定 score 返回指定 score 范围内的元素;
在某个元素的 score 值发生变更时,还可以通过 zincrby 指令对该元素的 score 值进行加减。
通过 zinterstore、zunionstore
list
list는 문자열 유형의 일련의 문자열 값을 저장하는 빠른 이중 연결 목록입니다.
🎜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
명령을 사용하여 여러 순서 집합을 교차하고 통합한 다음 새 순서 집합을 새 키에 저장합니다. 중복 요소가 있는 경우 반복 요소의 점수는 다음과 같습니다. 추가된 후 새 세트에 있는 요소의 점수 값으로 사용됩니다. 🎜🎜🎜🎜주문된 컬렉션을 사용하여 실시간으로 순위를 계산하고 순위를 새로 고칠 수 있으며, 학생 점수를 기록하여 특정 점수 범위 내의 학생 목록을 쉽게 추가하는 데에도 사용할 수 있습니다. 시스템 통계에 가중치가 실시간으로 표시됩니다. 🎜🎜🎜🎜해시 해시🎜🎜짧음🎜비트맵은 일련의 연속적인 이진수입니다. 기본 레이어는 실제로 string
을 기반으로 캡슐화되어 저장됩니다. string
进行封装存储的
按 bit 位进行指令操作的。bitmap 中每一 bit 位所在的位置就是 offset 偏移,可以用 setbit、bitfield 对 bitmap 中每个 bit 进行置 0 或置 1 操作,也可以用 bitcount 来统计 bitmap 中的被置 1 的 bit 数,还可以用 bitop 来对多个 bitmap 进行求与、或、异或等操作。
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
在存储某个位置点时,首先利用 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
비트맵
비트맵의 특징은 비트별 설정, AND, OR 등의 연산이 매우 효율적이며, 객체 라벨 속성을 저장하는 데 사용하면 1비트가 하나의 라벨을 저장할 수 있다는 것입니다. 비트맵을 사용하면 지난 N일 동안의 사용자 로그인 상태를 매일 1비트를 사용하고 로그인할 때 1로 설정하여 저장할 수 있습니다. 개인화된 추천은 소셜 애플리케이션에서 매우 중요합니다. 군대, 엔터테인먼트, 비디오, 사진, 텍스트 등과 같은 뉴스 및 피드에 대한 일련의 태그를 설정할 수 있습니다. 비트맵을 사용하여 이러한 태그를 저장하고 해당 태그 비트를 1. 사용자의 경우 유사한 방법을 사용하여 사용자의 여러 속성을 기록할 수 있으며 태그를 기반으로 다차원 통계를 쉽게 수행할 수 있습니다. 비트맵 비트맵에 대한 중요한 지침에는 setbit, getbit, bitcount, bitfield, bitop, bitpos 등이 포함됩니다. 통계적인 사용자 로그인 상태: 1 2 3 5일 이내 로그인
hyperLogLog
는 카디널리티 통계에 사용되는 데이터 유형으로, 통계를 위해 수많은 요소가 입력될 때 이를 완료하는 데 약간의 메모리만 필요합니다. HyperLogLog는 메타데이터를 저장하지 않고 계산할 예상 요소 수만 기록합니다. 이 예상 수치는 표준 편차 0.81%의 근사치입니다. 대부분의 비즈니스 시나리오에서 대규모 데이터의 경우 1% 미만의 오류가 허용됩니다. . 🎜🎜Redis의 HyperLogLog는 개수가 많지 않은 경우 계산 시 희소 행렬 저장소를 사용합니다. 개수가 증가함에 따라 희소 행렬이 차지하는 공간이 점차 증가하여 임계값을 초과하면 조밀한 행렬로 변경됩니다. . 조밀한 매트릭스 점유 공간은 약 12KB 바이트로 고정되어 있습니다. 🎜🎜hyperLoglog 데이터 유형을 통해 pfadd를 사용하여 카디널리티 통계에 새 요소를 추가할 수 있고, pfcount를 사용하여 hyperLogLog 구조에 저장된 대략적인 기수 수를 얻을 수 있으며, hypermerge를 사용하여 여러 hyperLogLog를 하나의 hyperLogLog 구조로 인해 편리합니다. 결합된 기본 번호를 가져옵니다. 🎜🎜hyperLogLog의 특징은 통계 과정이 독립적인 요소를 기록하지 않고, 메모리를 거의 차지하지 않으며, 대용량 데이터를 계산하는 데 매우 적합하다는 것입니다. 대규모 및 중간 규모 시스템에서는 hyperLogLog 데이터 유형을 사용하여 일별 또는 월별 고유 방문자 수를 계산하거나 많은 수의 사용자가 검색한 독립적인 용어 수를 계산할 수 있습니다. 🎜🎜🎜관련 학습 권장 사항: 🎜Laravel 🎜 🎜🎜위 내용은 Redis의 핵심 데이터 유형 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!