【西天取经】4、高性能-缓存
4、高性能-缓存
对于Web程序来说,缓存分为客户端缓存和服务器端缓存两种类型。
客户端缓存是指在用户访问网站的浏览器那一端,常见的就是使用HTTP Request头信息,通过利用HTTP传输协议里面的属性来实现在客户端那里的缓存。Request头信息是通过上一次请求服务器得到的Response头信息里面的内容。如果是第一次客户端通过浏览器访问网站的话肯定是没有缓存的。Response头信息里面的内容是自己在服务器端编程实现的。常见的HTTP状态有304,常见的HTTP头信息里面的属性名称有:Last-Modified 与 If-Modified-Since、max-age与Expires、ETags等等。随便把这几个关键字去百度里摆一摆文章一大坨,我就不在这里介绍概念了。我只介绍编程实现,如果不明白可以百度学习一下概念,恶补一下。
服务器端缓存也分为两种,第一种通常我们称为一级缓存,第二种通常我们称为二级缓存。随着业务的增加,流量的增加服务器的压力会变的更大,可能还会有更多层级的缓存。
一级缓存通常都是接受当前用户请求的服务器的内存当做第一层的缓存。
二级缓存通常都是接受当前用户请求的服务器的硬盘或者其他服务器的内存或硬盘,比如:Redis,SQL数据库等都可以用来当第二层的缓存介质来使用。如果使用SQL数据库当第二层缓存肯定有些小伙伴是不理解的,那和从数据库直接取数据没区别了,为啥能说是二级缓存呢?你说的完全没错,这种的话从写入和读取的方式上来说就是没有区别。真正有区别的是你想要存进去和取出来的数据内容,比如:静态页面内容,用户登录的Session信息,这种情况下我们只是在用途上区分了一下这些表的使用范围,不会是和纯粹存取业务的数据相同。如果你还不理解的话,我只能放大招了。你就把SQL数据库当成Redis用就行了,存取的数据完全相同,只是操作的API不同而已,增加的只是一种存储介质而已,在做架构师设计编程框架的时候不限定程序员只能使用某一种存储介质罢了,比如:只能用Redis,为啥不能用SQL呢?没道理的嘛!
客户端缓存的编码实现,微软这里很人性化,直接有现成的类可以用,我相信大家都知道它:ResponseCacheAttribute,用起来也很简单,class、method上面随便用。
[ResponseCache(Duration = 60, Location = ResponseCacheLocation.Any)]
服务器端缓存只能是自己写或者用第三方的DLL了,但是他们都需要继承微软的这个接口:IDistributedCache。
1、你想用Redis来当二级缓存太容易了,有现成的DLL给你用,Microsoft.Extensions.Caching.StackExchangeRedis。
AddStackExchangeRedisCache
上面这个扩展方法拿过来直接用就好了,前提是你得先把Redis关联设置好。
2、你想用SQL Server数据库当二级缓存的话,嘿嘿很容易,首先需要有一个特定类型的表结构:
-- ----------------------------
-- Table structure for AspNetCoreCache
-- ----------------------------
DROP TABLE [dbo].[AspNetCoreCache]
GO
CREATE TABLE [dbo].[AspNetCoreCache] (
[Id] nvarchar(449) NOT NULL ,
[Value] varbinary(MAX) NOT NULL ,
[ExpiresAtTime] datetimeoffset(7) NOT NULL ,
[SlidingExpirationInSeconds] bigint NULL ,
[AbsoluteExpiration] datetimeoffset(7) NULL
)
GO
-- ----------------------------
-- Indexes structure for table AspNetCoreCache
-- ----------------------------
CREATE INDEX [Index_ExpiresAtTime] ON [dbo].[AspNetCoreCache]
([ExpiresAtTime] ASC)
GO
-- ----------------------------
-- Primary Key structure for table AspNetCoreCache
-- ----------------------------
ALTER TABLE [dbo].[AspNetCoreCache] ADD PRIMARY KEY ([Id])
GO
因为你用的是微软自己的SQL Server数据库,也有现成的DLL给你用,Microsoft.Extensions.Caching.SqlServer。
AddDistributedSqlServerCache
上面这个扩展方法拿过来直接用就好了,前提是你得先把表建好。
3、如果你想用MySQL数据库的话,那就只能自己定义了。先上表结构和SQL Server的一样:
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for aspnetcorecache
-- ----------------------------
DROP TABLE IF EXISTS `aspnetcorecache`;
CREATE TABLE `aspnetcorecache` (
`Id` varchar(449) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
`AbsoluteExpiration` datetime(6) DEFAULT NULL,
`ExpiresAtTime` datetime(6) NOT NULL,
`SlidingExpirationInSeconds` bigint(20) DEFAULT NULL,
`Value` longblob NOT NULL,
PRIMARY KEY (`Id`),
KEY `Index_ExpiresAtTime` (`ExpiresAtTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
因为这次你用的不是微软自己的数据库,嘿嘿不好意思,没有现成的,只能自己来搞了或者用第三方的。自己搞需要写出下面这一坨的代码:
我现在正在使用MySQL数据库作为二级缓存使用。Redis暂时保留,这样能节省一个Pod的容器资源,给公司省点钱,老板你看见了吗?是我在一直给你省钱呢……
先休息一下
未完待续