对象存储及缓存

mac2026-04-20  10

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、加锁或队列
最新回复(0)