当前位置:网站首页>Black Horse - - Redis Chapter
Black Horse - - Redis Chapter
2022-07-06 19:12:00 【Hu Yuqiao】
Liens d'apprentissage:https://www.bilibili.com/video/BV1cr4y1671t?p=1&vd_source=510ec700814c4e5dc4c4fda8f06c10e8
Crazy Notes:https://www.cnblogs.com/meditation5201314/p/14882992.html#redis%E4%BA%94%E7%A7%8D%E5%9F%BA%E6%9C%AC%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B
Code adresse:https://gitee.com/empirefree/SpringBoot-summarize
C'est peut - être parce que le professeur l'a dit selon le Code du projet.,C'est si bas.,En fait, le professeur parle très bien.,Peut être totalement indépendant du projet,Construisez votre propre petit projet et utilisez simplement les basesredisC'est tout..Créer des grappes dans les chapitres avancés、canalJ'ai sauté tout ça.,Familiarisez - vous avec le dossier.,On en parlera plus tard.
Catalogue des articles
- 1. Chapitre de base
- 2. Chapitre pratique
- 2.1. Connexion SMS(Non.)
- 2.2. Cache de données
- 2.3 Serrure distribuée
- 2.4 Shooting shooting
- 2.5 Résumé des activités
- 3.Chapitre avancé
- 4.Principes
1. Chapitre de base
1.1 Préface
Le fou dit:–RedisNotes d'étude:https://www.cnblogs.com/meditation5201314/p/14882992.html
Après avoir appris ce que dit le fou Redis,Juste le sentiment de soi.RedisJ'ai appris, J'ai vu les cheveux de Shang Silicon Valley RedisChapitre, J'ai découvert que je n'avais appris que la fourrure de base , Contenu avancé réel 、Exercices pratiques、 Les principes ne sont pas compris , C'est une marche modeste .
1.2 Type de base
1.2.1 String
setnx mykey 111
1.2.2 List
Sortez d'abord, Peut être considéré comme une pile , Ou faire la file d'attente
1.2.3 set
Les valeurs ne peuvent pas être répétées
1.2.4 Hash
key map
1.2.5 Zset
zset key score value
-- z1Collection ajouter des élémentsm2,Le score est2
zadd z1 2 m2
-- Ordre inverse de l'index 1Démarrer la sortie2Éléments
zrevrange z1 1 2 withscores
-- Requêtez1Moyenne maximale1000 Min. 0Points,0: Décalage inférieur ou égal à 1000De3Éléments
zrevrangeByScore z1 1000 0 withscores limit 0 3
-- 1: Représente moins que le score maximum retourné la dernière fois 3Éléments( Il y aura des retours répétés avec le même score )
zrevrangeByScore z1 Dernière note maximale retournée 0 withscores limit 1 3
1.3 Pool de connexion
1.3.1 Type de pool de connexion
1.jedis
2.SpringDataRedis:OffreredisTemplate
1.3.2 RedisTempalte
1.3.2.1 Concepts de base
1.Réalisé en internejdkSérialisation
2. À propos du désordre :Parce queSpringMVCIntégréjackson-Binder Sérialisation comme ça
2. Chapitre pratique
2.1. Connexion SMS(Non.)
J'ai beaucoup fait avant , J'ai simplement lu le principe de l'écriture et j'ai sauté
2.2. Cache de données
2.2.1 Concepts de base
2.2.1.1 Politique de mise à jour du cache
- Utiliser supprimer le cache
- Comment assurer la cohérence des données du cache et de la base de données
- Projet monomère: Mettre le cache et la base de données dans la même transaction
- Transactions distribuées:TCCPlan de transaction
- Commencez par la base de donnéesorSupprimer d'abord le cache( Il s'agit généralement d'une demande de l'utilisateur , Informations sur la mise à jour des données dans les coulisses des commerçants ,Bien sûr., Il en va de même pour toute la transaction opérationnelle ou l'implémentation de verrouillage distribuée )
- Supprimer le cache en premier,Retravailler la base de données:A Supprimer d'abord ,BInA Lire le cache write avant de mettre à jour écrit les données d'erreur
- Commencez par la base de données,Rediriger le cache:ACommencez par la base de données,BInA Lire le cache d'écriture de la base de données avant l'opération lit également les données d'erreur
- Double suppression retardée( Supprimer avant de demander , Délai après la mise à jour de la Bibliothèque 3~5Secondes,Et puis supprimer): La raison du retard est de garantir A Non terminé après la suppression de la base de données des opérations de cache ,B Lire les données d'erreur , Puis il y a eu une lecture sale ,C'est une garantie.BFin de la mise en œuvre, Mais je ne pense pas que ce soit important , En cas de concurrence, il faut encore utiliser des serrures transactionnelles ou distribuées . Pour en savoir plus .
2.2.1.2 La serrure optimiste/Serrure pessimiste
La serrure optimiste + Services: Cohérence des données , Convient aux situations où la concurrence simultanée est faible ( Parce qu'il évite les mises à jour fréquentes des données ,Ce qui est adopté estCAS capare and swap Mécanisme de spin ou de numéro de version 2Comment?)
Serrure pessimiste + Services: Verrouiller avant chaque lecture
2.3 Serrure distribuée
2.3.1 Concepts de base
Serrure distribuée: Serrures multithreadées mutuellement visibles et mutuellement exclusives dans un système distribué ou en mode Cluster
2.3.2 RedissonPrincipes
2.3.2.0 Problème de verrouillage distribué
Basé sursetnx La serrure distribuée qui en résulte existe 4Questions,EtRedissonÇa peut être réglé.:
1. Non réinscriptible:setx Thread the same thread can repeatedly get the same Lock
1. Ne pas réessayer:setnt Obtenir la serrure une seule fois sans réessayer
1. Délai de libération:setnx Si l'exécution de l'entreprise est trop longue, la serrure sera automatiquement supprimée .( Mais si vous ne réglez pas le temps d'arrêt et que le service redémarre, alors key La valeur a toujours existé )
1. Cohérence maître - esclave:setnxMoyenne, La serrure principale est réglée , Passer de la bibliothèque à la bibliothèque principale après l'arrêt , Ensuite, la serrure est toujours accessible à l'extérieur
2. RedissonVerrouillage réinscriptible
Obtenir la serrure:
// Déterminer s'il existe, Si vous pouvez obtenir
if (redis.call('exists', KEYS[1]) == 0)
then
redis.call('hincrby', KEYS[1], ARGV[2], 1);
redis.call('pexpire', KEYS[1], ARGV[1]);
return nil;
end;
//Selonthreadid Juge si la serrure est la sienne , Obtenir le nombre de serrures plus un , Puis réinitialiser la date d'expiration
if (redis.call('hexists', KEYS[1], ARGV[2]) == 1)
then
redis.call('hincrby', KEYS[1], ARGV[2], 1);
redis.call('pexpire', KEYS[1], ARGV[1]);
return nil;
end;
// Sinon, l'acquisition de la serrure de retour a échoué
return redis.call('pttl', KEYS[1]);
Relâchez la serrure.:
// Si le nombre de serrures =0,Est libéré directement
if (redis.call('hexists', KEYS[1], ARGV[3]) == 0)
then return nil;
end;
// Si le nombre de serrures est supérieur à 0, Réinitialiser la validité , Compter moins un et revenir à . Sinon, la serrure ==0, Les abonnements à la publication peuvent être supprimés directement
local counter = redis.call('hincrby', KEYS[1], ARGV[3], -1);
if (counter > 0)
then
redis.call('pexpire', KEYS[1], ARGV[2]);
return 0;
else
redis.call('del', KEYS[1]);
redis.call('publish', KEYS[2], ARGV[1]); // Supprimer la serrure a un abonnement , Pour les Threads suivants qui obtiennent le mécanisme de retry d'échec de verrouillage
return 1;
end;
return nil;
2.3.2.2 Processus de base
// Obtenir la source de la serrure et libérer la serrure ici 2 Contenu de la fonction
// tryLockDe3Paramètres: Obtenir le temps d'attente de verrouillage ( Par défaut, n'attendez pas ) Temps de déverrouillage, Unités de temps
boolean isLock = rLock.tryLock(1, 10, TimeUnit.SECONDS);
rLock.unlock();
1. Verrouillage
1. ThreadaExécution en premierLua Le script prend la serrure ,Obtenir le succès( Temps de déverrouillage par défaut 30Secondes)LUA Le script garantit le même thread idObtenir la serrure**Rechargeable**
1. Si le temps de déverrouillage est réglé , Le mécanisme de rafraîchissement de la serrure du chien de garde n'est pas exécuté
2. Si ce n'est pas réglé, Par défaut, le temps de libération de la serrure de porte est utilisé 30Secondes, Exécuter le mécanisme de rafraîchissement du chien de garde .
1. Récursive chaque fois que vous regardez l'heure de la porte / 3 = 10 Rafraîchir le fil en quelques secondes idDurée de validité, Promis, non ** Supprimer la serrure après le temps mort **(Parce que par défaut30Rapport sec10Plus de secondes.)
2. ThreadbMise en œuvreLuaÉchec du script, S'abonner au temps d'attente ,Et récupérer la serrure, Après avoir reçu l'abonnement, réessayez en fonction du temps d'attente restant , Quitter sans recevoir l'heure d'abonnement ---- La plus haute priorité de temps d'attente est garantie ,C'est fait.**Retryable**
2. Déverrouiller
1. Publier le message d'abonnement
2. Annuler le chien de garde
RedissonSerrure distribuée
1.Rechargeable:Utilisationhash Fils de stockageid Et les temps de rentrée
2.Retryable: Retry de verrouillage avec abonnement à la publication et attente circulaire ( Garantie dans le délai d'attente )
3. Renouvellement des délais :UtilisationwatchDog,De temps en temps(releaseTime / 3)Réinitialiser
4.Cohérence maître - esclave:UtilisationmultiLock .Obtenir toutes les serrures du noeud maître pour réussir ( Plusieurs noeuds maîtres ont été placés )
2.4 Shooting shooting
2.4.1 Concepts de base
1、Redis Second kill qualification Judgment (LuaLe script garantit l'atomicité). Enregistrer les informations pertinentes dans la file d'attente de blocage
2、 Traitement asynchrone des commandes ,Réduction des stocks
2.4.2 Qualification de second kill –LuaScript
-- Jugement des stocks、 Déterminer si l'utilisateur passe une commande ,Réduction des stocks
-- Obtenir des coupons pour les paramètres id、Utilisateursid
local voucherId = ARGV[1]
local userId = ARGV[2]
local stockKey = 'seckill:stock:' .. voucherId
local orderKey = 'seckill:order:' .. voucherId
--
if(tonumber(redis.call('get', stockKey)) <= 0) then
return 1
end
if(redis.call("sismember", orderKey, userId) == 1) then
return 2
end
redis.call('incrby', stockKey, -1)
redis.call("sadd", orderKey, userId)
return 0
2.4.3 Une seconde pour passer la commande– Blocage de l'implémentation asynchrone de la file d'attente
0、 Lecture de la file d'attente de blocage du chargement anticipé
1、Redis Faire un jugement de qualification , Mettre en file d'attente les personnes qualifiées
2、 Pool de Threads lecture asynchrone des données de file d'attente
(Questions:La file d'attente de blocage est basée surjvm Mémoire pour stocker les données ,Arrêt du service, Une forte concurrence peut causer des problèmes de données )
2.4.4 Redis-File d'attente des messages
2.4.4.1 Concepts de base
File d'attente pour les messages,Liste bidirectionnelle,Adoption[LPush, BRPOP],Ou[Rpush, BLPOP] Ces implémentations bloquent la file d'attente .
2.4.4.2 ListFile d'attente des messages
Avantages:
1. Basé surRedisStockage,Illimité etJVMMémoire
2. Basé surRedisPersistance des données
Inconvénients:
1. Impossible d'éviter la perte de message
2. Seuls les consommateurs individuels peuvent être pris en charge , Impossible d'utiliser plus d'un consommateur
2.4.4.3 PubSubFile d'attente des messages
-- Publication
publish order.q1.hello
--Abonnements
subscribe order.q1
--Abonnements: Prise en charge des jokers *0Ou plus ?Un ou plusieurs [] Conditions internes remplies
PSUBSCRIBE order.*
Soutien à la production multiple ,Consommer plus
La persistance des données n'est pas prise en charge, Impossible d'éviter la perte de message , Les messages s'accumulent facilement
2.4.4.4 StreamFile d'attente des messages
--AjouterstreamFile d'attente,*Indique parredisGénérer un messageid
-- File d'attente 1: Comme tout dans la file d'attente , Mais les lectures bloquées lisent les dernières , Il y aura des dérogations
xadd s1 * k1 v1
--Longueur de la file d'attente
xlen s1
-- Lire un message de file d'attente ,De0Commencer à lire
xread count 1 streams s1 0
-- Lire un message , Lire à partir du dernier ,Attente permanente
xread count 1 block 0 streams s1 $
- Message persistant ,Traçable, Lecture bloquable , Peut être lu par plusieurs consommateurs
- Parce que chaque fois que vous lisez le dernier , .Il y a un risque que le message soit écrasé avant la lecture ,EtpubsubType
Message shunt: Les messages sont répartis entre différents groupes
Identification du message: Comme un signet , Marquer quel message a été lu , Continuer à lire à partir de l'identité après le redémarrage d'un arrêt de service ( Cela évite les fuites de messages )
Confirmation du message: Le message est envoyé à pending, Envoyer une fois terminé XACKConfirmation, Puis la file d'attente supprime le message
Mode Groupe de messages
1、 Plusieurs consommateurs se sont précipités pour lire le message
2、 Peut bloquer la lecture , Les messages peuvent être retracés
3、 Aucun risque de fuite de message , Les messages peuvent être retracés
-- 0 Pour le premier message ,$ Pour le dernier message
-- > Indique le prochain message non consommé ,"Autres" Indique un message consommé mais non confirmé . c1 Indique le nom du consommateur .
-- File d'attente 2: Échec de l'envoi aucun message confirmé entré pengding-list, Comme un pointeur pour marquer la première position , L'autre pointeur recule
--Prends ça.streamFlows1Mettre dansg1Moyenne,Depuis le premier
xgroup create s1 g1 0
xreadgroup group g1 c1 count 1 block 2000 streams s1 >
-- Selon le messageidMessage de confirmation
xack s1 g1 1655878247936-0
--Voirpending-list Pour toutes les périodes de 10Message (s)
xpending s1 g1 - + 10
--Lirepending-list Premier message non reconnu dans
xreadgroup group g1 c1 count 1 block 2000 streams s1 0
[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-WWIDBab1-1656671557221)(…/…/…/…/…/Roaming/Typora/typora-user-images/image-20220622145459299.png)]
Sur le terrain
--MKSTREAM: Le flux est créé automatiquement s'il n'existe pas
xgroup create stream.orders g1 0 MKSTREAM
--Lua Le script perd des données dans la file d'attente . Une autre boucle de thread lit les données de la file d'attente ,Et faireackConfirmation
2.5 Résumé des activités
2.5.1 Fonction "like"
RedisSelon l'articleid—key Augmentation ou diminution de la valeur , Puis synchronisez - vous dans la table de la Bibliothèque
2.5.2 Fonction focus
Après chaque suivi de l'utilisateur ,Utilisationfollows-idEn tant quekey,AdoptionsetModifierredis Situation préoccupante , Puis synchronisez - vous dans la table de la Bibliothèque
2.5.3 FeedFlow
2.5.3.1 Concepts de base
FeedFlow: Pousser activement les utilisateurs à ce qui les intéresse
1.TimeLine: Filtre de liste de contenu simple
2.Tri intelligent: Filtrage d'algorithmes intelligents
2.5.3.2 Programme de mise en œuvre
Mode pull: L'utilisateur tire ses propres informations de suivi , Mais trop d'attention peut facilement consommer de la mémoire
Mode Push: Chaque fois qu'un blogueur publie un article, il le renvoie à quelqu'un qu'il suit , Il n'est pas réaliste d'avoir trop de fans
Mode Push - pull: Les gens se divisent en grands V Et les gens ordinaires , Les fans sont divisés en fans actifs et Zombies en poudre , Les gens ordinaires s'attirent vers l'information des gens , Les gens ordinaires envoient leurs messages aux fans
2.5.3.3 Défiler la pagination
En raison de la traditionid Le tri dans l'ordre inverse entraîne une mise à jour continue des données , Tous les originaux limit offsetNon souhaitable,AdoptionredisMoyennesortset, En utilisant un point fixe score Pour s'assurer que la lecture est fixe .redis En utilisant le temps comme scoer
2.5.3.4 Distance du magasin
AdoptionGeo Exemple de calcul d'importation
2.5.3.5 Inscription de l'utilisateur
Parce qu'il y a trop de données d'inscription quotidiennes par utilisateur dans la table de la Bibliothèque ,On peut donc adopterbitBits à stocker, Il suffit de prendre le temps comme keyValeur, Il est également très pratique de demander des statistiques sur les dates
2.5.3.6 PV/UV
StatistiquesPV,UVCeux - ci peuvent être utiliséshyperloglog Quelques erreurs autorisées .
3.Chapitre avancé
3.1. Cache distribué
3.1.1 RDB
RDB:Par défautsave Est l'enregistrement du processus principal ,bgsave- Oui.fork Un sous - processus à enregistrer
3.1.2 AOF
AOF: Instructions d'enregistrement, Et remplacer le précédent aofDocumentation
3.1.3 Cache de processus
Cache distribué:Il y a des frais généraux de réseau pour accéder au cache, Les Clusters peuvent être partagés , Grande quantité de données mises en cache
Cache de processus: Accès plus rapide à la mémoire locale ,Mais la capacité est limitée
3.1.4 Canal
canalC'est une simulation.salvePrends ça.Redis-masterDebinlogLire àslaveExécution.
Chaque fois que les données de la base de données sont modifiées ,canal J'écoute et je modifie les données dans la base de données
3.2. Conception pratique
3.2.1 Conception de base
1.key Conception [Nom de l'entreprise]:[Nom des données]:[id]
2. Supprimerbigkey: Un autre thread supprime asynchrone la valeur
2. **Utilisation recommandéehashStockage**,key Quantité de données disponibles %100Ce genre de,fieldUtiliserkey,value( Très peu de mémoire ,Parce que l'utilisationzipList, La valeur par défaut ne doit pas dépasser keyValeur500)
2. Données de réception par lots :sadd,mset Rangement rapide
2. Redis Le maître et l'esclave peuvent atteindre wNiveauQPS, Essayez de ne pas créer de grappes .
3.2.2 Optimisation du serveur
1. Essayez de ne pas activer la persistance
2.Il est recommandé d'ouvrirAOFPersistance
4.Principes
4.1 Structure des données
4.1.1 Concepts de base
Redis:Au rez - de - chaussée,CC'est écrit
4.1.2 Chaîne dynamiqueSDS
RedisMoyennekey, value Sont des chaînes simples ou multiples SDSPour stocker,SDS L'essence est une structure , Diviser en en en - têtes de chaîne (Longueur de la chaîne d'enregistrement)、Corps(Stocker des données réelles)
4.1.3 IntSet
intDeset: Tableau unique entier , Requête interne avec requête binaire
4.1.4 Dict
Par3Composants partiels:dictHashTableTable de hachage,dictEntry Hash Node ,dictDictionnaire
La composition de la table de hachage est dicEntryCe genre dekey, valueValeur
DictLe dictionnaire contient2Tables de hachage, Pour l'expansion et la contraction , Au rez - de - chaussée se trouve le tableau + Liste de liens pour résoudre hashConflit
(RésumédictLe bas esthashTableau, Il y a des tableaux et des listes unidirectionnelles pour implémenter ,Ce qu'il y a là - dedans, c'estkey, valueDeEntryPaire de clés, Avec un pointeur comme ça SDSObjet)
4.1.5 ZipList
Une liste compressée est une liste d'espaces de mémoire contigus , Aucun lien de pointeur n'a été utilisé , Au lieu de cela, l'adresse du noeud précédent a été enregistrée . Parce que si dict Cette sélection de pointeurs , Trop de fragments de mémoire , Trop d'octets de pointeur utilisés .
4.1.6 QuickList
Le noeud estzipListListe bidirectionnelle,CompatiblezipList Demande trop d'espace mémoire consécutif , Avantages de consommer trop d'espace mémoire avec un pointeur de liste lié .
4.1.7 SkipListTable de saut *
Une liste de sauts est une liste liée , Les éléments sont triés par ordre croissant , Et puis il continue à pointer vers le Haut entre les éléments ,EtMySQL L'indexation est similaire ,Pour faciliter les recherches ultérieures,CURD Aussi efficace qu'un arbre Rouge et noir log(n)
4.1.8 RedisObject
RedisObjectInclus5Type de données,Et puis5 La méthode de codage du milieu et du bas est la table de saut ci - dessus ,zipList,quickListCes.(typerloglog,bitmap,bitmap Le rez - de - chaussée est string,zset)
4.2 Modèle de réseau
4.2.1 IOMultiplexage
Écouter plusieurs services en même temps avec un seul thread .Divisé enselect,poll, epoll.
select Copie du Service d'écoute à chaque fois FD Le passage de l'utilisateur au noyau prend du temps
epoll Mettez le Service d'écoute prêt FDPour sauver, Et à chaque fois, il n'y a pas besoin de traverser tout FD
4.2.2 Comparaison des modèles
Toujours.IO Plus de multiplexage
4.2.3 RedisModèle de réseau
Redis6.0 Plus tard, plusieurs fils ont été introduits ,C'était un seul thread.
4.2.4 RedisStratégie
RedisAdopté pardictC'est enregistré.keyDeTTLTemps
4.2.4.1 Expiration-Supprimer la politique
1. Nettoyage inerte:Chaque recherchekey,Supprimer après expiration
1. Nettoyage périodique: Extraction périodique key,Supprimer après expiration
4.2.4.2 Stratégie d'élimination
8Stratégie: Par défaut, aucun key, La mémoire est pleine et ne permet pas l'écriture de données en ligne
边栏推荐
- How to type multiple spaces when editing CSDN articles
- Estimate blood pressure according to PPG using spectral spectrum time depth neural network [turn]
- C#/VB. Net to add text / image watermarks to PDF documents
- 美庐生物IPO被终止:年营收3.85亿 陈林为实控人
- LeetCode-1279. Traffic light intersection
- Use map function and split function to type multiple elements in one line
- 倒计时2天|腾讯云消息队列数据接入平台(Data Import Platform)直播预告
- First day of rhcsa study
- Master Xuan joined hands with sunflower to remotely control enabling cloud rendering and GPU computing services
- MATLAB中deg2rad和rad2deg函数的使用
猜你喜欢
Based on butterfly species recognition
提前解锁 2 大直播主题!今天手把手教你如何完成软件包集成?|第 29-30 期
打家劫舍III[后序遍历与回溯+动态规划]
How to improve website weight
【论文笔记】TransUNet: Transformers Make StrongEncoders for Medical Image Segmentation
Help improve the professional quality of safety talents | the first stage of personal ability certification and assessment has been successfully completed!
黑马--Redis篇
Yutai micro rushes to the scientific innovation board: Huawei and Xiaomi fund are shareholders to raise 1.3 billion
五金机电行业智能供应链管理系统解决方案:数智化供应链为传统产业“造新血”
全套教学资料,阿里快手拼多多等7家大厂Android面试真题
随机推荐
Camel case with Hungarian notation
Tongyu Xincai rushes to Shenzhen Stock Exchange: the annual revenue is 947million Zhang Chi and Su Shiguo are the actual controllers
Online notes
Reptiles have a good time. Are you full? These three bottom lines must not be touched!
抽象类与抽象方法
Solution of intelligent management platform for suppliers in hardware and electromechanical industry: optimize supply chain management and drive enterprise performance growth
test about BinaryTree
[translation] a GPU approach to particle physics
青龙面板最近的库
C#/VB. Net to add text / image watermarks to PDF documents
能源行业的数字化“新”运维
[paper notes] transunet: transformers make strongencoders for medical image segmentation
The list of people who passed the fifth phase of personal ability certification assessment was published
Method of accessing mobile phone storage location permission under non root condition
Optical blood pressure estimation based on PPG and FFT neural network [translation]
In 50W, what have I done right?
Simple understanding of MySQL database
RedisSystemException:WRONGTYPE Operation against a key holding the wrong kind of value
五金机电行业智能供应链管理系统解决方案:数智化供应链为传统产业“造新血”
包装行业商业供应链管理平台解决方案:布局智慧供应体系,数字化整合包装行业供应链