redis_crud.py 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. # -*- coding: utf-8 -*-
  2. import pickle
  3. from typing import Any, Awaitable
  4. from redis.asyncio.client import Redis
  5. from app.core.logger import log
  6. class RedisCURD:
  7. """缓存工具类"""
  8. def __init__(self, redis: Redis) -> None:
  9. """初始化"""
  10. self.redis = redis
  11. async def mget(self, keys: list) -> list:
  12. """批量获取缓存
  13. 参数:
  14. - keys (list): 键名列表
  15. 返回:
  16. - list: 返回缓存值列表,如果获取失败则返回空列表
  17. """
  18. try:
  19. data = await self.redis.mget(*[str(key) for key in keys])
  20. return data
  21. except Exception as e:
  22. log.error(f"批量获取缓存失败: {str(e)}")
  23. return []
  24. async def get_keys(self, pattern: str = "*") -> list:
  25. """获取缓存键名
  26. 参数:
  27. - pattern (str, optional): 匹配模式,默认值为"*"。
  28. 返回:
  29. - list: 返回匹配的缓存键名列表,如果获取失败则返回空列表
  30. """
  31. try:
  32. keys = await self.redis.keys(f"{pattern}")
  33. return keys
  34. except Exception as e:
  35. log.error(f"获取缓存键名失败: {str(e)}")
  36. return []
  37. async def get(self, key: str) -> Any:
  38. """获取缓存
  39. 参数:
  40. - key (str): 缓存键名
  41. 返回:
  42. - Any: 返回缓存值,如果缓存不存在则返回None
  43. """
  44. try:
  45. data = await self.redis.get(f"{key}")
  46. if data is None:
  47. return None
  48. return data
  49. except Exception as e:
  50. log.error(f"获取缓存失败: {str(e)}")
  51. return None
  52. async def set(self, key: str, value: Any, expire: int | None = None) -> bool:
  53. """设置缓存
  54. 参数:
  55. - key (str): 缓存键名
  56. - value (Any): 缓存值
  57. - expire (int | None, optional): 过期时间,单位为秒,默认值为None。
  58. 返回:
  59. - bool: 如果设置缓存成功则返回True,否则返回False
  60. """
  61. try:
  62. # 根据数据类型选择序列化方式
  63. if isinstance(value, (int, float, str)):
  64. data = str(value).encode('utf-8')
  65. else:
  66. try:
  67. data = pickle.dumps(value)
  68. except Exception as e:
  69. log.error(f"序列化数据失败: {str(e)}")
  70. return False
  71. await self.redis.set(
  72. name = key,
  73. value = data,
  74. ex=expire
  75. )
  76. return True
  77. except Exception as e:
  78. log.error(f"设置缓存失败: {str(e)}")
  79. return False
  80. async def delete(self, *keys: str) -> bool:
  81. """删除缓存
  82. 参数:
  83. - keys (str): 缓存键名
  84. 返回:
  85. - bool: 如果删除缓存成功则返回True,否则返回False
  86. """
  87. try:
  88. await self.redis.delete(*keys)
  89. return True
  90. except Exception as e:
  91. log.error(f"删除缓存失败: {str(e)}")
  92. return False
  93. async def clear(self, pattern: str = "*") -> bool:
  94. """清空缓存
  95. 参数:
  96. - pattern (str, optional): 匹配模式,默认值为"*"。
  97. 返回:
  98. - bool: 如果清空缓存成功则返回True,否则返回False
  99. """
  100. try:
  101. keys = await self.redis.keys(f"{pattern}")
  102. if keys:
  103. await self.redis.delete(*keys)
  104. return True
  105. except Exception as e:
  106. log.error(f"清空缓存失败: {str(e)}")
  107. return False
  108. async def exists(self, key: str) -> bool:
  109. """判断缓存是否存在
  110. 参数:
  111. - key (str): 缓存键名
  112. 返回:
  113. - bool: 如果缓存存在则返回True,否则返回False
  114. """
  115. try:
  116. return await self.redis.exists(f"{key}")
  117. except Exception as e:
  118. log.error(f"判断缓存是否存在失败: {str(e)}")
  119. return False
  120. async def ttl(self, key: str) -> int:
  121. """获取缓存过期时间
  122. 参数:
  123. - key (str): 缓存键名
  124. 返回:
  125. - int: 返回缓存过期时间,单位为秒,如果缓存没有设置过期时间则返回-1
  126. """
  127. try:
  128. return await self.redis.ttl(f"{key}")
  129. except Exception as e:
  130. log.error(f"获取缓存过期时间失败: {str(e)}")
  131. return -1
  132. async def expire(self, key: str, expire: int) -> bool:
  133. """设置缓存过期时间
  134. 参数:
  135. - key (str): 缓存键名
  136. - expire (int): 过期时间,单位为秒
  137. 返回:
  138. - bool: 如果设置缓存过期时间成功则返回True,否则返回False
  139. """
  140. try:
  141. return await self.redis.expire(f"{key}", expire)
  142. except Exception as e:
  143. log.error(f"设置缓存过期时间失败: {str(e)}")
  144. return False
  145. async def info(self) -> dict:
  146. """获取缓存信息
  147. 返回:
  148. - dict: 返回缓存信息字典,如果获取失败则返回空字典
  149. """
  150. try:
  151. return await self.redis.info()
  152. except Exception as e:
  153. log.error(f"获取缓存信息失败: {str(e)}")
  154. return {}
  155. async def db_size(self) -> int:
  156. """获取数据库大小
  157. 返回:
  158. - int: 返回数据库大小,如果获取失败则返回0
  159. """
  160. try:
  161. return await self.redis.dbsize()
  162. except Exception as e:
  163. log.error(f"获取数据库大小失败: {str(e)}")
  164. return 0
  165. async def commandstats(self) -> dict:
  166. """获取命令统计信息
  167. 返回:
  168. - dict: 返回命令统计信息字典,如果获取失败则返回空字典
  169. """
  170. try:
  171. return await self.redis.info("commandstats")
  172. except Exception as e:
  173. log.error(f"获取命令统计信息失败: {str(e)}")
  174. return {}
  175. async def hash_set(self, name: str, key: str, value: Any) -> bool:
  176. """设置哈希缓存
  177. 参数:
  178. - name (str): 哈希缓存名称
  179. - key (str): 哈希缓存键名
  180. - value (Any): 哈希缓存值
  181. 返回:
  182. - bool: 如果设置哈希缓存成功则返回True,否则返回False
  183. """
  184. try:
  185. self.redis.hset(name=name, key=key, value=value)
  186. return True
  187. except Exception as e:
  188. log.error(f"设置哈希缓存失败: {str(e)}")
  189. return False
  190. async def hash_get(self, name: str, keys: list[str]) -> Awaitable[list[Any]] | list[Any]:
  191. """获取哈希缓存
  192. 参数:
  193. - name (str): 哈希缓存名称
  194. - keys (list[str]): 哈希缓存键名列表
  195. 返回:
  196. - Awaitable[list[Any]] | list[Any]: 返回哈希缓存值列表,如果获取失败则返回空列表
  197. """
  198. try:
  199. data = self.redis.hmget(name=name, keys=keys)
  200. return data
  201. except Exception as e:
  202. log.error(f"获取哈希缓存失败: {str(e)}")
  203. return []