Heim >Datenbank >Redis >Einführung in mehrere gängige Grundobjekte in Redis

Einführung in mehrere gängige Grundobjekte in Redis

王林
王林nach vorne
2021-02-18 09:29:082171Durchsuche

Einführung in mehrere gängige Grundobjekte in Redis

1: Einführung

Es gibt mehrere häufig verwendete Grundobjekte in Redis, wie z. B. String, Hash, Liste, Set, Zset usw. Lassen Sie uns die zugrunde liegende Implementierungsdatenstruktur sowie allgemeine Anwendungsszenarien und -merkmale vorstellen.

Zwei: redisobject

Der Speicherort des Quellcodes befindet sich ab Zeile 605 in der Datei server.h

typedef struct redisObject {
    unsigned type:4;
    unsigned encoding:4;
    unsigned lru:LRU_BITS;
    int refcount;
    void *ptr;
} robj;

Typ 2.1

Der tatsächliche Objekttyp in Redis ist in 5 Typen von 0-4-Deklarationen unterteilt. Befindet sich in Zeile 466 im Dateiserver.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-Kodierung

redis acht Kodierungsformate, die für fünf Objekte verwendet werden: String, Liste, Hash, Set, Zset, jede Kodierung entspricht einer Datenstruktur

#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

Speicher Das Recycling in Redis verwendet eine relativ einfache Referenzzählmethode. Jede Objektreferenz hat Refcount + 1. Wenn die Referenzanzahl auf 0 reduziert wird, wird der Speicher recycelt

Drei: Zeichenfolge

3.1 Häufige Szenarien

Verteilte Sperre: Die Basis Um eine verteilte Sperre zu implementieren, verwenden Sie den Zeichenfolgenbefehl setnx user information: Häufig werden Benutzerinformationen serialisiert und in Redis für den Cache gespeichert, aber Hash kann hier berücksichtigt werden. Wenn nur ein Teil der Benutzerdateninformationen verwendet wird, sind Serialisierung und Deserialisierung schließlich auch ein Aufwand

3.2 Kodierungsformat

int: Wenn die Zeichenfolge ausschließlich aus Zahlen besteht, wird die int-Kodierung verwendet : Die Speicheradressen sind fortlaufend und der Speicher wird einmal angefordert. Die Zeichenfolgenlänge beträgt weniger als 44raw: Die unterste Ebene wird von sds implementiert. Der Unterschied zu embstr besteht darin, dass die Erstellung von sds und die Erstellung von redisobject in zwei Schritten implementiert werden

3.3 Allgemeine Befehle

# 存储
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 Häufige Szenarien

Nachrichtenwarteschlange: Im Allgemeinen nicht. Wie verwendet man sie? Schließlich sind verschiedene MQ und Kafka bereits sehr ausgereift. Darüber hinaus garantiert die von redis implementierte Nachrichtenwarteschlange nicht die Sicherheit der Berechnung des Datenrankings: Sie eignet sich nur für geplante Berechnungen und Aktualisierungen und kann nicht zum Aktualisieren des Rankings in Echtzeit verwendet werden. Zum Beispiel berechnet Meituan jeden Tag die Liste der Likes für das Ranking der Händler in der Region: Zum Beispiel die Likes in WeChat (weiß nicht, wie das geht, rate)

4.2 Codierungsformat

Quicklist: Schnellliste , die vorherige Version verwendete Linkedlist und Ziplist. Die derzeit verwendete Quicklist ist eine Kombination aus beidem. Weitere Informationen finden Sie unter Redis (1) – Eine kurze Diskussion der Datenstruktur in Redis die redis.con-Datei

list-max-ziplist-size: Konfigurieren Sie die Größe einer einzelnen Ziplist list-compress- Depth: Konfigurieren Sie den Startknoten des LZF-Komprimierungsalgorithmus

4.4 Allgemeine Befehle

# 创建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: Hash

5.1 Häufige Szenarien

Warenobjekte, Benutzerobjekte. Dieses Szenario muss mit einer Überprüfung behandelt werden. Wenn die Produktobjekt- und Benutzerobjektinformationen jedes Mal vollständig erforderlich sind, möchten Sie möglicherweise die Zeichenfolge speichern. Wenn jedoch nur ein Teil der Informationen verwendet wird, können Sie die Verwendung der Hash-Struktur SKU in Betracht ziehen Andere Informationen. In diesem Szenario ist Hash besser geeignet. Eine Hash-Struktur speichert alle SKUs eines bestimmten Produkts. Es wird die zugrunde liegende Struktur zur Speicherung von Ziplist in Diktat konvertiert. Wenn die Anzahl der Knoten den Grenzwert überschreitet, wird die zugrunde liegende Datenstruktur in „dicthash-max-ziplist-value“ konvertiert: Standardwert 64. Wenn ein Wert, dessen Länge den Grenzwert überschreitet, in den Hash eingefügt wird, wird die zugrunde liegende Datenstruktur in „dict“ konvertiert 5.4 Gemeinsame Befehle Es kann Ihre Takeout-Datensätze und die in der Nähe befindlichen Sicherheitstipps für Händler zur Berechnung des Kreuzungsschubs verwenden: WeChat-Gruppenmitglieder werden in einem Satz gespeichert, und Benutzerfreunde werden ebenfalls in dem Satz gespeichert. Wenn Benutzer einem Gruppenchat beitreten, können Benutzer, die keine Freunde sind, daran erinnert werden, auf Sicherheit zu achten wird zum Speichern eingestellter Einstellwerte verwendet

6.3 Zugehörige Parameterkonfiguration

set-max-inset-entries: Der Standardwert ist 512, was bedeutet, dass, wenn die Anzahl der Elemente den Grenzwert überschreitet, in die Hashtabellen-Codierung konvertiert wird

6.4 Allgemein Befehle

# 存储
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]

Sieben: Zset

7.1 Häufige Szenarien

Ranking: Meituan Um eine Verkaufsrangliste zu erstellen, können Sie die Bestellung des Geschäfts als Bewertung verwenden Stellen Sie sicher, dass es sich bei den herausgenommenen Datengewichten um alle verzögerten Aufgaben handelt, die mit maximaler Priorität ausgeführt werden: Bewertung. Beurteilen Sie als Startzeit der Aufgabe einfach den Wert und führen Sie ihn aus, wenn Sie den Wert nehmen Benachbarte Knoten zum Speichern von Score und Membersskiplist: Listenstruktur überspringen, Sie können sie anzeigen Redis (1) – Eine kurze Diskussion der Datenstruktur in Redis

7.3 Verwandte Parameterkonfigurationzset-max-ziplist-entries: Der Standardwert ist 128, und die maximale Anzahl der angegebenen Ziplist-Speicherelemente beträgt 128. Wenn der Wert überschritten wird, wird er in „skiplistzset-max-ziplist-value“ konvertiert: Der Standardwert ist 64 und der maximal gespeicherte Datenwert beträgt 64 Byte. Wenn er überschritten wird, wird er in „skiplist“ konvertiert

7.4 Häufig verwendete Befehle

# 存储
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 ...]

Verwandte Empfehlungen:

Redis-Datenbank-Tutorial

Das obige ist der detaillierte Inhalt vonEinführung in mehrere gängige Grundobjekte in Redis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.im. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen