cache.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  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["REDIS_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 read_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 read_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. return
  109. @__try_redis(None)
  110. def write_blog_count_to_cache(count):
  111. count = cache.set("cache:blog_count", str(count))
  112. cache.expire("cache:blog_count", CACHE_TIME)
  113. return count
  114. @__try_redis(None)
  115. def delete_blog_count_from_cache():
  116. cache.delete("cache:blog_count")
  117. @__try_redis(None)
  118. def get_archive_blog_count_from_cache(archive_id: int):
  119. count = cache.get(f"cache: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: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("cache: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: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: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: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("cache: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:blog_count:user:{user_id}")
  153. @__try_redis(None)
  154. def read_archive_from_cache(archive_id: int):
  155. archive = cache.hgetall(f"cache: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: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:archive:{archive_id}")
  171. @__try_redis(None)
  172. def get_blog_archive_from_cache(blog_id: int):
  173. blog_archive = cache.lrange(f"cache:blog_archive:{blog_id}", 0, -1)
  174. if len(blog_archive) == 0:
  175. return None
  176. return blog_archive
  177. @__try_redis(None)
  178. def write_blog_archive_to_cache(blog_id: int, archive):
  179. cache_name = f"cache:blog_archive:{blog_id}"
  180. cache.delete(cache_name)
  181. cache.rpush(cache_name, *archive)
  182. cache.expire(cache_name, CACHE_TIME)
  183. @__try_redis(None)
  184. def delete_blog_archive_from_cache(blog_id: int):
  185. cache.delete(f"cache:blog_archive:{blog_id}")
  186. @__try_redis(None)
  187. def delete_all_blog_archive_from_cache():
  188. for i in cache.keys("cache:blog_archive:*"):
  189. cache.delete(i)
  190. @__try_redis(None)
  191. def read_comment_from_cache(comment_id: int):
  192. comment = cache.hgetall(f"cache:comment:{comment_id}")
  193. if len(comment) != 2:
  194. return None
  195. return [comment.get("BlogID", ""),
  196. comment.get("Email", ""),
  197. comment.get("Content", ""),
  198. datetime.fromisoformat(comment.get("UpdateTime", "2022-1-1 00:00:00"))]
  199. @__try_redis(None)
  200. def write_comment_to_cache(comment_id: int, blog_id: str, email: str, content: str, update_time: str | datetime):
  201. cache_name = f"cache:comment:{comment_id}"
  202. cache.delete(cache_name)
  203. cache.hset(cache_name, mapping={
  204. "BlogID": blog_id,
  205. "Email": email,
  206. "Content": content,
  207. "UpdateTime": str(update_time)
  208. })
  209. cache.expire(cache_name, CACHE_TIME)
  210. @__try_redis(None)
  211. def delete_comment_from_cache(comment_id: int):
  212. cache.delete(f"cache:comment:{comment_id}")
  213. @__try_redis(None)
  214. def get_user_comment_count_from_cache(user_id: int):
  215. count = cache.get(f"cache:comment_count:{user_id}")
  216. if count is not None:
  217. return int(count)
  218. @__try_redis(None)
  219. def write_user_comment_count_to_cache(user_id, count):
  220. cache_name = f"cache:comment_count:{user_id}"
  221. count = cache.set(cache_name, str(count))
  222. cache.expire(cache_name, CACHE_TIME)
  223. return count
  224. @__try_redis(None)
  225. def delete_user_comment_count_from_cache(user_id: int):
  226. cache.delete(f"cache:comment_count:{user_id}")
  227. @__try_redis(None)
  228. def delete_all_user_comment_count_from_cache():
  229. for i in cache.keys("cache:comment_count:*"):
  230. cache.delete(i)
  231. @__try_redis(None)
  232. def read_user_from_cache(email: str):
  233. user = cache.hgetall(f"cache:user:{email}")
  234. if len(user) != 2:
  235. return None
  236. return [user.get("PasswdHash", ""),
  237. int(user.get("Role", "")),
  238. int(user.get("ID", ""))]
  239. @__try_redis(None)
  240. def write_user_to_cache(email: str, passwd_hash: str, role: int, user_id: int):
  241. cache_name = f"cache:user:{email}"
  242. cache.delete(cache_name)
  243. cache.hset(cache_name, mapping={
  244. "PasswdHash": passwd_hash,
  245. "Role": role,
  246. "ID": user_id,
  247. })
  248. cache.expire(cache_name, CACHE_TIME)
  249. @__try_redis(None)
  250. def delete_user_from_cache(email: str):
  251. cache.delete(f"cache:user:{email}")
  252. @__try_redis(None)
  253. def get_user_email_from_cache(user_id: int):
  254. email = cache.get(f"cache:user_email:{user_id}")
  255. if email is None or len(email) == 0:
  256. return None
  257. return email
  258. @__try_redis(None)
  259. def write_user_email_to_cache(user_id: int, email: str):
  260. cache_name = f"cache:user_email:{user_id}"
  261. cache.set(cache_name, email)
  262. cache.expire(cache_name, CACHE_TIME)
  263. @__try_redis(None)
  264. def delete_user_email_from_cache(user_id: int):
  265. cache.delete(f"cache:user_email:{user_id}")
  266. @__try_redis(None)
  267. def get_role_name_from_cache(role_id: int):
  268. role_name = cache.get(f"cache:role_name:{role_id}")
  269. if role_name is None or len(role_name) == 0:
  270. return None
  271. return role_name
  272. @__try_redis(None)
  273. def write_role_name_to_cache(role_id: int, name: str):
  274. cache_name = f"cache:role_name:{role_id}"
  275. cache.set(cache_name, name)
  276. cache.expire(cache_name, CACHE_TIME)
  277. @__try_redis(None)
  278. def delete_role_name_from_cache(role_id: int):
  279. cache.delete(f"cache:role_name:{role_id}")
  280. def get_role_operate_from_cache(role_id: int, operate: str):
  281. res = cache.get(f"cache:operate:{role_id}:{operate}")
  282. if res is None or len(res) == 0:
  283. return None
  284. return res == "True"
  285. @__try_redis(None)
  286. def write_role_operate_to_cache(role_id: int, operate: str, res: bool):
  287. cache_name = f"cache:operate:{role_id}:{operate}:"
  288. cache.set(cache_name, str(res))
  289. cache.expire(cache_name, CACHE_TIME)
  290. @__try_redis(None)
  291. def delete_role_operate_from_cache(role_id: int):
  292. for i in cache.keys(f"cache:operate:{role_id}:*"):
  293. cache.delete(i)