cache.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. from sql import cache
  2. from redis import RedisError
  3. from functools import wraps
  4. from datetime import datetime
  5. def __try_redis(ret=None):
  6. def try_redis(func):
  7. @wraps(func)
  8. def try_func(*args, **kwargs):
  9. try:
  10. res = func(*args, **kwargs)
  11. except RedisError:
  12. cache.logger.error(f"Redis error with {args} {kwargs}", exc_info=True, stack_info=True)
  13. return ret
  14. return res
  15. return try_func
  16. return try_redis
  17. @__try_redis(None)
  18. def read_msg_from_cache(msg_id: int):
  19. msg = cache.hgetall(f"cache:msg:{msg_id}")
  20. if len(msg) != 4:
  21. return None
  22. return [msg.get("Email", ""), msg.get("Content"), msg.get("UpdateTime", "0"), bool(msg.get("Secret", False))]
  23. @__try_redis(None)
  24. def write_msg_to_cache(msg_id: int, email: str, content: str, update_time: str | datetime, secret: bool):
  25. cache_name = f"cache:msg:{msg_id}"
  26. cache.delete(cache_name)
  27. cache.hset(cache_name, mapping={
  28. "Email": email,
  29. "Content": content,
  30. "UpdateTime": str(update_time),
  31. "Secret": str(secret)
  32. })
  33. cache.expire(cache_name, 3600)
  34. @__try_redis(None)
  35. def delete_msg_from_cache(msg_id: int):
  36. cache.delete(f"cache:msg:{msg_id}")
  37. @__try_redis(None)
  38. def get_msg_cout_from_cache():
  39. count = cache.get("cache:msg_count")
  40. if count is not None:
  41. return int(count)
  42. return
  43. @__try_redis(None)
  44. def write_msg_count_to_cache(count):
  45. count = cache.set("cache:msg_count", str(count))
  46. cache.expire("cache:msg_count", 3600)
  47. return count
  48. @__try_redis(None)
  49. def delete_msg_count_from_cache():
  50. cache.delete("cache:msg_count")
  51. @__try_redis(None)
  52. def get_user_msg_cout_from_cache(user_id: int):
  53. count = cache.get(f"cache:msg_count:{user_id}")
  54. if count is not None:
  55. return int(count)
  56. return
  57. @__try_redis(None)
  58. def write_user_msg_count_to_cache(user_id, count):
  59. cache_name = f"cache:msg_count:{user_id}"
  60. count = cache.set(cache_name, str(count))
  61. cache.expire(cache_name, 3600)
  62. return count
  63. @__try_redis(None)
  64. def delete_all_user_msg_count_from_cache():
  65. for i in cache.keys("cache:msg_count:*"):
  66. cache.delete(i)