一、什么是Redis?
Redis是一个使用 C 语言编写的,开源的高性能非关系型(NoSQL)的键值对数据库。
Redis 可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。
二、Redis与传统数据库有什么不同?
- 与传统数据库不同的是 redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。
- 除此之外,Redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。
- Redis 也经常用来做分布式锁。
二、Redis的优缺点
优点
1、速度快
Redis能读的速度是110000次/s,写的速度是81000次/s 。
为什么速度快?
答:主要是因为数据存储在内存
2、支持数据持久化(AOF和RDB两种持久化方式)
因为我们知道redis是把数据是保存在内存里的,但是内存并不支持数据的持久化。例如机器断电时,内存里的数据会丢失且无法恢复。
Redis怎么支持数据持久化?
答:Redis把数据是保存在内存里,并对数据的更新异步地保存到磁盘上。(磁盘是支持数据持久化的)例如机器断电时,我们可以将数据恢复。
3、支持多种数据结构
Redis是基于Key-Value进行存储的,而对比很多基于Key-Value进行存储的SQL数据库,
Redis不同的是它提供五种主要数据结构,包括字符串、哈希、列表、集合、有序集合。
新的版本中Redis还支持一些衍生的数据结构,例如BitMaps、HyperLogLog、GEO等。
4、支持事务
Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
5、支持主从复制
主机会自动将数据同步到从机,可以进行读写分离。
6、支持高可用、分布式
- Redis-Sentinel(v2.8)支持高可用
- Redis-Cluster(v3.0)支持分布式
缺点
- 数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
- Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
- 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
- Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。
四、Redis为什么这么快?
- 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。
- 数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的。
- 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
- 使用多路 I/O 复用模型,非阻塞 IO;
- 使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis 直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;
四、为什么要使用 Redis?
因为使用Redis可以达到高性能且适合高并发场景。
因为直接读取数据库是需要从磁盘中读取,读取磁盘速度很慢。但是可以通过redis作为缓存。从磁盘读取到的数据除了返回给用户以外还把它存在缓存里,如果再访问此部分数据会先到缓存读取减少访问硬盘的次数提高了读取效率和性能。而且直接操作缓存能够承受的请求是远远大于直接访问数据库的,若把数据库中的部分数据转移到缓存中去,那么用户的一部分请求会直接到缓存这里而不用经过数据库。
五、为什么要用 Redis做缓存?
因为使用 redis可以做分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性。
缺点是需要保持 redis 服务的高可用,程序架构会比较复杂。