web项目 day06(一)

缓存及 NoSQL 的使用

开发任务

  1. 为获取个人资料接口添加缓存处理
  2. 统一为所有数据模型增加缓存处理
    • 任何 model 对象创建时,自动为该对象添加缓存
    • 任何 model 对象创建时,自动更新缓存数据
  3. 开发全服人气排行功能
    • 被左滑 -5 分
    • 被右滑 +5 分
    • 被上滑 +7 分
    • 统计全服人气最高的 10 位用户

缓存处理

  1. 缓存一般处理流程

    data = get_from_cache(key)   # 首先从缓存中获取数据
    if data is None:
        data = get_from_db()     # 缓存中没有, 从数据库获取
        set_to_cache(key, data)  # 将数据添加到缓存, 方便下次获取
    return data
    
  2. Django 的默认缓存接口

    from django.core.cache import cache
    
    cache.set('a', 123, 10)
    a = cache.get('a')
    print(a)
    x = cache.incr(a)
    print(a)
    
  3. Django 中使用 Redis 缓存

    • 安装 django_redis: pip install django_redis

    • 配置

      # settings 添加如下配置
      CACHES = {
          "default": {
              "BACKEND": "django_redis.cache.RedisCache",
              "LOCATION": "redis://127.0.0.1:6379/1",
              "OPTIONS": {
                  "CLIENT_CLASS": "django_redis.client.DefaultClient",
                  "PICKLE_VERSION": -1,
              }
          }
      }
      

Redis 的使用

  1. Redis 文档

  2. 主要数据类型

    • String 类: 常用作普通缓存

      CMDExampleDescription
      setset(‘a’, 123)设置值
      getget(‘a’)获取值
      incrincr(‘a’)自增
      decrdecr(‘a’)自减
      msetmset(a=123, b=456, c=789)设置多个值
      mgetmget([‘a’, ‘b’, ‘c’])获取多个值
      setexsetex(‘kk’, 21, 10)设置值的时候, 同时设置过期时间
      setnxsetnx(‘a’, 999)如果不存在, 则设置该值
    • Hash 类: 常用作对象存储

      CMDExampleDescription
      hsethset(‘obj’, ‘name’, ‘hello’)在哈希表 obj 中添加一个 name = hello 的值
      hgethget(‘obj’, ‘name’)获取哈希表 obj 中的值
      hmsethmset(‘obj’, {‘a’: 1, ‘b’: 3})在哈希表中设置多个值
      hmgethmget(‘obj’, [‘a’, ‘b’, ‘name’])获取多个哈希表中的值
      hgetallhgetall(‘obj’)获取多个哈希表中所有的值
      hincrbyhincrby(‘obj’, ‘count’)将哈希表中的某个值自增 1
      hdecrbyhdecrby(‘obj’, ‘count’)将哈希表中的某个值自减 1
    • List 类: 常用作队列(消息队列、任务队列等)

      CMDExampleDescription
      lpushlpush(name, *values)向列表左侧添加多个元素
      rpushrpush(name, *values)向列表右侧添加多个元素
      lpoplpop(name)从列表左侧弹出一个元素
      rpoprpop(name)从列表右侧弹出一个元素
      blpopblpop(keys, timeout=0)从列表左侧弹出一个元素, 列表为空时阻塞 timeout 秒
      brpopbrpop(keys, timeout=0)从列表右侧弹出一个元素, 列表为空时阻塞 timeout 秒
      llenllen(name)获取列表长度
      ltrimltrim(name, start, end)从 start 到 end 位置截断列表
    • Set 类: 常用作去重

      CMDExampleDescription
      saddsadd(name, *values)向集合中添加元素
      sdiffsdiff(keys, *args)多个集合做差集
      sintersinter(keys, *args)多个集合取交集
      sunionsunion(keys, *args)多个集合取并集
      sismembersismember(name, value)元素 value 是否是集合 name 中的成员
      smemberssmembers(name)集合 name 中的全部成员
      spopspop(name)随机弹出一个成员
      sremsrem(name, *values)删除一个或多个成员
    • SortedSet 类: 常用作排行处理

      CMDExampleDescription
      zaddzadd(name, a=12)添加一个 a, 值为 12
      zcountzcount(name, min, max)从 min 到 max 的元素个数
      zincrbyzincrby(name, key, 1)key 对应的值自增 1
      zrangezrange(name, 0, -1, withscores=False)按升序返回排名 0 到 最后一位的全部元素
      zrevrangezrevrange(name, 0, -1, withscores=False)按降序返回排名 0 到 最后一位的全部元素
      zremzrem(name, *value)删除一个或多个元素
  3. 使用 pickle 对 Redis 接口的封装

    from pickle import dumps, loads
    
    rds = redis.Redis()
    
    def set(key, value):
        data = dumps(value)
        return rds.set(key, data)
    
    def get(key):
        data = rds.get(key)
        return loads(data)
    
  4. 动态修改 Python 属性和方法

    class A:
        m = 128
        def __init__(self):
            self.x = 123
    
        def add(self, n):
            print(self.x + n)
    
    a = A()
    
    # 动态添加属性 (两种方式)
    a.y = 456
    setattr(a, 'z', 789)
    
    # 动态添加类属性
    A.y = 654
    
    # 类属性和实例属性互不影响
    print(A.y, a.y)
    
    # 动态添加实例方法
    def sub(self, n):
        print(self.x - n)
    A.sub = sub
    
    # 动态添加类方法
    @classmethod
    def mul(cls, n):
        print(cls.m * n)
    A.mul = mul
    
    # 动态添加静态方法
    @staticmethod
    def div(x, y):
        print(x / y)
    A.div = div
    
    # 属性修改的本质原因
    print(A.__dict__, a.__dict__)
    
  5. 在 Model 层插入缓存处理

    • Monkey Patch 也叫做 “猴子补丁”, 是一种编程技巧, 旨在运行时为对象动态添加、修改或者替换某项功能
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值