zoukankan      html  css  js  c++  java
  • 用redlock实现redis的分布式锁

    本文是一个demo,利用多进程,来模拟使用redis分布式锁的使用场景。本机需要安装redis,python3.7下运行代码。分布式锁用redlock这个包实现,实现步骤分三步:

    1. 实例化锁:rlock = RedLock('test',[{'host': 'localhost','port': 6379,'db': 0,}])
    2. 获取锁:rlock.acquire(),获取锁之后才能执行程序。
    3. 释放锁:rlock.release(),程序执行完之后,要释放锁,否者其他程序就阻塞,一直执行不了。

    完整代码如下:

    # -*- coding: utf-8 -*-
    import os
    import arrow
    import redis
    from multiprocessing import Pool
    from redlock.lock import RedLock
    
    HOT_KEY = 'count'
    r = redis.Redis(host='localhost', port=6379)
    
    def seckilling():
        name = os.getpid()
        v = r.get(HOT_KEY)
        if int(v) > 0:
            print (name, ' decr redis.')
            r.decr(HOT_KEY)
        else:
            print (name, ' can not set redis.', v)
    #
    def run_without_lock(name):
        while True:
            if arrow.now().second % 5 == 0:
                seckilling()
                return
    
    
    rlock = RedLock('test',[{'host': 'localhost','port': 6379,'db': 0,}])
    def run_with_redis_lock(name):
        while True:
            if arrow.now().second % 5 == 0:
                 # 二,获取锁
                if rlock.acquire():
                    seckilling()
                    #  释放锁
                    rlock.release()
                    return
    if __name__ == '__main__':
        p = Pool(80)
        r.set(HOT_KEY, 1)
    
        for i in range(80):
            # p.apply_async(run_without_lock, args=(i,))
            p.apply_async(run_with_redis_lock, args=(i,))
        print ('now 16 processes are going to get lock!')
        p.close()
        p.join()
        print('All subprocesses done.')
    

      使用锁的代码,主要是:

    rlock = RedLock('test',[{'host': 'localhost','port': 6379,'db': 0,}])
    def run_with_redis_lock(name):
        while True:
            if arrow.now().second % 5 == 0:
                 # 二,获取锁
                if rlock.acquire():
                    seckilling()
                    #  释放锁
                    rlock.release()
                    return

     使用redlock得步骤很简单,总结出来,一共四步:

    #  一,实例化一把锁 rlock
    from redlock.lock import RedLock

    rlock = RedLock('test',[{'host': 'localhost','port': 6379,'db': 0,}])
    # 二,获取锁
    if rlock.acquire():
        #  三,需要锁住形成阻塞得程序
        seckilling()
        #  四,释放锁
        rlock.release()

    总结,我们使用锁的原因,就是让并发的程序形成阻塞,并发可以引起的问题是数据不一致的情况,使用锁,形成阻塞,排队使用数据,就不会造成数据不一致的问题了,当然了,阻塞肯定会降低效率了,速度要慢很多。

  • 相关阅读:
    动态Webapi参考资料
    解决异步事务好文章
    .net core 插件开发
    端口被占用代码
    性能测试
    .NET/.NET Core 单元测试:Specflow
    Autofac 替换默认控制器骚操作
    Swagger非常好的文章
    sqlserver入门到精通(2016安装教程)
    springboot 学习之路 27(实现ip白名单功能)
  • 原文地址:https://www.cnblogs.com/chaojiyingxiong/p/10862232.html
Copyright © 2011-2022 走看看