Heim  >  Artikel  >  Datenbank  >  So verwenden Sie Redis-Sperren, um Parallelitätsprobleme zu lösen

So verwenden Sie Redis-Sperren, um Parallelitätsprobleme zu lösen

尚
nach vorne
2020-05-07 09:09:545979Durchsuche

So verwenden Sie Redis-Sperren, um Parallelitätsprobleme zu lösen

Verwenden Sie die Redis-Sperre, um Parallelitätsprobleme zu behandeln und sicherzustellen, dass nur eine Instanz eines Multiprozesses ausgeführt wird. Wenn die laufende Instanz ausfällt, kann eine der anderen Instanzen hochgefahren werden dass es nur eine Instanz gibt, die ausgeführt wird.

import redis
r = redis.Redis(...)

last_heart = 0		# 记录上一次得到的锁心跳
free_lock_try = 6	# 锁无心跳的最大次数 

while not r.setnx('mylock', 1):
    now_heart = r.get('mylock')
    print(f"没获取到锁,now_heart={now_heart},last_heart={last_heart},free_lock_try={free_lock_try}")
    if now_heart == last_heart:
        free_lock_try = free_lock_try - 1
        if free_lock_try == 0:	# 锁已经1分钟没有心跳了
            old_heart = r.getset('mylock', 1)	# 将lock重置为1,并返回set之前的心跳值
            if old_heart < now_heart:
                time.sleep(10)
                continue
            else:
                break	# 成功获取到锁,退出循环
    else:
        free_lock_try = 6	# 锁有心跳,重置free_lock_try值
        last_heart = now_heart
    time.sleep(10)

def producer_exit():
    """程序正常退出时候自动清理锁"""
    r.delete(&#39;mylock&#39;)
import atexit
atexit.register(producer_exit)

# 业务代码
while True:
  r.incr(&#39;mylock&#39;)	# 让锁心跳加一
  ...

Sehen wir uns an, welche Probleme dieses Programm bei gleichzeitigen Sperren löst:

1. Bei hoher Parallelität können mehrere Prozesse nicht gleichzeitig Sperren erhalten. Hier wird Redis.setnx verwendet. Wenn die Sperre bereits vorhanden ist, können andere Prozesse die Sperre nicht zurücksetzen und die Sperre erhalten. Wenn mehrere Prozesse außerdem feststellen, dass gleichzeitig eine Sperre und kein Heartbeat vorhanden ist, setzen sie den Heartbeat mit redis.getset auf 1 zurück. Der Satz kann erfolgreich sein, aber der von mehreren Prozessen erhaltene Wert ist unterschiedlich Die Sperre wird tatsächlich erworben. Der Prozess gibt den Herzschlag des vorherigen Prozesses zurück, während andere Prozesse 1 erhalten.

2. Der gesperrte Prozess wird normal beendet. Sie können die Prozess-Exit-Funktion zum Löschen der Sperre verwenden. Sie müssen jedoch mehrere Heartbeats abwarten beim nächsten Start

3. Der gesperrte Prozess wird unerwartet beendet und der Heartbeat wird nach dem Beenden nicht mehr erhöht. Nachdem die Anzahl der free_lock_try überschritten wurde, werden andere Prozesse zurückgesetzt und erhalten die Sperre

4. Alle Prozesse werden unerwartet beendet. Sperren betreffen nicht den Daemon-Prozess.

Weitere Redis-Kenntnisse finden Sie in der Spalte Redis-Einführungs-Tutorial.

Das obige ist der detaillierte Inhalt vonSo verwenden Sie Redis-Sperren, um Parallelitätsprobleme zu lösen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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