当前位置:网站首页>Explication détaillée de l'instruction Scan avec redis
Explication détaillée de l'instruction Scan avec redis
2022-01-15 02:28:44 【Danny... Idea】
Utilisé dans l'environnement de productionkeysLes instructions peuvent facilement entraîner un blocage des demandes dans un court laps de temps,Cette condition est mortelle dans un environnement hautement simultané,Il est donc nécessaire d'éviter autant que possible que cela se produise.
Quelques requêtes couramment utiliséeskeyDirectives:
scan
jedisComment utiliser:
public List<String> scanAll(String cursor, String pattern, Integer limit) {
try (Jedis jedis = iRedisFactory.getConnection()) {
List<String> scanList = new LinkedList<>();
ScanParams scanParams = new ScanParams();
scanParams.match(pattern);
scanParams.count(limit);
while (true) {
long begin = System.currentTimeMillis();
ScanResult<String> scanResult = jedis.scan(cursor, scanParams);
if (ScanParams.SCAN_POINTER_START.equals(scanResult.getCursor())) {
break;
}
System.out.println("Ça prend du temps:" + (System.currentTimeMillis() - begin) + "ms, Nombre de requêtes :" + scanResult.getResult().size());
scanList.addAll(scanResult.getResult());
cursor = scanResult.getCursor();
}
return scanList;
} catch (Exception e) {
log.error("jedis scanAll has error, error is ", e);
}
return null;
}
Bien qu'il soit utilisé scan La complexité de la directive o(n) Il y aura un blocage partiel , Mais comme il s'agit de demandes multiples , C'est l'équivalent de keys La directive est divisée en plusieurs petites recherches , Réduire la durée du blocage .
sscan
jedisComment utiliser
public List<String> sScanAll(String key,String cursor, String pattern, Integer limit) {
try(Jedis jedis = iRedisFactory.getConnection()) {
List<String> resultList = new LinkedList<>();
while (true) {
ScanResult<String> scanResult = jedis.sscan(key,cursor);
cursor = scanResult.getCursor();
resultList.addAll(scanResult.getResult());
if (ScanParams.SCAN_POINTER_START.equals(cursor)){
break;
}
}
return resultList;
}catch (Exception e){
log.error("jedis sscanAll has error, error is ", e);
}
return null;
}
En fait...sscan Les instructions combinent les noms pour deviner ,C'est unset Instructions de traversée utilisées par la collection , La comparaison est recommandée pour set Utilisation de la traversée dans la collection , Par exemple, quand notre set Quand il y a trop d'éléments de collection ,Utilisation directesmembers Les commandes sont susceptibles de causer des blocages ,Pour le momentsscan La directive peut réduire les cas de blocage .
hscan
jedisComment utiliser
public Map<String,String> hScanAll(String key, String cursor, String pattern, Integer limit) {
try(Jedis jedis = iRedisFactory.getConnection()) {
ScanParams scanParams = new ScanParams();
scanParams.match(pattern);
scanParams.count(limit);
Map<String,String> resultList = new HashMap<>();
while (true) {
ScanResult scanResult = jedis.hscan(key,cursor,scanParams);
cursor = scanResult.getCursor();
if (ScanParams.SCAN_POINTER_START.equals(cursor)){
break;
}
List<Map.Entry<String,String>> result = scanResult.getResult();
for (Map.Entry<String, String> entry : result) {
resultList.put(entry.getKey(),entry.getValue());
}
}
return resultList;
}catch (Exception e){
log.error("jedis sscanAll has error, error is ", e);
}
return null;
}
C'est unhashmap Instructions de traversée utilisées par la collection
zscan
jedisComment utiliser
public List<String> zScanAll(String key, String cursor, String pattern, Integer limit) {
try(Jedis jedis = iRedisFactory.getConnection()) {
ScanParams scanParams = new ScanParams();
scanParams.match(pattern);
scanParams.count(limit);
List<String> resultList = new LinkedList<>();
while (true) {
ScanResult scanResult = jedis.zscan(key,cursor,scanParams);
cursor = scanResult.getCursor();
if (ScanParams.SCAN_POINTER_START.equals(cursor)){
break;
}
resultList.addAll(scanResult.getResult());
}
return resultList;
}catch (Exception e){
log.error("jedis sscanAll has error, error is ", e);
}
return null;
}
Il s'agit d'une instruction de traversée utilisée pour les collections ordonnées
InCentos Cas d'exécution de ces instructions sur le système d'exploitation :
scanDirectives
redis 127.0.0.1:6379> scan 0 MATCH *11*
1) "288"
2) 1) "key:911"
redis 127.0.0.1:6379> scan 288 MATCH *11*
1) "224"
2) (empty list or set)
redis 127.0.0.1:6379> scan 224 MATCH *11*
1) "80"
2) (empty list or set)
redis 127.0.0.1:6379> scan 80 MATCH *11*
1) "176"
2) (empty list or set)
redis 127.0.0.1:6379> scan 176 MATCH *11* COUNT 1000
1) "0"
2) 1) "key:611"
2) "key:711"
3) "key:118"
4) "key:117"
5) "key:311"
6) "key:112"
7) "key:111"
8) "key:110"
9) "key:113"
10) "key:211"
11) "key:411"
12) "key:115"
13) "key:116"
14) "key:114"
15) "key:119"
16) "key:811"
17) "key:511"
18) "key:11"
sscanDirectives
> sscan vip-info-set 0 count 10
0
[[1001]]
zscanDirectives
> zscan review:222 0 match * count 10
0
idea
1
idea2
2
idea3
3
idea4
4
hscanDirectives
> hscan user-map 0 match * count 10
0
1
user1
2
user2
3
user3
SCANOrdre de traversée de
À propos descanOrdre de traversée de la commande, On peut voir plus en détail .
> keys *
user
test-key-1
test-key-3
test-key-4
test-key-2
> scan 0 match * count 1
2
test-key-3
> scan 2 match * count 1
6
user
> scan 6 match * count 1
1
test-key-4
> scan 1 match * count 1
7
test-key-1
> scan 7 match * count 1
0
test-key-2
La nôtre.RedisOui.3- Oui.key,Nous ne traversons que les éléments d'un tableau unidimensionnel à la fois.Comme indiqué ci - dessus,SCANL'ordre de traversée de la commande est
0->2->6->1->7->0
Cet ordre semble étrange.C'est un peu compréhensible si on le convertit en binaire.Nous avons constaté que chaque fois que cette séquence est élevée plus1De.Addition au binaire ordinaire,C'est l'addition de droite à gauche、Carry.Et cette séquence est ajoutée de gauche à droite、Carrousel.
000->010->110->001->111->000
Alors pourquoi?redis L'auteur de ?
Cet endroit implique redisDerehashFonctionnement, Supposons que notre index original soit :
000->100->010->110->001->101->011->111
Après une série d'agrandissements , L'index devient :
0000->1000->0100->1100->0010->1010->0110->1110->0001->1001->1101->1111
Il s'est avéré qu'il était accroché àxxxTous les éléments ci - dessous sont assignés à0xxxEt1xxxEn bas..Quand on est sur le point de traverser010Heure,dictC'est fait.rehash,À ce moment - là,,scanLes commandes seront exécutées à partir de0100Commencez à traverser,Et000Et100(Original00Éléments suspendus en dessous)Il n'y aura plus de répétition.
Revenons à l'état du rétrécissement.HypothèsesdictDe4Bit zoom to3Bits,Quand vous êtes sur le point de traverser1110Heure,dictUn rétrécissement s'est produit,À ce moment - là,scanVa traverser011.À ce moment - là,011 Les éléments suivants sont itérés à plusieurs reprises ,Mais...011Aucun des éléments précédents n'est répété.Alors...,Il peut encore y avoir des éléments répétitifs à l'échelle.Par conséquent, il est utiliséscanAu moment de la commande, Des éléments répétitifs apparaissent parfois .
版权声明
本文为[Danny... Idea]所创,转载请带上原文链接,感谢
https://chowdera.com/2022/01/202201080559031435.html
边栏推荐
- The world is always hostile to good people.
- Re regular matching findall (. +?) Match any content that conforms to a certain format (regular matching catch bullet screen)
- Android中的羊角符,面試看這個就够了
- 數據分析八大模型:OGSM模型
- La corne d'agneau d'Android, c'est assez pour l'interview
- Huit modèles d'analyse des données: modèle ogsm
- Exemple d'application de linq
- Utilisez S7. Net communication library
- Écrire La Bibliothèque de communication Modbus TCP
- Lire le profil INI
猜你喜欢
-
Utilisez S7. Net read Siemens 1500plc
-
Halcon joint C # Programming Experiment
-
Utiliser nmodbus4 pour lire les données à la fois RTU et TCP
-
Tiktok Data Analysis options Platform - tichoo Data
-
MySQL review: create tables, MySQL data types, primary key constraints, primary key
-
Linear Algebra: matrix review
-
Review of Linear Algebra: determinant
-
The digital RMB cross-border payment test has been continuously promoted, and mainland residents can also shop in Hong Kong in the future
-
Thesis classification and writing basis
-
YC Framework version update: v1.0 zero point two
随机推荐
- Analyse des données tichoo
- Tiktok data analysis platform
- Partage de l'industrie | tichoo Data to attend 2022 Overseas Short video Industry Summit
- [ticoo Information Station] tiktok and Cross - Border E - commerce Weekly Report
- Options d'analyse des données ticoo {infostation}
- Partage de l'industrie | Lu Shidong, PDG de tichoo Data Outlook Global Video e - commerce future Blueprint
- [ticoo Information Station]
- Noël Black Five
- YC Framework version update: v1.0 zero point two
- Lucene分词器
- Gbase 8A slow SQL optimization case
- 微服务系列--聊聊微服务治理中的一些感悟
- 线程池的经典应用场景
- [web security from getting started to giving up] 07_ Insecure file download and upload vulnerability
- 如何落地一款重试组件
- 一起聊聊设计原则
- 大话Redis系列--深入探讨多路复用(上)
- 大话Redis系列--实战案例总结(下)
- 大话Redis系列--实战案例总结(上)
- JVM系列 -- G1与低延迟垃圾收集器
- JVM系列 -- 深入剖析垃圾收集器
- JVM系列--内存回收
- JVM系列--对象内存分配技术分析
- JVM系列--虚拟机的内存管理
- 系统性能瓶颈排查技术总结
- 使用redis的scan指令详解
- 实战--分布式id发号器
- 分布式事务之超详细的Seata实践记录
- TCP time_wait
- IP数据报头部
- 最大基环内向树
- MySQL实战45讲 学习笔记(七)
- MySQL实战45讲 学习笔记(六)
- Android从零开始搭建MVVM架构(1)(1),kotlin匿名函数
- Android事件分发机制五:面试官你坐啊,安卓上机面试题
- There will be two different stages between the breakthrough of science and technology and its real transformation into an inclusive technology
- [leetcode] force deduction 200 Number of islands
- HashShuffleManager
- Altium Designer
- Android construit l'architecture mvvm à partir de zéro (1) (1), fonction anonyme kotlin