一. 背景
常用的SQL数据库的数据都是存在磁盘中的,虽然在数据库底层也做了对应的缓存来减少数据库的IO压力,但由于数据库的缓存一般是针对查询的内容,而且粒度也比较小,一般只有表中的数据没有发生变动的时候,数据库的缓存才会产生作用,但这并不能减少业务逻辑对数据库的增删改操作的IO压力,因此缓存技术应运而生,该技术实现了对热点数据的高速缓存,可以大大缓解后端数据库的压力。
二. 主流应用架构
客户端在对数据库发起请求时,先到缓存层查看是否有所需的数据,如果缓存层存有客户端所需的数据,则直接从缓存层返回,否则进行穿透查询,对数据库进行查询,如果在数据库中查询到该数据,则将该数据回写到缓存层,以便下次客户端再次查询能够直接从缓存层获取数据。
三. Redis特性
Redis的全称是Remote Dictionary Server,它主要提供了5种基本的数据结构:字符串、哈希、列表、集合、有序集合。它的特性如下:
1.速度快
正常情况下,Redis执行命令的速度非常快,官方给出的数据是10万+QPS(query per second),当然这也取决于机器的性能,但这里先不讨论机器性能上的差异,只分析一下是什么造就了Redis除此之快的速度:
(1).Redis完全基于内存,绝大部分请求是纯粹的内存操作,执行效率高;
(2).Redis使用单进程单线程模型的键值对数据库,将数据存储在内存中,存取均不会受到硬盘IO的限制,因此执行速度极快,另外单线程也能处理高并发请求,还可以避免频繁上下文切换和锁竞争;
(3).数据结构简单,对数据操作也简单,Redis不使用表,不会强制用户对各个关系进行关联,不会有复杂的关系限制,其存储结构就是键值对,类似于HashMap,HashMap最大的优点就是存取的时间复杂度为O(1);
(4).Redis使用多路I/O复用模型,为非阻塞IO(注:Redis采用的I/O多路复用函数为epoll/kqueue/evport/select);
2.支持数据磁盘持久化存储
通常看,将数据放在内存中是不安全的,一旦发生断电或者机器故障,重要的数据可能就会丢失,因此Redis提供了两种持久化方式:RDB和AOF,即可以用两种策略将内存的数据保存到硬盘中,这样就保证了数据的可持久性。
3.支持多种数据结构,功能丰富
除了5种基本数据结构,Redis还提供了许多额外的功能:
- 提供了键过期功能,可以用来实现缓存。 提供了发布订阅功能,可以用来实现消息系统。
- 支持Lua脚本功能,可以利用Lua创造出新的Redis命令。
- 提供了简单的事务功能,能在一定程度上保证事务特性。
- 提供了流水线(Pipeline)功能,这样客户端能将一批命令一次性传到Redis,减少了网络的开销。
4.简单稳定
Redis的简单主要表现在三个方面:
- Redis的源码很少;
- Redis使用单线程模型,这样不仅使得Redis服务端处理模型变得简单,而且也使得客户端开发变得简单。
- Redis不需要依赖于操作系统中的类库(例如Memcache需要依赖libevent这样的系统类库),Redis自己实现了事件处理的相关功能。
Redis虽然很简单,但是不代表它不稳定。以维护的上千个Redis为例,没有出现过因为Redis自身bug而宕掉的情况。
5.支持多种编程语言
Redis提供了简单的TCP通信协议,很多编程语言可以很方便地接入到Redis,并且由于Redis受到社区和各大公司的广泛认可,所以支持Redis的客户端语言也非常多,几乎涵盖了主流的编程语言,例如Java、PHP、Python、C、C++、Nodejs等。
6.支持主从复制
Redis提供了复制功能,实现了多个相同数据的Redis副本(如图所示),复制功能是分布式Redis的基础。
7.高可用和分布式
Redis从2.8版本正式提供了高可用实现哨兵模式(Redis Sentinel),它能够保证Redis节点的故障发现和故障自动转移。
Redis从3.0版本正式提供了分布式实现Redis Cluster(集群),它是Redis真正的分布式实现,提供了高可用、读写和容量的扩展性。
参考文章:
Redis的八大特性
redis的八大特性