程序员必懂的Redis技术实战

  发布时间:2025-11-05 03:15:43   作者:玩站小弟   我要评论
复制1.importtime 2.importuuid 3.fromredisimportStrictRedis,ConnectionPool 。
程序员必懂的Redis技术实战
复制1. import time 2. import uuid    3. from redis import StrictRedis,程序 ConnectionPool    4. import threading    5.     6. class CollectRedis:    7.     # 创建redis操作类     8.     def __init__(self):    9.         self.host = "1.1.1.1" 10.         self.port = 6379    11.         self.db = 5    12.    13.     @property    14.     def redis_session(self):    15.         _session = getattr(self, "__redis_session", None)    16.         if _session:    17.             return _session    18.         redis_pool = ConnectionPool(host=self.host, port=self.port, db=self.db)    19.         _session = StrictRedis(connection_pool=redis_pool)    20.         setattr(self, "__redis_session", _session)    21.         return _session    22.         23.     # 获取锁    24.     def get_lock(self, lock_key):    25.         return self.redis_session.get(lock_key)    26.         27.     # 设置锁     28.     def set_lock(self, lock_key, value, timeout=300):    29.         session = self.redis_session    30.         tag = session.setnx(lock_key, value)    31.         # 如果key能创建成功则为该key设置一个超时时间,这个相当于锁的服务器托管员必有效时间    32.         # 如果没有超时时间则会导致程序死锁    33.         if tag:    34.             session.expire(lock_key, timeout)    35.         return tag    36.         37.     # 删除锁也就是亿华云释放锁    38.     def delete_lock(self, lock_key):    39.         return self.redis_session.delete(lock_key)    40.     41. # 获取锁资源方法    42. def acquire_lock(lock_name, time_out=300):    43.     identifier = str(uuid.uuid4())    44.     end = time.time() + time_out + 30    45.     redis_connect = CollectRedis()    46.     # 如果不能获取锁资源则线程一直挂起直到获取锁资源或者超时    47.     while time.time() < end:    48.         if redis_connect.set_lock(lock_name, identifier, timeout=time_out):    49.             return identifier    50.         time.sleep(0.01)    51.     returnFalse 52.     53. # 释放锁资源    54. def release_lock(lock_name, identifier):    55.     redis_connect = CollectRedis()    56.     value = redis_connect.get_lock(lock_name)    57.     if not value:    58.         returnTrue 59.     if value == identifier:    60.         redis_connect.delete_lock(lock_name)    61.         returnTrue 62.     returnFalse 63.     64.     65. def resource_lock(lock_name, timeout=10):    66.     """   67.     并发锁装饰器函数   68.     :param lock_name:   69.     :param timeout:   70.     :return:   71.     """    72.     def _outfunc(func):    73.         def inner_func(*args, **kwargs):    74.             identifier = acquire_lock(lock_name, time_out=timeout)    75.             if not identifier:    76.                 raise Exception("获取({})锁资源失败".format(lock_name))    77.             try:    78.                 result = func(*args, **kwargs)    79.                 release_lock(lock_name, identifier)    80.             except Exception as e:    81.                 # 程序出现异常时主动释放锁资源    82.                 release_lock(lock_name, identifier)    83.                 raise Exception(e.args)    84.             return result    85.         return inner_func    86.     return _outfunc    1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.高防服务器
  • Tag:

相关文章

最新评论