>데이터 베이스 >Redis >Redis의 몇 가지 일반적인 기본 객체 소개

Redis의 몇 가지 일반적인 기본 객체 소개

王林
王林앞으로
2021-02-18 09:29:082173검색

Redis의 몇 가지 일반적인 기본 객체 소개

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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