对象存储及缓存

1.对象存储

  • 需求:项目中需要存储图片数据,存储可能需要使用文件系统服务器
  • 图片数据的存储和传输,对一般Web网站流量主要在图片
  • 方案:
    • 手动搭建,fastdf, 没有CDN内容分发
    • 选择第三方服务器,已经集成了CDN,让用户访问图片数据的时候,数据距离用户越近越好
  • 七牛云使用流程
    • 1.登录七牛云,选择对象存储
    • 2.新建存储空间,保存空间名称,空间域名
    • 3.安装 pip install qiniu
    • 4.下载七牛云官方示例代码,进行代码封装,保存配置ak、sk
    • 5.修改token的有效期,修改上传文件的功能函数
    • 6.上传成功后,返回图片地址
  • 七牛云上传原理
    在这里插入图片描述

2. 上传头像

接口设计:
1. 请求地址
2. 请求方式 
    POST新建
    PUT表示更新/PATCH表示更新
PUT方法要求:修改数据,需要传入所有相关参数,比如,修改头像,user_id/mobile/name/photo等
{
    'user_id':xxx,
    'name':xxx,
    'mobile':xxx,
    'photo':图片地址,
    ...
}
PATCH方法要求,修改数据,只需要传入相关参数,比如头像,photo
{
    'photo:图片地址'
}
3. 请求参数

header 1 | header 2
---|---
row 1 col 1 | row 1 col 2
row 2 col 1 | row 2 col 2


参数名				是否必须			参数类型		参数位置		参数说明
photo				True				file			body 		用户选择的头像图片文件
user_id				True				int				headers 用户的身份信息	
4. 返回数据
正常情况下:
return {'message':'ok','data':{'photo_url':'七牛云的空间域名+图片文件名'}}
异常情况下:
return {'message':'各种错误信息'}
  • 需要异常处理的代码:
    • 1.网路io,上传下载、发送请求
    • 2.磁盘io,

2.CDN

  • 全称:Content Delivery Network或Content Distribute Network,即内容分发网络
  • 使用户就近取得所需内容,提高用户访问的响应速度和成功率,常用于站点加速、点播、直播等场景

3.缓存

* 1.key、value形式的数据,例如:验证码、session信息等
* 2、视图通过查询mqsql数据的结果、列表形式的记录,例如:浏览记录
* 3、储存页面、图片数据,例如:首页商品数据
* 4、存储一个查询语句和结果(数据优化),select xxx 哈希计算,key=字符串, value=查询结果
  • redis数据类型的选择 字符串、列表、哈希、集合、有序集合
    • 1、基本数据类型:字符串、单独的key、value,表示一条记录;节省空间(没有索引);
    • 2、复合数据类型:除字符串外,占用空间大,查询效率高,多条key、value存储是一条数据;

5.缓存有效期和缓存淘汰

  • redis中设置有效期的作用
    • 1、节省空间
    • 2、达到数据的弱一致性,在有效期过了之后,redis会和mysql数据同步
  • redis中数据的过期策略 setex(‘a’, 300, ‘aval’)
    • 1、定时过期:redis会扫描所有数据是否过期,如果过期就删除
      • 节省内存
      • cpu占用高、消耗计算机性能
    • 2、定期过期:redis会扫描部分数据是否过期,如果过期,删除
      • 可能会浪费,有部分数据已经过期,但是没被扫描到,一直存在
      • cpu占用不太高
    • 3、惰性过期:redis中数据已经过期,不会立即删除,有人get该数据时,立即判断是否过期,如果过期,删除
      • 节省cpu
      • 内存浪费
    • redis数据库默认的过期策略是:定期过期+惰性过期
    • 弊端:一个数据,有效期已过,没被扫描到,也没有人get它,会一直常驻内存
  • 缓存淘汰:解决过期数据未被清除问题
  • noeviction:当内存不足以容纳新写入数据时,新写入操作会报错
  • allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key
  • allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key
  • volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
  • redis 4.x 后支持LFU策略,最少频率使用
    • allkeys-lfu
    • volatile-lfu
  • volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key
  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。
    • 1、LRU:Least recently used,最近最少使用,按照时间跨度淘汰数据;redis中一直存在的数据都是最新数据;
      • 新数据插入到列表头部;
      • 每当缓存命中(即缓存数据被访问),则将数据移到列表头部;
      • 当列表满的时候,将列表尾部的数据丢弃
    • 2、LFU(Least Frequently Used 最近最少使用算法)
      在这里插入图片描述
      • maxmemory 最大使用内存数量
      • maxmemory-policy noeviction 淘汰策略
      • 按照数据访问的频率淘汰,redis中一直存在的数据都是热点数据,访问频率高的数据
        在这里插入图片描述
    • 3、例如mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?
      • 1、20w数据需要使用的空间大小,配置redis的最大使用内存。
      • 2、淘汰策略LFU,把访问频率低的给淘汰掉;

6、缓存模式

  • 缓存数据操作的方式:先更新mysql,再删除redis;

7、缓存问题

  • 缓存击穿:客户端故意频繁请求缓存中不存在的数据,造成频繁的直接对mysql的读取;
    • 1、查询mysql数据没有,故意返回无效数据
    • 2、过滤请求信息,布隆过滤器
  • 缓存雪崩:缓存数据有效期在一个时间点,大量失效
    在这里插入图片描述
    • 1、多级缓存
      在这里插入图片描述
    • 2、有效期不固定,基准值30分钟+偏差值(1-5分钟)
    • 3、加锁或队列
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值