1
0

cache.py 11 KB

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