知乎是如何做缓存的?

论坛 期权论坛 工作     
爱用户   2019-8-19 01:17   1090   3
最近准备做一个网站, 架构和社区差不多,使用tornado框架,mysql作为数据库,使用SqlAlchemy 为ORM进行数据库操作,考虑到网站性能,准备加入redis做缓存,但对于sqlalchemy如何结合redis做缓存,不是很懂,请问社区是如何做缓存的?
分享到 :
0 人收藏

3 个回复

倒序浏览
2#
热心回应  16级独孤 | 2019-8-19 01:17:19 发帖IP地址来自
受邀请回答。

我不知道社区是如何做缓存的,但是可以分享一下我用SQLAlchemy和Redis做缓存的做法。

假设有这样的数据库表,简单的博客文章,文章Tag表,按照标准范式表设计,在SQLAlchemy(类似Django的Models范式)设计如下:
  1. class Blog(Models):      __tablename__ = "blog"      id = Column(Integer, primary_key=True)      blog_text = Text()class BlogTagRel(Models):      __tablename__ = "blogtagrel"     # id = Column(Integer, primary_key=True)     blog_id = Column(Integer)     tag_id = Column(Integer)class Tag(Models):      __tablename__ = "tag"     id = Column(Integer, primary_key=True)     tag_text = Text()
复制代码

这个基本是最基本的一对多的范例,那么规划自己的Redis缓存使用的数据类型,规划如下(类似C的伪代码,将就看看,大体理解,轻拍):

Redis缓存的Key大体按照 Table-Name: Primary-Key: Column-Key = Column-Value 这样设计。
  1. blog:(id): text = [string] textblog:(id):tags = [hashs]             [string] tag1             [string] tag2             .......
复制代码

上面是Models的设计和缓存设计,现在设计Backend类,关键的将两者整合起来的后端实现,ORM+缓存。
  1. class Backend(): # 伪代码,轻拍     # CURD的Create     def create_blog(self, blog_text):             # 写入数据库              blog = Blog(blog_text=blog_text)              sqlalchemy_session.add(blog)              sqlalchemy_session.commit()              # 写入缓存              redis_conn.set("blog:" + blog.id + ":text", blog_text)    # CURD的Read     def read_blog(self, id):             # 检查缓存是否存在             if redis_conn.exists("blog:" + blog.id + ":text"):                        return redis_conn.get("blog:" + blog.id + ":text")             else:              blog = sqlalchemy_session.query(Blog).filter_by(id=id).first()              # 写入缓存              redis_conn.set("blog:" + blog.id + ":text", blog.blog_text)              return blog
复制代码

使用的时候,直接就是Backend.create_blog()和Backend.read_blog(),这样就可以整合SQLAlchemy和Redis的缓存。

上面的代码还有些问题,比如SQLAlchemy返回的数据是需要和Redis返回的缓存数据是一致的,这样方便外部的逻辑实现调用吧。但是上面的思路就是这样的,ORM + Cache = Backend,外部统一调用Backend的逻辑。ORM你可以写成Raw SQL,Cache可以换任何的Memcached等的缓存,但实现思路是一样的。


很简洁是不是?哈哈。

希望对你有用。

希望社区分享一下Redis的缓存经验,或者是缓存的架构:)
3#
热心回应  16级独孤 | 2019-8-19 01:17:20 发帖IP地址来自
从(怎么使用)工具出发来设计性能,有这种思路的话一上来就错了

性能设计的正途是充分研究业务的数据流,充分利用(exploit)数据的特性来削减运算、避免瓶颈。至于那些工具只是给你参考的,就算要用最好也是拆了、消化了、自己改造了再用
4#
热心回应  16级独孤 | 2019-8-19 01:17:21 发帖IP地址来自
没做过这些呢,一直溜达在web中,对大数据只使用过oracle的表分区,对于缓存技术层面的还停留在ibatis的缓存技术,呵呵,只是做web开发的,有时间准备下一步学习下hadoop啥的
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:31799
帖子:6375
精华:1
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP