Redis缓存

关于Redis缓存

  1. Redis缓存的架构
    1. 基本缓存 Redis缓存_第1张图片
    2. 多级缓存

    Redis缓存_第2张图片

  2. Redis缓存的数据类型

    在设计缓存的数据时,可以缓存以下类型的数据

    • 一个数值

      例如:

      • 验证码

      • 用户状态

        如:user:{user_id}: enable

    • 数据库记录

      • Caching at the object level

        以数据库对象的角度考虑, 应用更普遍

        例如, 用户的基本信息

        user = User.query.filter_by(id=1).first()
        user -> User对象
        {
          'user_id':1,
          'user_name': 'python',
          'age': 28,
          'introduction': ''
        }
        
      • Caching at the database query level

        以数据库查询的角度考虑,应用场景较特殊,一般仅针对较复杂的查询进行使用

        query_result = User.query.join(User.profile).filter_by(id=1).first() 
        -> sql = "select a.user_id, a.user_name, b.gender, b.birthday from tbl_user as a inner join tbl_profile as b on a.user_id=b.user_id where a.user_id=1;"
        
        # hash算法 md5
        query = md5(sql)  # 'fwoifhwoiehfiowy23982f92h929y3209hf209fh2'
        
        # redis 
        setex(query, expiry, json.dumps(query_result))
        
    • 一个视图的响应结果

        @route('/articles')
        @cache(exipry=30*60)
        def get_articles():
            ch = request.args.get('ch')
            articles = Article.query.all()
            for article in articles:
                user = User.query.filter_by(id=article.user_id).first()
                comment = Comment.query.filter_by(article_id=article.id).all()
              results = {...} # 格式化输出
           return results
      
        # redis
        # '/artciels?ch=1':  json.dumps(results)
      
    • 一个页面

        @route('/articles')
        @cache(exipry=30*60)
        def get_articles():
            ch = request.args.get('ch')
            articles = Article.query.all()
            for article in articles:
                user = User.query.filter_by(id=article.user_id).first()
                comment = Comment.query.all()
           results = {...}
           return render_template('article_temp', results)
      
        #  redis
        # '/artciels?ch=1':  html
      
  3. Redis缓存数据的保存方式
    • 序列化字符串

      # 序列化  json字符
      # setex('user:{user_id}:info')
      setex('user:1:info', expiry, json.dumps(user_dict))
      
      • 优点
        • 存储字符串节省空间
      • 缺点
        • 序列化有时间开销
        • 更新不方便(一般直接删除)
    • Redis的其他数据类型,如hash、set、zset

      hmset('user:1:info', user_dict)
      
      • 优点
        • 读写时不需要序列化转换
        • 可以更新内部数据
      • 缺点
        • 相比字符串,采用复合结构存储空间占用大

你可能感兴趣的:(数据库,Redis缓存)