Redis是什么?
REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。
Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。
为什么需要Redis?
-
数据量的增长与读写压力的增加:随着业务的进行,数据量不断增长,而对于数据的访问需求也会不断增加。从MySQL开始,为了应对不断增长的访问数据需求,要进行各种分表分库的操作,即便如此,也无法完全应付极高的读写压力。
-
热数据的存取:数据按照访问频率可以分为冷热两种类型,热数据意为频繁访问到的数据。在如此高的数据访问量下,通过关系型数据库查询以及硬盘读写显然不能满足效率。因此,将这部分“热数据”存储在内存当中,可以缓解这一问题。
Redis的原理
-
内存存储: Redis的主要特点之一是将数据存储在内存中,这使得它能够快速地读取和写入数据。数据在内存中被组织成键值对的形式。
-
持久化: 虽然数据存储在内存中,但Redis支持将数据持久化到磁盘,以便在重启后恢复数据。Redis有两种主要的持久化方式:RDB(Redis Database Dump)和AOF(Append-Only File)。
- RDB:根据预定的时间间隔或事务次数,Redis将数据快照写入磁盘,创建一个二进制文件以保存当前内存中的数据状态。
- AOF:Redis将每个写操作都追加到一个日志文件中,记录了重放操作以重建数据集的过程。AOF文件包含了恢复数据所需的所有操作。
-
数据结构: Redis支持多种数据结构,包括字符串、哈希、列表、集合、有序集合和位图等。这些数据结构使得Redis不仅仅是一个键值存储,还具有更丰富的数据操作能力。
-
单线程模型: Redis采用单线程模型来处理客户端请求。这是因为大多数操作都是在内存中进行的,所以单线程足以应对高吞吐量的请求。此外,单线程模型还避免了多线程并发访问数据时可能出现的竞争条件。
注意事项
-
大Key:顾名思义,大Key就是空间占用非常大的Key,比如value超过10kb的字符串,或者大于5000元素/10MB的复杂数据结构。大Key会造成高读写成本,主从复制异常甚至服务阻塞的问题。
- 解决方法:1. 拆分大Key为多个小Key。2. 压缩大Key的value。
-
热Key:用户访问一个Key的QPS特别高,导致Server实例出现CPU负载突增或者不均的情况。
- 解决方法:1. 设置LocalCache 2. 拆分热Key
-
缓存击穿:查询一个一定不存在的数据,由于Redis通常不会缓存一定不存在的数据,因此这类查询会直接打到数据库,导致数据库响应慢甚至宕机。
- 解决方法:1. 缓存一个不存在的Key的空值。2. 布隆过滤器
-
缓存雪崩:当有一个热Key过期,或者大量的Key集中过期,就会出现大量请求同时击穿到数据库的情况,也会影响数据库的性能和稳定。
- 解决方法:1. 分散缓存失效时间,例如引入随机值,对于热Key设置尽量长的失效时间。2.建立缓存集群