cache.py 10 KB

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