Maison > Article > base de données > Introduction à plusieurs objets de base courants dans Redis
1 : Préface
Il existe plusieurs objets de base couramment utilisés dans Redis, tels que string, hash, list, set, zset, etc. Présentons-les ci-dessous. structure des données de mise en œuvre sous-jacente et scénarios et caractéristiques d’application courants.
Deux : redisobject
L'emplacement du code source est situé dans le fichier server.h à partir de la ligne 605
typedef struct redisObject { unsigned type:4; unsigned encoding:4; unsigned lru:LRU_BITS; int refcount; void *ptr; } robj;
Type 2.1
Le type d'objet réel dans Redis est divisé en 5 types d'instructions 0-4. Situé à la ligne 466 du fichier 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. */
Encodage 2.2
Huit formats d'encodage utilisés par les cinq objets de redis string, list, hash, set et zset, chaque encodage correspondant à une donnée structure
#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
Le recyclage de la mémoire dans redis utilise une méthode de comptage de références relativement simple. Chaque référence d'objet a refcount + 1. Lorsque le nombre de références est réduit à 0, la mémoire sera recyclée <.>
Trois : chaîne 3.1 Scénarios courants Verrouillage distribué : La base de la mise en œuvre du verrouillage distribué est d'utiliser la commande de chaîne setnx Informations utilisateur : plusieurs Parfois, les informations utilisateur seront sérialisé et stocké dans Redis pour le cache, mais le hachage peut être envisagé ici. Si vous n'utilisez qu'une partie des informations sur les données utilisateur, après tout, la sérialisation et la désérialisation sont également une dépense3.2 Format d'encodageint : lorsque la chaîne est composée uniquement de chiffres, l'encodage int sera utilisé Il s'agit d'un véritable embstr de stockage de données binaires : l'adresse mémoire est continue et la mémoire est appliquée une seule fois. La longueur de la chaîne est inférieure à 44raw : la couche inférieure est implémentée à l'aide de sds. Par rapport à embstr, la différence est que la création de sds et la création de redisobject sont implémentées deux fois 3.3 Commandes communes# 存储 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<.> Quatre : liste
4.1 Scénarios courants
File d'attente de messages : généralement non utilisée, après tout, divers MQ et Kafka sont déjà très matures. De plus, la file d'attente de messages implémentée par redis ne garantit pas la sécurité du calcul du classement des données : elle ne convient qu'au calcul et à la mise à jour réguliers, et ne peut pas être utilisée pour la mise à jour du classement en temps réel. Par exemple, Meituan calcule chaque jour la liste des likes pour le classement des commerçants de la région : Par exemple, les likes dans WeChat (je ne sais pas comment faire, devinez)
4.2 Format d'encodage
liste rapide : liste rapide, avant que les versions utilisent la liste liée et la liste zip. La liste rapide actuellement utilisée est une combinaison des deux. Pour plus de détails, veuillez consulter Redis (1) - Une brève discussion sur la structure des données dans Redis
4.3 Configuration des paramètres associés
L'emplacement du Le paramètre de configuration se trouve dans le fichier redis.con Lignes 1083 et 1099
list-max-ziplist-size : Configurer une seule taille de liste zip list-compress-profondeur : Configurer le nœud de démarrage de l'algorithme de compression LZF
4.4 Commandes communes
# 创建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
Cinq : Hash
5.1 Scénarios courants
Objets produits, objets utilisateur. Ce scénario doit être traité avec vérification. Si les informations sur l'objet produit et l'objet utilisateur sont requises dans leur intégralité à chaque fois, vous souhaiterez peut-être stocker la chaîne. Cependant, si seule une partie des informations est utilisée, vous pouvez envisager d'utiliser la structure de hachage SKU et. d'autres informations. Dans ce scénario, le hachage est plus approprié. Une structure de hachage stocke tous les références d'un certain produit
5.2 Format d'encodage
ziplist : lors de l'utilisation de ziplist pour stocker la structure de hachage, une donnée utilisera deux ziplistEntry adjacentes pour stocker le champ et la valeurhashtable : lorsque les données sont stockées Lorsque la limite des paramètres est dépassée, la structure sous-jacente sera convertie de ziplist en dict pour le stockage
5.3 Configuration des paramètres associés
hash-max-ziplist-entries : La valeur par défaut est 512, c'est-à-dire que le nœud de la liste zip est 1024. Lorsque le nombre de nœuds dépasse la limite, la structure de données sous-jacente est convertie en dicthash-max-ziplist-value : valeur par défaut 64. Lorsqu'une valeur dont la longueur dépasse la limite est insérée dans le hachage, la structure de données sous-jacente est convertie en dict
( Apprentissage du partage vidéo :
tutoriel vidéo redis# 存储 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]
6 : Définir
6.1 Scénarios courants
Recommandé : calculez l'intersection via la commande sinter. Par exemple, lorsque Meituan vous recommande des plats à emporter à proximité, il peut calculer l'intersection en fonction de votre enregistrement de plats à emporter et des commerçants à proximité et envoyer des conseils de sécurité : les membres du groupe WeChat sont enregistrés dans un fichier. défini, et les amis de l'utilisateur sont également enregistrés dans l'ensemble. Lorsque les utilisateurs rejoignent une discussion de groupe, il peut être rappelé aux utilisateurs non amis de faire attention à la sécurité
6.2 Format de codage
intset : collection d'entiers, utilisée pour stocker des données dans lesquelles toutes les valeurs sont la collection d'ensembles est composée d'entiers table de hachage : utilisée pour le champ Pour stocker les valeurs définies
6.3 Configuration des paramètres associés
set-max-inset-entries : par défaut 512, ce qui signifie que lorsque le nombre d'éléments dépasse la limite, il sera converti en codage hashtable
6.4 Commandes communes
# 存储 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 ...]
7 : Zset
7.1 Scénarios courants
Liste de classement : Si Meituan veut faire un classement des ventes, il peut utiliser la commande du magasin pour faire un score. Cette requête Le résultat est une file d'attente de poids ordonnée : le score est utilisé comme priorité, de sorte que les poids de données supprimés sont des tâches retardées avec l'exécution la plus prioritaire. : le score est utilisé comme heure d'exécution de début de tâche, et lorsque la valeur est obtenue, la valeur peut être jugée et exécutée
7.2 Format de codage
ziplist : Semblable au hachage, les deux utilisent deux adjacents nœuds pour stocker le score et les membres Skiplist : sauter la structure de la liste, vous pouvez voir Redis (1) - Une brève discussion sur la structure des données Redis
7.3 Configuration des paramètres associés
zset-max-ziplist-. entrées : la valeur par défaut est 128 et le nombre maximum d'éléments de stockage de liste zip est de 128. S'il dépasse, il sera converti en skiplistzset-max-ziplist-value : la valeur par défaut est 64 et la valeur maximale des données stockées est de 64 octets. S'il dépasse, il sera converti en skiplist
7.4. Commandes couramment utilisées
# 存储 # 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
Recommandations associées :
Tutoriel de base de données redisCe qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!