现在互联网产品中,当用户量达到一定规模,数据库响应不足以满足用户需求时,都会采用各种缓存系统来进行数据的缓存,以期减少用户响应时间。在互联网场景中常用的缓存系统大概有:memcached、redis、guava。下面分别进行一些介绍:
1. memcached: memcache是一套分布式的高速缓存系统,但其实它是客户端分布式。
memcached 作用: 在内存中缓存数据,减少用户访问数据库次数,快速响应。
memcached内存分配机制:
- page:memcached 将内存分成不同的page,page大小默认是1M;
- slabs:为了降低内存碎片,更好管理内存,将内存分成不同级别的slabs,不同级别的包含不同大小的块,块才是实际存储数据的内容空间;
- chunk:存储数据的内存空间,同一级别的slabs中包含的chunk大小是一致的;
- slabs之间的chunk的递进growth-factor 是可以设置的,默认是1.25,growth-factor不宜设置过大,容易导致内部碎片
- 当内存空间不足时,采用LRU最近最少使用的策略,对内存进行回收
memcached 实现机制
- memcached的分布式策略成为客户端分布式,服务器端不维护分布式的逻辑,通过客户端的逻辑(如 key模余来确定在哪台服务)等策略来实现分布式
- 取余分布式、一致性hash分布式
- 取余分布式就是先获取key,通过key值模服务器台数,确定应该将此key值put进哪台服务器;缺点是,如果新增一台服务器,所以映射关系失效
- 一致性hash映射:先计算key的hash值,然后将这些值均匀的映射到0-- 2的32次方之间,在0--2的32次方范围构成一个圆,n台服务器均匀的位于这个圆上,也就是圆上有n个点,每个点代表一个值,当hash值对应的第一次大于圆上某个点所代表的值得时候,将此key值put到改点对应的服务器之上。 优点:当新增加服务器时,只有少量key的hash映射失效。
2. redis 是一种面向“键/值”对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存储,适应高并发的应用场景。key、value的持久化数据系统。
- redis 优点:1)性能高,每秒100K+的读写频率;2) 丰富的数据类型,相比memcached单一的String类型更为丰富;3)所有操作都是原子性;4)更为丰富的特性,支持发布、订阅机制;
- redis的数据时可持久化的,其数据同memcached一样数据也是存在内存中的,区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
- 不是简单的key、value,支持多种类型的数据服务,key是二进制安全的,因此可以使string、图片内容、list等等,value值也可以使各种类型数据,且最大可达1G。
- redis丰富的数据类型包括: String、List(redis 中list采用的是linkedlist实现,是因为为了快速添加删除元素)、hashes、set、sorted set. 【关于各种数据类型的操作可参考 http://tech.it168.com/a2012/0109/1299/000001299837.shtml】
- redis 安装配置 http://tech.it168.com/a2011/0830/1239/000001239923.shtml
3. Cassandra
4.淘宝kv缓存系统Tair
5. zookeeper
6.
memcached