1: 소개
Redis에는 string, hash, list, set, zset 등과 같이 일반적으로 사용되는 기본 개체가 몇 가지 있습니다. 기본 구현 데이터 구조와 일반적인 응용 프로그램 시나리오 및 특성을 소개하겠습니다.
두 가지: redisobject
소스 코드 위치는 server.h 파일의 605번째 줄부터 위치합니다
typedef struct redisObject { unsigned type:4; unsigned encoding:4; unsigned lru:LRU_BITS; int refcount; void *ptr; } robj;
2.1 type
redis에서 실제 객체 유형은 0~4 선언의 5가지 유형으로 나뉩니다. 파일 server.h
#define OBJ_STRING 0 /* String object. */ #define OBJ_LIST 1 /* List object. */ #define OBJ_SET 2 /* Set object. */ #define OBJ_ZSET 3 /* Sorted set object. */ #define OBJ_HASH 4 /* Hash object. */
2.2 인코딩
redis의 466번째 줄에 있습니다. 5개 객체 string, list, hash, set, zset에 사용되는 8가지 인코딩 형식이 있으며, 각 인코딩은 데이터 구조
#define OBJ_ENCODING_RAW 0 #define OBJ_ENCODING_INT 1 #define OBJ_ENCODING_HT 2 #define OBJ_ENCODING_ZIPLIST 5 #define OBJ_ENCODING_INTSET 6 #define OBJ_ENCODING_SKIPLIST 7 #define OBJ_ENCODING_EMBSTR 8 #define OBJ_ENCODING_QUICKLIST 9
2.3 refcount
메모리에 해당합니다. Redis의 재활용은 상대적으로 간단한 참조 계산 방법을 사용합니다. 각 객체 참조에는 refcount + 1이 있습니다. 참조 횟수가 0으로 줄어들면 메모리가 재활용됩니다
Three: string
3.1 일반적인 시나리오
분산 잠금: 기본 분산 잠금을 구현하려면 문자열 명령 setnx user information을 사용하는 것입니다. 사용자 정보는 캐시용으로 여러 번 직렬화되어 Redis에 저장되지만 여기서는 해시를 고려할 수 있습니다. 사용자 데이터 정보 중 일부만 사용하면 결국 직렬화, 역직렬화에도 비용이 발생합니다
3.2 인코딩 형식
int: 문자열이 모두 숫자인 경우 int 인코딩이 사용됩니다. 이것이 실제 바이너리 데이터 저장소입니다. embstr: 메모리 주소가 연속적이고 메모리가 한 번 요청됩니다. 문자열 길이는 44raw 미만입니다. 맨 아래 레이어는 sds로 구현됩니다. embstr과 비교하면 sds 생성과 redisobject 생성이 두 번 구현된다는 점이 다릅니다.
3.3 공통 명령
# 存储 set key value # 互斥存储 # 已存在的key再次存入数据不会更改缓存 setnx key value # 过期存储,单位秒 # 设定key过期时间,到期自动删除 setex key seconds value # 过期存储,单位毫秒 psetex key milliseconds value # 批量存储 mset key value [key value ...] # 取值 get key # 批量取值 mget key [key ...] # 追加 append key value # 长度 strlen key # 自增,只能是int编码的字符串 incr key # 自定义步长自增 incrby key increment # 自减,只能是int编码的字符串 # 这个可以减到负数,秒杀扣减库存啥的想想能不能用这个命令 decr key # 自定义步长自减 decrby key increment
4: list
4.1 일반적인 시나리오
메시지 대기열: 일반적으로 사용하지 않음 결국 다양한 MQ와 Kafka는 이미 매우 성숙해졌습니다. 또한 Redis에 의해 구현된 메시지 큐는 데이터 순위 계산의 보안을 보장하지 않습니다. 이는 정기적인 계산 및 업데이트에만 적합하며 실시간 순위 업데이트에는 사용할 수 없습니다. 예를 들어 Meituan은 매일 해당 지역의 판매자 순위에 대한 좋아요 목록을 계산합니다. 예를 들어 WeChat의 좋아요(어떻게 해야할지 모르겠습니다)
4.2 코딩 형식
quicklist: 빠른 목록 , 이전 버전에서는 linkedlist와 ziplist를 사용했습니다. 현재 사용되는 퀵리스트는 두 가지를 조합한 것입니다. 자세한 내용은 Redis(1) - Redis의 데이터 구조에 대한 간략한 설명
4.3 관련 매개변수 구성
구성 매개변수 위치는 1083 및 1099행에 있습니다. redis.con 파일
list-max-ziplist-size: 단일 ziplist 크기 구성 list-compress-length: LZF 압축 알고리즘 시작 노드 구성
4.4 일반 명령
# 创建list并压入节点 # 压入节点位于链表头 lpush key value # 压入节点位于链表尾 rpush key value # 弹出list头节点 lpop key # 弹出list尾节点 rpop key # 删除节点 # count > 0 从左开始搜索删除count数量的value # count < 0 从右开始搜索删除|count|数量的value # count = 0 删除list中所有value lrem key count value # 范围保留 # -1 表示列表最后一个元素 # -2 表示倒数第二个,以此类推 ltrim key start stop # 计算长度 llen key # 索引查询节点 # index < 0 从右开始搜索 # index > 0 从左开始搜索 lindex key index # 范围查询 # stop = -1 表示所有 lrange key start stop # 阻塞弹出 # 队列中没有节点时会一直等待 # 多个key时表示挨着顺序依次检查,知道找到非空列表为止 # timeout可以设置等待时间,0表示一直等待 blpop key [key...] timeout brpop key [key...] timeout
5: 해시
5.1 일반 시나리오
제품 개체, 사용자 개체. 이 시나리오는 검증을 통해 처리해야 합니다. 매번 제품 객체와 사용자 객체 정보 전체가 필요한 경우 문자열을 저장하는 것이 좋습니다. 그러나 정보의 일부만 사용되는 경우 해시 구조 SKU를 사용하는 것을 고려할 수 있습니다. 기타 정보 이 시나리오에서는 해시가 더 적합합니다. 해시 구조는 특정 제품의 모든 SKU를 저장합니다
5.2 인코딩 형식
ziplist: ziplist를 사용하여 해시 구조를 저장하는 경우 데이터는 두 개의 인접한 ziplistEntry를 사용하여 필드와 값을 저장합니다. 기본 구조는 저장을 위해 ziplist에서 dict로 변환됩니다
5.3 관련 매개변수 구성
hash-max-ziplist-entries: 기본값은 512입니다. 즉, ziplist 노드는 1024입니다. 노드 수가 제한을 초과하면 기본 데이터 구조가 dicthash-max-ziplist-value: 기본값 64로 변환됩니다. 길이가 제한을 초과하는 값이 해시에 삽입되면 기본 데이터 구조가 dict
로 변환됩니다.(동영상 공유 학습: redis 동영상 튜토리얼)
5.4 일반 명령
# 存储 hset key field value # 不允许更改存储 # 若field值存在则本次存储不会覆盖原有value值 hsetnx key field value # 批量存储 hmset key field value [field value ...] # 查询 hget key field # 批量查询 hmget key field [field ...] # 全量查询 hgetall key # 全量查询field值 hkeys key # 全量查询value值 hvals key # 删除field hdel key field [field ...] # 计算键值对数量 hlen key # field存在判断 hexists key field # 增量式迭代 # cursor表示迭代开始的游标 # count 表示迭代返回数据数量 # pattern 表示正则匹配结果限制 hscan key cursor [Count count] [Match pattern]
Six: Set
6.1 일반 시나리오
권장 사항: sinter 명령을 통해 교차점을 계산합니다. 예를 들어 Meituan이 근처 테이크아웃을 추천하면 테이크아웃 기록 및 근처 교차로 푸시를 계산하는 판매자를 위한 보안 팁을 사용할 수 있습니다. WeChat 그룹 구성원은 세트에 저장되고 사용자 친구도 세트에 저장됩니다. 사용자가 그룹 채팅에 참여할 때 친구가 아닌 사용자에게 안전에 주의하도록 상기시킬 수 있습니다
6.2 인코딩 형식
intset: 정수 컬렉션, 집합 컬렉션의 모든 값이 정수인 데이터를 저장하는 데 사용됨 해시 테이블: 필드 설정된 값을 저장하는 데 사용됩니다
6.3 관련 매개변수 구성
set-max-inset-entries: 기본값은 512입니다. 즉, 요소 수가 제한을 초과하면 해시테이블 인코딩으로 변환됩니다
6.4 공통 명령
# 存储 sadd member [member ...] # 弹出元素并返回 spop key count # 查询所有元素 smembers key [count] # 计算元素数量 scard key # 删除指定元素 srem key member [member ...] # 判断元素存在 sismember key member # 计算给定集合与后续集合差集 # 返回计算结果 sdiff key [key ...] # 计算给定集合与后续集合差集 # 存储结果到destination并返回 sdiffstore destination key [key ...] # 计算给定集合与后续集合交集 # 返回计算结果 sinter key [key ...] # 计算给定集合与后续集合差集 # 存储结果到destination并返回 sinterstore destination key [key ...] # 计算给定集合与后续集合差集 # 返回计算结果 sunion key [key ...] # 计算给定集合与后续集合差集 # 存储结果到destination并返回 sunionstore destination key [key ...]
Seven: Zset
7.1 일반적인 시나리오
Ranking: Meituan 판매 순위 목록을 만들려면 상점의 주문을 사용하여 점수를 만들 수 있습니다. 이 쿼리의 결과는 정렬된 가중치 대기열입니다. 점수는 다음과 같이 사용됩니다. 빼낸 데이터의 가중치가 모두 지연된 작업이 되도록 최대 우선순위로 실행: 점수 작업 시작 실행 시간으로 값을 판단하고 값을 가져올 때 실행하면 됩니다.
7.2 인코딩 형식
ziplist: 유사 해시하려면 두 개의 인접한 노드를 사용하여 점수와 멤버를 저장합니다skiplist: 목록 구조를 건너뛰면 볼 수 있습니다. Redis(1) -- Redis의 데이터 구조에 대한 간략한 설명
7.3 관련 매개변수 구성
zset-max-ziplist -entries: 기본값은 128이고, 지정된 ziplist 저장 요소의 최대 수는 128입니다. 초과하는 경우 Skiplistzset-max-ziplist-value로 변환됩니다. 기본값은 64이며, 최대 저장 데이터 값은 64바이트입니다. 초과하는 경우 Skiplist
7.4 일반 명령
# 存储 # xx 表示当zset中存在本次插入的member时才存储 # nx 表示当zset中不存在本次插入的member时才存储 zadd key [nx|xx] score member [score member ...] # 查询排序指定[start,stop]范围内元素 # withscores 查询结果顺带返回元素分数 zrange key start stop [withscores] # 查询指定元素分数 zscore key member # 元素数量统计 zcard key # 返回score位于[min,max]区间的元素数量 zcount key min max # 对指定元素分数增加incrment值 zincrby key incrment member # 返回指定分数区间范围内元素 # withscores 返回时携带分数一起返回 # limit offset count表示跳过offset数量结果再返回count数量结果 zrangebyscore key min max [withscores] [limit offset count] # 倒序返回指定分数区间范围内元素 # withscores 返回时携带分数一起返回 # limit offset count表示跳过offset数量结果再返回count数量结果 zrevrangebyscore key max min [withrescores] [limit offset count] # 删除指定分数范围[min,max]内元素 zremrangebyscore key min max # 移除指定元素 zrem key member으로 변환됩니다.
관련 권장 사항: redis 데이터베이스 튜토리얼
위 내용은 Redis의 몇 가지 일반적인 기본 객체 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!