1.对象存储
需求:项目中需要存储图片数据,存储可能需要使用文件系统服务器图片数据的存储和传输,对一般Web网站流量主要在图片方案:
手动搭建,fastdf, 没有CDN内容分发选择第三方服务器,已经集成了CDN,让用户访问图片数据的时候,数据距离用户越近越好 七牛云使用流程
1.登录七牛云,选择对象存储2.新建存储空间,保存空间名称,空间域名3.安装 pip install qiniu4.下载七牛云官方示例代码,进行代码封装,保存配置ak、sk5.修改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:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的keyallkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个keyvolatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。redis 4.x 后支持LFU策略,最少频率使用
allkeys-lfuvolatile-lfu volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个keyvolatile-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、加锁或队列