分布式锁-Redis方案

 1 #!/usr/bin/env python
 2 # coding=utf-8
 3
 4 import time
 5 import redis
 6
 7 class RedisLock(object):
 8     def __init__(self, key):
 9         self.rdcon = redis.Redis(host=‘‘, port=6379, password="", db=1)
10         self._lock = 0
11         self.lock_key = "%s_dynamic_test" % key
12
13     @staticmethod
14     def get_lock(cls, timeout=10):
15         while cls._lock != 1:
16             timestamp = time.time() + timeout + 1
17             cls._lock = cls.rdcon.setnx(cls.lock_key, timestamp)
18        # 注意下方括号的范围
19             if cls._lock == 1 or (time.time() > cls.rdcon.get(cls.lock_key) and time.time() > cls.rdcon.getset(cls.lock_key, timestamp)):
20                 print "get lock"
21                 break
22             else:
23                 time.sleep(0.3)
24
25     @staticmethod
26     def release(cls):
27         if time.time() < cls.rdcon.get(cls.lock_key):
28             print "release lock"
29             cls.rdcon.delete(cls.lock_key)
30
31 def deco(cls):
32     def _deco(func):
33         def __deco(*args, **kwargs):
34             print "before %s called [%s]."%(func.__name__, cls)
35             cls.get_lock(cls)
36             try:
37                 return func(*args, **kwargs)
38             finally:
39                 cls.release(cls)
40         return __deco
41     return _deco
42
43 @deco(RedisLock("112233"))
44 def myfunc():
45     print "myfunc() called."
46     time.sleep(20)
47
48
49 if __name__ == "__main__":
50     myfunc()

eg2:

 1 import redis
 2 import time, datetime
 3
 4
 5 def acquire_lock(conn, lockname, identifier, expire=10):
 6     if conn.setnx(lockname, identifier):
 7         conn.expire(lockname, expire)
 8         return identifier
 9     elif not conn.ttl(lockname):
10         conn.expire(lockname, expire)
11
12     return False
13
14
15 def release_lock(conn, lockname, identifier):
16     pipe = conn.pipeline(True)
17     while True:
18         try:
19             pipe.watch(lockname)
20             if pipe.get(lockname) == identifier:
21                 pipe.multi()
22                 pipe.delete(lockname)
23                 pipe.execute()
24                 return True
25             pipe.unwatch()
26             break
27         except redis.exceptions.WatchError:
28             pass
29
30     # we lost the lock
31     return False
32
33
34 conn = redis.Redis(host=‘localhost‘, port=6379, db=0)
35
36 # 1 identifier
37 # 2 False
38 # 11 True
39 # 22 False
40 # 33 barx2
41 # 44 True
42
43 ret = acquire_lock(conn, "lockname", "identifier", 3)
44 print "1", ret
45 ret = acquire_lock(conn, "lockname", "identifier", 3)
46 print "2", ret
47 ret = release_lock(conn, "lockname", "identifier")
48 print "11", ret
49 ret = release_lock(conn, "lockname", "identifier")
50 print "22", ret
51
52 ret = acquire_lock(conn, "footest", "bartest", 10)
53 print "33", ret

原文地址:https://www.cnblogs.com/lzc978/p/11358336.html

时间: 2024-10-10 12:00:56

分布式锁-Redis方案的相关文章

面试官:聊聊你对分布式锁技术方案的理解

前言 由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题,那么就要利用分布式锁来解决这些问题. 第一步,自身的业务场景: 在我日常做的项目中,目前涉及了以下这些业务场景: 场景一:比如分配任务场景.在这个场景中,由于是公司的业务后台系统,主要是用于审核人员的审核工作,并发量并不是很高,而且任务的分配规则设计成了通过审核人员每次主动的请求拉取,然后服务端从任务池中随机的选取任务进行分配.这个场景看到这里你会觉得比较单一,但是实际的分配过程中,由于涉及到了按

分布式锁实现方案

一.单机模式 在这种情况下,如果我们实现锁可以使用synchronized或ReentrantLock,但是在分布式情况下,它们最多只能锁住当前JVM的线程,对于其它server的线程无能为力.那么怎么处理呢? 二.分布式锁 1.基于数据库表做乐观锁 一般是通过为数据库表添加一个 "version"字段来实现读取出数据时,将此版本号一同读出,之后更新时,对此版本号加1.在更新过程中,会对版本号进行比较,如果是一致的,没有发生改变,则会成功执行本次操作:如果版本号不一致,则会更新失败.

分布式&amp;分布式锁&amp;Redis分布式锁

一.什么是分布式分布式的CAP理论告诉我们:任何一个分布式系统都无法同时满足一致性(Consistency).可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项.C:一致性,在分布式环境下,一致性是指多个节点同一时刻要有同样的值:A:可用性,服务一直保持可用状态,当用户发出一个请求,服务能在一定时间内返回结果:P:分区容忍性,即使单个组件不可用,操作依然可以完成:目前很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是

分布式锁--redis(集群)

原文链接:https://blog.csdn.net/weixin_38003389/article/details/89434629 redis 集群做分布式锁,我们使用 Redisson. 框架 版本 Spring Boot 2.0.3.RELEASE Spring Cloud Finchley.RELEASE redis redis-4.0.11 JDK 1.8.x maven配置 <parent> <groupId>org.springframework.boot</

两种分布式锁实现方案(一)

一.为何使用分布式锁?当应用服务器数量超过1台,对相同数据的访问可能造成访问冲突(特别是写冲突).单纯使用关系数据库比如MYSQL的应用可以借助于事务来实现锁,也可以使用版本号等实现乐观锁,最大的缺陷就是可用性降低(性能差).对于GLEASY这种满足大规模并发访问请求的应用来说,使用数据库事务来实现数据库就有些捉襟见肘了.另外对于一些不依赖数据库的应用,比如分布式文件系统,为了保证同一文件在大量读写操作情况下的正确性,必须引入分布式锁来约束对同一文件的并发操作. 二.对分布式锁的要求1.高性能(

分布式锁-redis

@Autowired private RedisTemplate<String, Object> redisTemplate; /** * 获取分布式锁 - 过期时间 * @param key * @param expireTime 毫秒 * @return */ public Object getExpiredLock(String key, Long expireTime) { Long value = System.currentTimeMillis() + expireTime; re

论JAVA实现MYSQL 行级锁(分布式锁实现方案一)

@Override @Transactional public String getCustomerId() { // return String.valueOf(getSequenceId(SEQ_CUSTOMER_ITEM_CODE.seqName)); String type=SEQ_CUSTOMER_ITEM_CODE.seqName; if (!sequenceValueMap.containsKey(type)) { SequenceDO sequenceDO = sequenceD

Memcached 和 Redis 分布式锁方案

分布式缓存,能解决单台服务器内存不能无限扩张的瓶颈.在分布式缓存的应用中,会遇到多个客户端同时争用的问题.这个时候,需要用到分布式锁,得到锁的客户端才有操作权限. Memcached 和 Redis 是常用的分布式缓存构建方案,下面列举下基于Memcached 和 Redis 分布式锁的实现方法. Memcached 分布式锁 Memcached 可以使用 add 命令,该命令只有KEY不存在时,才进行添加,或者不会处理.Memcached 所有命令都是原子性的,并发下add 同一个KEY ,只

分布式锁1 Java常用技术方案

前言:       由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题,那么就要利用分布式锁来解决这些问题.所以自己结合实际工作中的一些经验和网上看到的一些资料,做一个讲解和总结.希望这篇文章可以方便自己以后查阅,同时要是能帮助到他人那也是很好的. ===============================================================长长的分割线===================================