2020-09-16
Q:Redis基础
key-value数据库是一种以键值对存储数据的一种数据库,类似Java的map,每个键都会对应一个唯一的值。key-value数据库代表为redis。
redis是一个key-value存储系统,支持存储的value类型相对更多,包括string(字符串)、list(列表)、set(集合)和zset(有序集合)。另外redis是一种内存型的数据库,所以可以对外提供很好地读写操作,但是内存占用高,数据持久化不容易
Redis采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由C语言编写,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)
几大特征:
-
完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。它的,数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
-
数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;
-
采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
-
使用多路I/O复用模型,非阻塞IO;
-
使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;
Q:那他是单线程的,我们现在服务器都是多核的,那不是很浪费?
redis虽然是单线程的,但是现在服务器都是多核的,我们可以单机多个几个redis实例
Q:单机会有瓶颈,如何解决这个瓶颈(redis集群)
我们用到了集群的部署方式也就是Redis cluster,并且是主从同步读写分离,类似Mysql的主从同步,
Redis cluster 支撑 N 个 Redis master node,每个master node都可以挂载多个 slave node。
这样整个 Redis 就可以横向扩容了。如果你要支撑更大数据量的缓存,那就横向扩容更多的 master 节点,每个 master 节点就能存放更多的数据了
为什么需要redis集群?
- redis本身的QPS已经很高了,但是如果在一些并发情况下,性能还是会受到影响,这个时候我们希望由更多的redis来完成工作
- 处于存储的考虑,redis所有的数据都放在内存中,如果数据量大,很容易受到硬件的限制,升级硬件收效和成本比太低,我们需要一种横向扩展的办法
- 高可用,只有一个Redis服务,一旦服务器宕机,所有的客户端都无法访问
Q:Redis持久化
持久化是一个重要的环节。因为redis在内存中,持久化必须有,两种方式
RDB:对redis中的数据执行周期性的持久化
AOF:AOF机制对每条写入命令作为日志,以append_only的模式写入到一个日志文件中,因为这个模式是只追加的方式,所以没有任何磁盘寻址的开销,所以很快。
两种方式都可以把Redis内存中的数据持久化到磁盘上,然后再将这些数据备份到别的地方去,RDB更适合做冷备,AOF更适合做热备,
比如我杭州的某电商公司有这两个数据,我备份一份到我杭州的节点,再备份一个到上海的,就算发生无法避免的自然灾害,也不会两个地方都一起挂吧,这灾备也就是异地容灾,地球毁灭他没办法
tip:两种机制全部开启的时候,Redis在重启的时候会默认使用AOF去重新构建数据,因为AOF的数据是比RDB更完整的
Q:两种机制的各自优缺点
介绍两种持久化:
Redis 是内存数据库,数据存储在内存中,一旦服务器进程退出,数据就丢失了,所以 Redis 需要想办法将存储在内存中的数据持久化到磁盘
Redis 提供了两种持久化功能:
-
RDB (Redis Database):生成 RDB 文件,保存的是 key-value 的形式。
-
AOF (Append Only File):保存 Redis 执行过程中的写命令
Q:哨兵集群
哨兵必须用三个实例去保证自己的健壮性的,哨兵+主从并不能保证数据不丢失,但是可以保证集群的高可用
哨兵必须保证三个实例才能保证集群的高可用
烧饼组件的功能:
-
集群监控:负责监控 Redis master 和 slave 进程是否正常工作。
-
消息通知:如果某个 Redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员。
-
故障转移:如果 master node 挂掉了,会自动转移到 slave node 上。
-
配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址
Q:什么叫高可用
Q:主从同步
提到了单机QPS是有上限的,而且Redis的特性就是必须支撑读高并发的,那你一台机器又读又写,这谁顶得住啊,不当人啊!但是你让这个master机器去写,数据同步给别的slave机器,他们都拿去读,分发掉大量的请求那是不是好很多,而且扩容的时候还可以轻松实现水平扩容。