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':'各种错误信息'}
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会扫描所有数据是否过期,如果过期就删除
- 2、定期过期:redis会扫描部分数据是否过期,如果过期,删除
- 可能会浪费,有部分数据已经过期,但是没被扫描到,一直存在
- cpu占用不太高
- 3、惰性过期:redis中数据已经过期,不会立即删除,有人get该数据时,立即判断是否过期,如果过期,删除
- redis数据库默认的过期策略是:定期过期+惰性过期
- 弊端:一个数据,有效期已过,没被扫描到,也没有人get它,会一直常驻内存
- 缓存淘汰:解决过期数据未被清除问题
- noeviction:当内存不足以容纳新写入数据时,新写入操作会报错
- allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key
- allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key
- volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
- redis 4.x 后支持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、加锁或队列