缓存的数据

缓存数据的类型

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

  • 一个数值

    例如

    • 验证码
    • 用户状态

      如: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
    

缓存数据的保存方式

  • 序列化字符串

      # 序列化  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)
    
    • 优点
      • 读写时不需要序列化转换
      • 可以更新内部数据
    • 缺点
      • 相比字符串,采用复合结构存储空间占用大

posted on 2021-07-06 19:57  paike123  阅读(39)  评论(0编辑  收藏  举报

导航