2020-09-16

Q:Redis基础

2020-09-16

key-value数据库是一种以键值对存储数据的一种数据库,类似Java的map,每个键都会对应一个唯一的值。key-value数据库代表为redis。

redis是一个key-value存储系统,支持存储的value类型相对更多,包括string(字符串)、list(列表)、set(集合)和zset(有序集合)。另外redis是一种内存型的数据库,所以可以对外提供很好地读写操作,但是内存占用高,数据持久化不容易

Redis采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由C语言编写,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)

几大特征:

  • 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。它的,数据存在内存中,类似于HashMapHashMap的优势就是查找和操作的时间复杂度都是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 提供了两种持久化功能:

  1. RDB (Redis Database):生成 RDB 文件,保存的是 key-value 的形式。

  2. AOF (Append Only File):保存 Redis 执行过程中的写命令

Q:哨兵集群

哨兵必须用三个实例去保证自己的健壮性的,哨兵+主从并不能保证数据不丢失,但是可以保证集群的高可用

哨兵必须保证三个实例才能保证集群的高可用

烧饼组件的功能:

  • 集群监控:负责监控 Redis master 和 slave 进程是否正常工作。

  • 消息通知:如果某个 Redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员。

  • 故障转移:如果 master node 挂掉了,会自动转移到 slave node 上。

  • 配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址

Q:什么叫高可用

Q:主从同步

提到了单机QPS是有上限的,而且Redis的特性就是必须支撑读高并发的,那你一台机器又读又写,这谁顶得住啊,不当人啊!但是你让这个master机器去写,数据同步给别的slave机器,他们都拿去读,分发掉大量的请求那是不是好很多,而且扩容的时候还可以轻松实现水平扩容。