来源: 通义千问
import threading
import time
class RedisMountainFastness:
_instance = None
_is_first_init = False # 添加一个类级别的标志
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(RedisMountainFastness, cls).__new__(cls, *args, **kwargs)
return cls._instance
def __init__(self):
if not RedisMountainFastness._is_first_init:
self.store = {}
self.expire_times = {}
threading.Thread(target=self.clear, args=(), daemon=True).start() # 设置为守护线程
RedisMountainFastness._is_first_init = True # 标记为已初始化
# SET 命令
def set(self, key, value, ex=None):
self.store[key] = value
if ex:
self.expire_times[key] = time.time() + ex
# GET 命令
def get(self, key):
if self.is_expired(key):
return None
return self.store.get(key, None)
# HSET 命令
def hset(self, hash_name, key, value):
if self.is_expired(hash_name):
return
if hash_name not in self.store:
self.store[hash_name] = {}
self.store[hash_name][key] = value
# HGET 命令
def hget(self, hash_name, key):
if self.is_expired(hash_name):
return None
hash_map = self.store.get(hash_name, {})
return hash_map.get(key, None)
# HGETALL 命令
def hgetall(self, hash_name):
if self.is_expired(hash_name):
return None
return self.store.get(hash_name, {})
# LPUSH 命令
def lpush(self, list_name, value):
if self.is_expired(list_name):
return
if list_name not in self.store:
self.store[list_name] = []
self.store[list_name].insert(0, value)
# LPOP 命令
def lpop(self, list_name):
if self.is_expired(list_name):
return None
list_data = self.store.get(list_name, [])
if len(list_data) > 0:
return list_data.pop(0)
return None
# INCR 命令
def incr(self, key):
if self.is_expired(key):
return None
if key in self.store:
if isinstance(self.store[key], int) or (isinstance(self.store[key], str) and self.store[key].isdigit()):
self.store[key] = int(self.store[key]) + 1
else:
raise ValueError("Value is not an integer")
else:
self.store[key] = 1
# DELETE 命令
def delete(self, key):
if key in self.store:
del self.store[key]
if key in self.expire_times:
del self.expire_times[key]
# EXPIRE 命令
def expire(self, key, seconds):
self.expire_times[key] = time.time() + seconds
# 检查是否过期
def is_expired(self, key):
expire_time = self.expire_times.get(key, None)
if expire_time and time.time() > expire_time:
del self.store[key]
del self.expire_times[key]
return True
return False
def clear(self):
while True:
expired_keys = []
# 先找出所有过期的键
for k in list(self.store.keys()): # 使用 list 将键转换为列表以避免运行时错误
if self.is_expired(k):
expired_keys.append(k)
# 然后删除这些过期的键
for k in expired_keys:
self.delete(k)
if expired_keys:
print('过期key:', expired_keys)
time.sleep(5) # 每隔5秒检查一次
# 使用示例
redis = RedisMountainFastness()
redis.set('k1', 1)
print(redis.get('k1'))
redis.expire('k1', 10)