什么是Redis
与MySQL数据存在磁盘上不同的是,Redis数据以k-v的键值对形式存在内存中,支持持久化。由于存在内存中,其读写速度很快。
Redis为什么那么快
主要有三点:
- 基于内存,读写速度快
- IO多路复用、单线程读写
- 有高效的数据结构
分布式缓存常见的技术选型方案
Memcached是分布式缓存刚兴起时常用的,现在基本上都用Redis进行分布式缓存,也有一些公司开发类似Redis的分布式缓存数据库。
Redis和Memcached的区别和共同点
共同点:
- 都是基于内存的数据库,一般都用作缓存使用
- 都有过期策略
- 两者的性能非常高
区别:
- Redis支持丰富的数据类型包括List、set、hash等,而Memcached只支持简单的数据类型
- Redis支持持久化,内存数据可存储到磁盘,主机重启后可恢复数据,而Memcached没有灾难恢复机制
- Redis有惰性删除和定期删除方式,而Memcached只有惰性删除
- Redis采用单线程IO多路复用,而Memcache是多线程,非阻塞IO复用
- Redis3.0之后就有原生的集群模式,而Memcached没有,需要靠客户端向集群分片中写数据
为什么要用Redis
- 速度快:Redis数据存在内存中,读写速度快,可以将一些高频访问的数据存在缓存中,这样速度可以提升几十倍
- 高并发:一般MySQL数据库的QPS(即每秒的请求数)为4k,由于Redis处理速度快,因此一部分数据库的数据可以放在缓存中,这样访问的速度提升,QPS可以达到5w+,10w+,这还是单个Redis,集群的更多,从而提升了系统整体的并发
- 功能全面: Redis除了用作缓存,还可以用于分布式锁、消息队列、限流、延时队列等
常见的缓存读写策略
最常见的是旁路缓存模式(Cache Aside Pattern),以db的结果为准
读:先在cache中读取,读不到就去数据库db中读取,之后db的数据更新到缓存中;
写:先更新数据库db,再删除缓存
关于写的顺序的解释:如果是先删除缓存,再更新db,若有请求1写数据A,请求2读数据A,请求1先删除了缓存,请求2在缓存中找不到数据A,于是去db中读,然后请求1更新db,有可能导致数据不一致的情况;而先更新数据库db,再删除缓存,也有可能产生数据不一致,就是请求1从db中读数据A,此时缓存中不存在数据A,然后请求2往db里写数据A且缓存中无数据A故不用删除,而请求1更新缓存,因此导致数据不一致。但这种情况出现的概率极低,因为缓存写入的速度快,大多数情况请求1在请求2写数据之前就已经从db中读数据并写入缓存中了,此后请求2来的时候更新db中数据并把缓存中数据A删除,就不会出现数据不一致的情况。
【归根结底,写的顺序的决定性因素是因为缓存本身写的速度快】