Was ich heute mit Ihnen teilen möchte, ist verteilte Sperre In diesem Artikel werden fünf Fälle, Diagramme, Quellcodeanalysen usw. verwendet.
Gemeinsame synchronisierte Sperren, Sperren usw. basieren auf einem einzigen JVM ist implementiert, was sollten wir in einem verteilten Szenario tun? Zu diesem Zeitpunkt erschienen verteilte Sperren. JVM的实现的,如果分布式场景下怎么办呢?这时候分布式锁就出现了。
关于分布式的实现方案,在业界流行的有三种:
1、基于数据库
2、基于Redis
3、基于Zookeeper
另外,还有使用etcd、consul
In Bezug auf verteilte Implementierungslösungen gibt es drei beliebte in der Branche: 🎜🎜1 Basierend auf der Datenbank 🎜🎜2 Basierend auf Redis🎜🎜3. Basierend aufZookeeper🎜🎜Darüber hinaus gibt es auch die Verwendung von consul. 🎜
Am häufigsten in der Entwicklung verwendet wird Redis und Zookeeper hat zwei Lösungen, und die komplexeste der beiden Lösungen und die wahrscheinlichste, die Probleme verursacht, ist Redis Implementierungsplan, daher werden wir heute Redis和Zookeeper两种方案,并且两种方案中最复杂的,最容易出问题的就是Redis的实现方案,所以,我们今天就来把Redis实现方案都聊聊。
本文主要内容
分布式锁场景
估计部分朋友还不太清楚分布式的使用场景,下面我简单罗列三种:
案例1
如下代码模拟了下单减库存的场景,我们分析下在高并发场景下会存在什么问题
@RestController
public class IndexController {
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* 模拟下单减库存的场景
* @return
*/
@RequestMapping(value = "/duduct_stock")
public String deductStock(){
// 从redis 中拿当前库存的值
int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));
if(stock > 0){
int realStock = stock - 1;
stringRedisTemplate.opsForValue().set("stock",realStock + "");
System.out.println("扣减成功,剩余库存:" + realStock);
}else{
System.out.println("扣减失败,库存不足");
}
return "end";
}
}
在思考解决方案时我们首先想到CAP原则(一致性、可用性、分区容错性),那么现在的Redis就是满足AP(可用性、分区容错性),如果想要解决该问题我们就需要寻找满足CP(一致性、分区容错性)的分布式系统。首先想到的就是Zookeeper,Zookeeper🎜Durch den Implementierungsmechanismus verteilter Sperren wissen wir, dass in Szenarien mit hoher Parallelität nur erfolgreich gesperrte Anforderungen die Geschäftslogik weiterhin verarbeiten können. Dann kommen alle zum Sperren, aber nur eine Sperre ist erfolgreich und der Rest wartet. Tatsächlich sind verteilte Sperren und hohe Parallelität semantisch widersprüchlich. Obwohl unsere Anforderungen alle gleichzeitig sind, Redis hilft uns, Anfragen zur Ausführung in die Warteschlange zu stellen, was bedeutet, dass wir unsere Parallelität in Serialisierung umwandeln. Bei seriell ausgeführtem Code treten definitiv keine Parallelitätsprobleme auf, die Leistung des Programms wird jedoch definitiv beeinträchtigt.
Als Reaktion auf diese Probleme denken wir erneut über Lösungen nach
🎜🎜🎜Wenn wir über Lösungen nachdenken, denken wir zuerst an die CAP-Prinzip (Konsistenz, Verfügbarkeit, Partitionstoleranz), dann ist der aktuelle Redis erfüllt AP (Verfügbarkeit, Partitionstoleranz). Wenn wir dieses Problem lösen wollen, müssen wir eine Lösung finden, die CP (Konsistenz, Partitionsfehlertoleranz) verteiltes System. Das erste, was mir in den Sinn kommt, ist Zookeeper , Zookeepers Inter-Cluster-Datensynchronisierungsmechanismus besteht darin, dass der Masterknoten beim Empfang der Daten nicht sofort eine Erfolgsrückmeldung an den Client zurückgibt. Zuerst werden die Daten mit den untergeordneten Knoten synchronisiert und dann Benachrichtigen Sie den Client erst, wenn mehr als die Hälfte der Knoten die Synchronisierung erfolgreich abgeschlossen haben.Und wenn der Masternode ausfällt, reicht es laut Zookeeper的Zab协议(Zookeeper原子广播)重新选举的主节点一定是已经同步成功的。
关于第二个提升性能的问题,我们可以参考ConcurrentHashMap的锁分段技术的思想,例如我们代码的库存量当前为1000,那我们可以分为10段,每段100,然后对每段分别加锁,这样就可以同时执行10个请求的加锁与处理,当然有要求的同学还可以继续细分。但其实Redis的Qps已经达到10W+ in Szenarien ohne besonders hohe Parallelität völlig aus.
Das obige ist der detaillierte Inhalt vonVerteiltes Schloss: 5 Fälle, vom Eintritt bis zur Beerdigung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!