在网站架构的衍化历程中,当网站遇到性能瓶颈时,首先想到的解决方案就是使用缓存。
缓存指将数据存储在较高访问速度的存储介质中,以供系统处理。一方面缓存访问速度快,可以减少数据的访问时间,另一方面如果缓存的数据是经过计算处理得到的,那么被缓存的数据无需重复计算就可以直接使用,因此缓存还起到减少计算时间的作用。
缓存的本质是一个内存Hash表,数据缓存以一对key,Value的形式存储在内存Hash表中。
缓存主要用来存放那些读写比较高,很少变化的数据,如商品的类目信息,热门词的搜索列表信息,热门商品信息等。应用程序在读取数据时,先到缓存中读取,如果读取不到或数据已经失效,再访问数据库,并将数据写入缓存。
什么是分布式缓存(Distribute Cache)
指将缓存部署在多个服务器组成的集群中,以集群方数提供缓存服务,在分布式环境或系统下,把一些热门数据存储到离用户近,离应用近的位置,并尽量存储到更快的设备以减少远程数据传输的延迟。
分布式缓存常用的两种缓存技术服务端特点
一Memcached
Memcashed曾一度是网站分布式缓存的代名词,被大量网站使用。其简单的设计,优异的性能,互不通信的服务集群,海量数据可伸缩的架构令网站架构师们趋之若鹜。其采用的是一种集中式的缓存集群管理,也被称为互不通信的架构方法,缓存与应用分离,缓存系统部署在一组专门的服务器上,应用程序通过一致性hash等路由算法选择缓存服务器,远程访问缓存数据,缓存服务器之间不通信,缓存集群的规模可以很容易地实现扩容,具有良好的可伸缩性。
二Redis服务端
Redis是一个开源的使用ANSI C语言编写,支持网络。可基于内存亦可持久化的日志型key-value数据库,并提供多种语言的API。
其特点是
1)内存数据库 完全基于内存,绝大部分请求是纯粹的内存操作,非常快。
2)单线程 意味着它不需要处理线程间的通信问题,不需要频繁切换上下文。
3)采用io多路复用模型
IO多路复用模型是建立在内核提供的多路分离函数select基础之上的,系统首先将需要进行IO操作的socket添加到select中,然后select会帮我们监听每个注册的io流的状态。当有数据到达时,对应的socket被激活,用户线程读取数据并且继续执行
以上三点决定了redis是非常快的,redis的读速度达到了11w/s,写速度达到8w/s。
Redis相对于MemCash的优势
1)支持快照和持久化
MemCash是将数据存在内存中,但是一旦遇到服务器重启或宕机,所有的数据都会消失,因为内存中的数据无法持久化,相对的
Redis则支持数据的快照和持久化,即使在服务器重启后也可以通过在硬盘中的快照文件,实现数据恢复。
2)支持Master-Slave主从复制
如果MemCash的服务全部挂掉了,所有的请求瞬间会涌向数据库,导致数据库宕机,而Redis则支持Master-Slave主从复制。当主节点出现问题可以从子节点提供服务,实现快速的故障恢复,而且其主节点提供写服务,子节点提供读服务,可大大提高Redis服务的并发量。
3)支持更加丰富的数据类型
redis可以完全实现memcache的功能,并且它还提供了额外的一些操作,例如:获取字符串长度,往字符串append内容 等等一些操作。
之前说过,缓存本质是一个内存Hash表,而Redis天然支持Hash结构,即每次可以只更新Hash表中的某一属性。内容 等等一些操作
而在memcaceh中,因为只支持string存储,所以对于结构化的信息例如用户信息,即使需要更改某一个属性的数据,也需要在存入的时候对整个用户信息执行一次序列化操作,而取出的时候进行一次反序列化操作,这样对于性能来说是非常不友好的。