云服务器怎么安装linux系统下载
简介: 缓存是架构设计中的常用概念,本文基于Go实现了一个简单的缓存组件,支持最基本的缓存操作。
简介
概念
缓存是计算机科学中的一个重要概念。设想某个组件需要访问外部资源,它向外部源请求资源,接收并使用资源,这些步骤都需要花费时间。当组件再次需要资源时,可以再次请求资源,但这种方式从时间上考虑是比较低效的。相反,组件可以将请求结果保存在本地某处,然后再次使用,使用本地数据总是比请求外部数据要快,这一策略就是缓存的基本概念。我们可以在内存、CPU缓存和服务器缓存(如Redis)中找到这些例子。
不同用例
Web服务中的缓存用于减少数据请求的延迟。Web服务保存第一次查询的执行结果,然后在需要的时候再次使用,而不用再次访问数据库。取决于数据的特性,缓存有不同情况,可以有相对静态的数据,如统计数据、计算结果,也有可能是经常变化的数据,如评论区或SNS。
最好的情况是缓存那些很少变化的数据。以月度统计数据为例,上个月的数据将不会变化,如果对它进行缓存,可能就不需要查询数据库获取上个月的数据了。
对于快速变化的数据,在存在多个服务器时最好谨慎些。看看上面的设计,以评论区服务为例,考虑如下场景,用户A发表了一些评论,然后A决定删除评论,用户B尝试回复评论。在某些情况下,A和B向不同的服务器发送请求。A的删除操作可能不会传播到B的服务器缓存。结果会是这样: 缓存A和缓存B有不同的数据,数据库不知道哪个才是真实的,数据的完整性被破坏了。
在这种情况下,可以使用单一外部缓存(如上图所示),多个服务器只访问统一的缓存。
限制条件
缓存比数据库要快,但在大小上要小得多。这是因为数据库将数据存储在驱动器中,缓存将数据存储在内存中。它们遵循各自相同的特征,同样也有不同的特点,如果主机停止工作,缓存的所有数据都会丢失,但数据库的数据不会丢失。
由于缓存位于内存中,空间是有限的,需要选择缓存哪些数据。在CS课上,我们会听到LRU(Least Recently Used,最近最少使用),LFU(Least Frequently Used,最不常用)和FIFO(First In First Out,先入先出)这样的词,这些是"选择哪一个"的标准,被称为驱逐策略(eviction policy)。
设计&实现
ecs云服务器搭建
需求
云服务器干什么用的
键值存储(Key-Value Storage): 缓存既要有输入键、输出值的读功能,也要有输入键、值的写功能。这些函数应该在平均O(logN)时间内完成,其中N是键的数量。LRU驱逐策略: 由于缓存空间有限,如果缓存满了,一些数据应该被清除,选择用LRU算法实现。TTL (Time To Live): 每个键值都有生存时间,如果TTL到期,该键值应该被驱逐。API设计
键值存储的意思是,如果请求键,缓存会返回那些存在的键的值,类似于hash-map抽象数据类型,以提供以下API概念的应用程序为例:
funcGet(keystring)(hitbool, value []byte)funcPut(keystring, value []byte)(hitbool)Get: 通过键读取值的API。如果所提供的键在缓存中存在,则返回等效值。如果不存在,则返回hit=false。对于LRU策略,键将被标记为最近被使用,从而使该键不会被驱逐。Put: 通过键写入值的API。如果所提供的键存在,则value将被替换为新值。如果不存在,将创建新的键值存储。因为该函数可以添加数据,其执行可能会导致溢出。在这种情况下,根据LRU策略,最近最少使用的键值将被清除。新添加/修改的键将被标记为最近使用的键。数据结构
我们使用两种不同的数据结构: hash-map和双向链表,实现键值读写和LRU策略的特性。
Hash-map: Hash-map是使用最广泛的键值数据结构,在Go中是现成的数据类型,可以通过map[]定义。双向链表: LRU缓存可以通过双向链表实现。基于这两种数据结构可以同时提供键值特性和LRU策略。参考以上设计概念图,hash-map的键将是字符串键,值是指向链表节点的指针,节点将保存键的值。
如果用户调用Get(),缓存应用程序将在hash-map中搜索键,跟随指针到达链表中的一个节点,获取值,完成LRU策略,并将值返回给用户。
类似的,如果调用Put(),会在hash-map中搜索键,跟踪指针并替换值,完成LRU策略,或者向hash-map中插入新键,并向链表中插入新节点。
点击查看原文,获取更多福利!
https://developer.aliyun.com/article/1119331?utm_content=g_1000366514
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
云邮pop服务器地址
