cache.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. from sql import cache, DB
  2. from sql.base import DBBit
  3. from configure import conf
  4. from redis import RedisError
  5. from functools import wraps
  6. from datetime import datetime
  7. CACHE_TIME = int(conf["CACHE_EXPIRE"])
  8. CACHE_PREFIX = conf["CACHE_PREFIX"]
  9. def __try_redis(ret=None):
  10. def try_redis(func):
  11. @wraps(func)
  12. def try_func(*args, **kwargs):
  13. try:
  14. res = func(*args, **kwargs)
  15. except RedisError:
  16. cache.logger.error(f"Redis error with {args} {kwargs}", exc_info=True, stack_info=True)
  17. return ret
  18. return res
  19. return try_func
  20. return try_redis
  21. @__try_redis(None)
  22. def get_msg_from_cache(msg_id: int):
  23. msg = cache.hgetall(f"{CACHE_PREFIX}:msg:{msg_id}")
  24. if len(msg) != 4:
  25. return None
  26. return [msg.get("Email", ""),
  27. msg.get("Content"),
  28. datetime.fromtimestamp(float(msg.get("UpdateTime", 0.0))),
  29. msg.get("Secret", "False") == "True"]
  30. @__try_redis(None)
  31. def write_msg_to_cache(msg_id: int, email: str, content: str, update_time: str | datetime, secret: bool,
  32. is_db_bit=False):
  33. cache_name = f"{CACHE_PREFIX}:msg:{msg_id}"
  34. cache.delete(cache_name)
  35. cache.hset(cache_name, mapping={
  36. "Email": email,
  37. "Content": content,
  38. "UpdateTime": datetime.timestamp(update_time),
  39. "Secret": str(secret == DBBit.BIT_1 if is_db_bit else secret)
  40. })
  41. cache.expire(cache_name, CACHE_TIME)
  42. @__try_redis(None)
  43. def delete_msg_from_cache(msg_id: int):
  44. cache.delete(f"{CACHE_PREFIX}:msg:{msg_id}")
  45. @__try_redis(None)
  46. def get_msg_cout_from_cache():
  47. count = cache.get(f"{CACHE_PREFIX}:msg_count")
  48. if count is not None:
  49. return int(count)
  50. @__try_redis(None)
  51. def write_msg_count_to_cache(count):
  52. count = cache.set(f"{CACHE_PREFIX}:msg_count", str(count))
  53. cache.expire(f"{CACHE_PREFIX}:msg_count", CACHE_TIME)
  54. return count
  55. @__try_redis(None)
  56. def delete_msg_count_from_cache():
  57. cache.delete(f"{CACHE_PREFIX}:msg_count")
  58. @__try_redis(None)
  59. def get_user_msg_count_from_cache(user_id: int):
  60. count = cache.get(f"{CACHE_PREFIX}:msg_count:{user_id}")
  61. if count is not None:
  62. return int(count)
  63. @__try_redis(None)
  64. def write_user_msg_count_to_cache(user_id, count):
  65. cache_name = f"{CACHE_PREFIX}:msg_count:{user_id}"
  66. count = cache.set(cache_name, str(count))
  67. cache.expire(cache_name, CACHE_TIME)
  68. return count
  69. @__try_redis(None)
  70. def delete_user_msg_count_from_cache(user_id):
  71. cache.delete(f"{CACHE_PREFIX}:msg_count:{user_id}")
  72. @__try_redis(None)
  73. def delete_all_user_msg_count_from_cache():
  74. for i in cache.keys(f"{CACHE_PREFIX}:msg_count:*"):
  75. cache.delete(i)
  76. @__try_redis(None)
  77. def get_blog_from_cache(blog_id: int):
  78. blog = cache.hgetall(f"{CACHE_PREFIX}:blog:{blog_id}")
  79. if len(blog) != 7:
  80. return None
  81. return [int(blog.get("Auth", -1)),
  82. blog.get("Title"),
  83. blog.get("SubTitle"),
  84. blog.get("Content"),
  85. datetime.fromtimestamp(float(blog.get("UpdateTime", 0.0))),
  86. datetime.fromtimestamp(float(blog.get("CreateTime", 0.0))),
  87. blog.get("Top", "False") == "True"]
  88. @__try_redis(None)
  89. def write_blog_to_cache(blog_id: int, auth_id: str, title: str, subtitle: str, content: str,
  90. update_time: str | datetime, create_time: str | datetime, top: bool, is_db_bit=False):
  91. cache_name = f"{CACHE_PREFIX}:blog:{blog_id}"
  92. cache.delete(cache_name)
  93. cache.hset(cache_name, mapping={
  94. "Auth": auth_id,
  95. "Title": title,
  96. "SubTitle": subtitle,
  97. "Content": content,
  98. "UpdateTime": datetime.timestamp(update_time),
  99. "CreateTime": datetime.timestamp(create_time),
  100. "Top": str(top == DBBit.BIT_1 if is_db_bit else top)
  101. })
  102. cache.expire(cache_name, CACHE_TIME)
  103. @__try_redis(None)
  104. def delete_blog_from_cache(blog_id: int):
  105. cache.delete(f"{CACHE_PREFIX}:blog:{blog_id}")
  106. @__try_redis(None)
  107. def get_blog_count_from_cache():
  108. count = cache.get(f"{CACHE_PREFIX}:blog_count")
  109. if count is not None:
  110. return int(count)
  111. @__try_redis(None)
  112. def write_blog_count_to_cache(count):
  113. count = cache.set(f"{CACHE_PREFIX}:blog_count", str(count))
  114. cache.expire(f"{CACHE_PREFIX}:blog_count", CACHE_TIME)
  115. return count
  116. @__try_redis(None)
  117. def delete_blog_count_from_cache():
  118. cache.delete(f"{CACHE_PREFIX}:blog_count")
  119. @__try_redis(None)
  120. def get_archive_blog_count_from_cache(archive_id: int):
  121. count = cache.get(f"{CACHE_PREFIX}:blog_count:archive:{archive_id}")
  122. if count is not None:
  123. return int(count)
  124. @__try_redis(None)
  125. def write_archive_blog_count_to_cache(archive_id, count):
  126. cache_name = f"{CACHE_PREFIX}:blog_count:archive:{archive_id}"
  127. count = cache.set(cache_name, str(count))
  128. cache.expire(cache_name, CACHE_TIME)
  129. return count
  130. @__try_redis(None)
  131. def delete_all_archive_blog_count_from_cache():
  132. for i in cache.keys(f"{CACHE_PREFIX}:blog_count:archive:*"):
  133. cache.delete(i)
  134. @__try_redis(None)
  135. def delete_archive_blog_count_from_cache(archive_id: int):
  136. cache.delete(f"{CACHE_PREFIX}:blog_count:archive:{archive_id}")
  137. @__try_redis(None)
  138. def get_user_blog_count_from_cache(user_id: int):
  139. count = cache.get(f"{CACHE_PREFIX}:blog_count:user:{user_id}")
  140. if count is not None:
  141. return int(count)
  142. @__try_redis(None)
  143. def write_user_blog_count_to_cache(user_id, count):
  144. cache_name = f"{CACHE_PREFIX}:blog_count:user:{user_id}"
  145. count = cache.set(cache_name, str(count))
  146. cache.expire(cache_name, CACHE_TIME)
  147. return count
  148. @__try_redis(None)
  149. def delete_all_user_blog_count_from_cache():
  150. for i in cache.keys(f"{CACHE_PREFIX}:blog_count:user:*"):
  151. cache.delete(i)
  152. @__try_redis(None)
  153. def delete_user_blog_count_from_cache(user_id: int):
  154. cache.delete(f"{CACHE_PREFIX}:blog_count:user:{user_id}")
  155. @__try_redis(None)
  156. def get_archive_from_cache(archive_id: int):
  157. archive = cache.hgetall(f"{CACHE_PREFIX}:archive:{archive_id}")
  158. if len(archive) != 2:
  159. return None
  160. return [archive.get("Name", ""), archive.get("DescribeText")]
  161. @__try_redis(None)
  162. def write_archive_to_cache(archive_id: int, name: str, describe: str):
  163. cache_name = f"{CACHE_PREFIX}:archive:{archive_id}"
  164. cache.delete(cache_name)
  165. cache.hset(cache_name, mapping={
  166. "Name": name,
  167. "DescribeText": describe,
  168. })
  169. cache.expire(cache_name, CACHE_TIME)
  170. @__try_redis(None)
  171. def delete_archive_from_cache(archive_id: int):
  172. cache.delete(f"{CACHE_PREFIX}:archive:{archive_id}")
  173. @__try_redis(None)
  174. def get_blog_archive_from_cache(blog_id: int):
  175. blog_archive = cache.lrange(f"{CACHE_PREFIX}:blog_archive:{blog_id}", 0, -1)
  176. if len(blog_archive) == 0:
  177. return None
  178. elif blog_archive[0] == '-1':
  179. return []
  180. return blog_archive
  181. @__try_redis(None)
  182. def write_blog_archive_to_cache(blog_id: int, archive):
  183. cache_name = f"{CACHE_PREFIX}:blog_archive:{blog_id}"
  184. cache.delete(cache_name)
  185. if len(archive) == 0:
  186. cache.rpush(cache_name, -1)
  187. else:
  188. cache.rpush(cache_name, *archive)
  189. cache.expire(cache_name, CACHE_TIME)
  190. @__try_redis(None)
  191. def delete_blog_archive_from_cache(blog_id: int):
  192. cache.delete(f"{CACHE_PREFIX}:blog_archive:{blog_id}")
  193. @__try_redis(None)
  194. def delete_all_blog_archive_from_cache():
  195. for i in cache.keys(f"{CACHE_PREFIX}:blog_archive:*"):
  196. cache.delete(i)
  197. @__try_redis(None)
  198. def get_comment_from_cache(comment_id: int):
  199. comment = cache.hgetall(f"{CACHE_PREFIX}:comment:{comment_id}")
  200. if len(comment) != 4:
  201. return None
  202. return [comment.get("BlogID", ""),
  203. comment.get("Email", ""),
  204. comment.get("Content", ""),
  205. datetime.fromtimestamp(float(comment.get("UpdateTime", 0.0)))]
  206. @__try_redis(None)
  207. def write_comment_to_cache(comment_id: int, blog_id: str, email: str, content: str, update_time: str | datetime):
  208. cache_name = f"{CACHE_PREFIX}:comment:{comment_id}"
  209. cache.delete(cache_name)
  210. cache.hset(cache_name, mapping={
  211. "BlogID": blog_id,
  212. "Email": email,
  213. "Content": content,
  214. "UpdateTime": datetime.timestamp(update_time)
  215. })
  216. cache.expire(cache_name, CACHE_TIME)
  217. @__try_redis(None)
  218. def delete_comment_from_cache(comment_id: int):
  219. cache.delete(f"{CACHE_PREFIX}:comment:{comment_id}")
  220. @__try_redis(None)
  221. def get_user_comment_count_from_cache(user_id: int):
  222. count = cache.get(f"{CACHE_PREFIX}:comment_count:{user_id}")
  223. if count is not None:
  224. return int(count)
  225. @__try_redis(None)
  226. def write_user_comment_count_to_cache(user_id, count):
  227. cache_name = f"{CACHE_PREFIX}:comment_count:{user_id}"
  228. count = cache.set(cache_name, str(count))
  229. cache.expire(cache_name, CACHE_TIME)
  230. return count
  231. @__try_redis(None)
  232. def delete_user_comment_count_from_cache(user_id: int):
  233. cache.delete(f"{CACHE_PREFIX}:comment_count:{user_id}")
  234. @__try_redis(None)
  235. def delete_all_user_comment_count_from_cache():
  236. for i in cache.keys(f"{CACHE_PREFIX}:comment_count:*"):
  237. cache.delete(i)
  238. @__try_redis(None)
  239. def get_user_from_cache(email: str):
  240. user = cache.hgetall(f"{CACHE_PREFIX}:user:{email}")
  241. if len(user) != 3:
  242. return None
  243. return [user.get("PasswdHash", ""),
  244. int(user.get("Role", "")),
  245. int(user.get("ID", ""))]
  246. @__try_redis(None)
  247. def write_user_to_cache(email: str, passwd_hash: str, role: int, user_id: int):
  248. cache_name = f"{CACHE_PREFIX}:user:{email}"
  249. cache.delete(cache_name)
  250. cache.hset(cache_name, mapping={
  251. "PasswdHash": passwd_hash,
  252. "Role": role,
  253. "ID": user_id,
  254. })
  255. cache.expire(cache_name, CACHE_TIME)
  256. @__try_redis(None)
  257. def delete_user_from_cache(email: str):
  258. cache.delete(f"{CACHE_PREFIX}:user:{email}")
  259. @__try_redis(None)
  260. def get_user_email_from_cache(user_id: int):
  261. email = cache.get(f"{CACHE_PREFIX}:user_email:{user_id}")
  262. if email is None or len(email) == 0:
  263. return None
  264. return email
  265. @__try_redis(None)
  266. def write_user_email_to_cache(user_id: int, email: str):
  267. cache_name = f"{CACHE_PREFIX}:user_email:{user_id}"
  268. cache.set(cache_name, email)
  269. cache.expire(cache_name, CACHE_TIME)
  270. @__try_redis(None)
  271. def delete_user_email_from_cache(user_id: int):
  272. cache.delete(f"{CACHE_PREFIX}:user_email:{user_id}")
  273. @__try_redis(None)
  274. def get_role_name_from_cache(role_id: int):
  275. role_name = cache.get(f"{CACHE_PREFIX}:role_name:{role_id}")
  276. if role_name is None or len(role_name) == 0:
  277. return None
  278. return role_name
  279. @__try_redis(None)
  280. def write_role_name_to_cache(role_id: int, name: str):
  281. cache_name = f"{CACHE_PREFIX}:role_name:{role_id}"
  282. cache.set(cache_name, name)
  283. cache.expire(cache_name, CACHE_TIME)
  284. @__try_redis(None)
  285. def delete_role_name_from_cache(role_id: int):
  286. cache.delete(f"{CACHE_PREFIX}:role_name:{role_id}")
  287. def get_role_operate_from_cache(role_id: int, operate: str):
  288. res = cache.get(f"{CACHE_PREFIX}:operate:{role_id}:{operate}")
  289. if res is None or len(res) == 0:
  290. return None
  291. return res == "True"
  292. @__try_redis(None)
  293. def write_role_operate_to_cache(role_id: int, operate: str, res: bool):
  294. cache_name = f"{CACHE_PREFIX}:operate:{role_id}:{operate}"
  295. cache.set(cache_name, str(res))
  296. cache.expire(cache_name, CACHE_TIME)
  297. @__try_redis(None)
  298. def delete_role_operate_from_cache(role_id: int):
  299. for i in cache.keys(f"{CACHE_PREFIX}:operate:{role_id}:*"):
  300. cache.delete(i)
  301. @__try_redis(None)
  302. def restart_clear_cache():
  303. """
  304. 重启服务时必须要清理的缓存
  305. 包括Hblog-Cache和Flask-Cache
  306. """
  307. # 删除全部Flask缓存
  308. for i in cache.keys("flask_cache:*"):
  309. cache.delete(i)