1.MemCache
MemCache是一个高性能,分布式内存对象缓存系统,通过再内存中缓存一个巨大的hash表,他能存储图像,文件,索引,sql语句结果等数据(Mongodb也能存储图像,文件等等),先将数据从数据库提取到内存中,再从内存中读取,因为基于内存,所以读取速度快。
1.1MemCache的特性
1.使用物理内存作为缓存区,数据存储在内存上,可以独立运行在服务器上,不能超过内存大小,每个进程的最大内存为2G。如果想要缓存更多的数据,可以开辟更多的MemCache进程(不同端口)或者使用不互相通信分布式Memcache进行缓存。当Memcache断电挂掉后,数据就没有了,数据不可恢复。
2.使用K-V键值对方式来存储数据,这是一种单索引的结构化数据组织形式,查询的效率高。
3.协议简单:基于文本行的协议,直接通过telnet在Memcache服务器上进程存取数据操作,简单。
4.使用libevent高性能通信(Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库)。
5.内置的内存管理方式:使用stab Allcation进行内存管理,按照既定的内存,将内存切割成特定的长度来存储相应的数据。
6.分布式:使用hash一致性算法,进行分布式存储数据,各个MemCache服务器之间互不通信,各自独立存储数据,不共享人格信息,服务器不具有分布式功能,分布式部署取决于memcache的客户端。
7.缓存策略:LRU(页面置换算法:最近最久未使用算法),在内存用完之后,服务器端会根据LRU策略,计算最近最久没有使用过的数据,将其进行替换。
2.Redis
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
2.1Redis的特性
1.Redis基于内存存储数据。
2.Redis不仅仅支持简单的是K-V类型数据,同时还支持String,set,list,hash,zset(sorted sets 有序集合)的value类型。
3.redis当物理内存用完时,可以将一些很就没有用到的value交换到磁盘。
4.redis支持数据的持久化,通过快照和AOF日志两种持久化方式。RDB快照的方式,将内存中的数据不断写入磁盘;使用类似MySql的AOF日志方式,记录每次更新的日志。前者性能较高,但是可能会引起一定程度的数据丢失,后者相反。 Redis支持将数据同步到多台从数据库上,这种特性对提高读取性能非常有益。
5.主从结构,可以一主多从,也可以一主一从,主从同步。
6.redis直接构建了VM机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
7.使用多路I/O复用模型,非阻塞I/O。
2.2Redis为什么这么快
1.完全基于内存,绝大部分请求是存粹的内存操作,非常快速。
2.数据结构简单,对数据的操作也简单,Redis中的数据结构是专门进行设计的。
3.采用单线程,避免了不必要的上下文切换和资源竞争,也不存在多进程多线程的切换导致消耗CPU,不用去考虑各种锁的问题,不存在加锁和放锁操作,没有因为可能出先死锁二导致性能消耗。
4.redis直接构建了VM机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
5.使用多路I/O复用模型,非阻塞I/O。
2.3Redis缓存穿透、缓存雪崩、缓存击穿
1缓存穿透
指一直查询一个不存在的数据,由于缓存命不中所以就会去查询数据库,查不到就不会写入缓存,这就导致了这个不存在的数据每次请求都会到数据库中查询,这就造成了缓存穿透。
解决方法:
①将空的对象也缓存起来,并给他设置一个很短的过期时间,最长不超过5分钟。
②采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
2缓存雪崩
缓存集中在一段时间内失效,发生了大量的缓存穿透,所有的查询都落到数据库上,就会造成缓存雪崩。
解决方法:
尽量让失效的时间点不分布在用一个时间点。
3缓存击穿
就是指一个key非常热点,在不停的抗住大并发,当这个key失效的瞬间,持续大量的大并发就穿透缓存,直接请求到数据库。
解决方法:
可以设置Key永不过期。
3.MemCache和Redis的比较
1.数据结构:Memcache仅能支持简单的K-V形式,Redis支持的数据更多
2.多线程:Memcache支持多线程,Redis支持单线程,CPU利用Memcache利用率更高
3.持久化:Redis支持持久化,Memcache不支持持久化
4.分布式:Redis做主从结构,而Memcache服务器需要通过hash一致化来支撑主从结构
5.虚拟内存:Redis当物理内存使用完时,会将一些很久没有用的内存交换到磁盘,而Memcache采取的LUR策略,将一部分数据刷新掉
6.有持久化需求或者对数据结构和处理有高级要求的应用,选择redis,其他简单的key/value存储,选择memcache
参考博客
链接: [link]https://www.cnblogs.com/JavaBlackHole/p/7726195.html
链接: [link]https://blog.csdn.net/qq_34126805/article/details/81748107