首先是一个缓存流程图
客户端缓存
存于客户端浏览器以及硬盘上的缓存,客户端缓存的流程:
常见类型:
memory cache:内存缓存;
disk cache:硬盘缓存;
prefetch:预加载缓存,浏览器输入地址后,在手动请求之前,浏览器实际就已经请求了,并存于客户端;
实现《.net core3.1》:
静态文件:
可以在Startup.cs文件中进行配置;
动态页面缓存:
1.使用特性:[ResponseCache(Duration = 60)]
2.使用代码:base.HttpContext.Response.Headers[“Cache-Control”] = “public,max-age=60”;
DNS(CDN)缓存
DNS是进行域名解析,属于正向代理,同时也是离用户最近的一层,这个缓存属于第三方服务,所以需要购买,根据和服务商协商缓存的规则进行CDN缓存,这个缓存针对群体用户。
反向代理缓存
反向代理:客户端请求到达反向代理服务器,反向代理服务器在请求服务器,服务器响应成功后在到的反向代理服务器,方向代理服务器在把请求的数据转发给客户端。
实现:
nginx ->配置端口监听->配置缓存地址->配置缓存规则



本地缓存
属于服务端缓存;
Memory cache,也叫内存缓存,本地缓存;
特点:存于内存,速度快,存于当前线程,重启会释放,体积有限,服务器集群后缓存不能共享;
分布式缓存
属于服务端缓存;
这里使用的是Redis,也叫分布式缓存;
Redis五大数据结构:
1.string数据格式;
string是redis最基本的类型,而且string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象
2.Hash数据格式:
Redis hash 是一个键值对集合;
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象
3.List数据格式:
redis的list类型其实就是一个每个子元素都是string类型的双向链表。所以[lr]push和[lr]pop命令的算法时间复杂度都是O(1)另外list会记录链表的长度。所以llen操作也是O(1).链表的最大长度是(2的32次方-1)。我们可以通过push,pop操作从链表的头部或者尾部添加删除元素。这使得list既可以用作栈,也可以用作队列
4.set数据格式:
Redis的Set是string类型的无序集合,是通过HashTable实现的
5.Zset(sorted-set)数据格式:
Zset 就是一个集合,集合的概念就是一堆不重复值的组合。利用Redis提供的Zset 数据结构,可以存储一些集合性的数据。
特点:单线程模型,速度快,服务器集群后缓存可以共享,存于单独的一个线程;
Redis具体问题中的使用<基于Redis的key-value数据格式>:
1.数据缓存–菜单/权限/类别/数据字典–相对稳定即时性要求低的数据;
2.文章点赞/阅读量–数据变化太快–数据库压力太大–Redis缓存–读写快–开启持久化(100/1000次写一次数据库)–缓冲层;
3.密码错误24小时最多5次尝试(每天投票次数)–账号做key+次数做value–有效期24小时;
4.秒杀–产品少但是并发高,数据库压力大–请求先走Redis–有库存才到数据库–否则直接失败,不到数据库–基于Redis单线程模型–没有线程安全问题–类似缓冲层;
5.分布式Session–类似于数据缓存;
6分布式锁(比较麻烦,一个线程请求某段代码时,向redis中写入一个值,使用结束后在销毁这个值,其他线程调用时先检查是否有这个值<大致意思>)
本文介绍了网站的缓存流程,包括客户端缓存、DNS(CDN)缓存、反向代理缓存和本地及分布式缓存。重点讲解了.NET Core 3.1中的客户端缓存配置以及Redis作为分布式缓存的五大数据结构:string、Hash、List、Set和Zset,并举例说明了Redis在实际场景中的应用,如数据缓存、计数、秒杀和分布式锁等。
1097

被折叠的 条评论
为什么被折叠?



