NoSQL数据库——Redis

一、什么是Redis

       

NoSQL数据库——Redis_第1张图片

       Redis是一个开源的,基于C语言编写的,包含多种数据结构、支持网络交互的、可基于内存也可持久化的日志型、key-value存储的NoSQL数据库。

1、Redis数据类型

      1)字符串(strings):可以进行数值计算;

      2)列表(lists):链表方式实现,可以实现常数级别的头尾数据插入;

      3)无序集合(sets):可以进行数据的求交、并、差集;

      4)有序集合(sorted sets):可以实现数据顺序存储;

      5)哈希(hashes):可以存储字符串和字符串值之间映射的map。

NoSQL数据库——Redis_第2张图片

2、Redis持久化

Redis提供了RDBRedis DataBaseAOFAppend Only File两种持久方式。

RDB:redis在某一时刻将数据持久化到磁盘中,是一种快照式的持久化方法。(类比于Flink中的Checkpoint检查点)

原理:redis单独创建(fork)一个子进程,将数据写入到一个临时文件中,待持久化过程结束后,用临时文件替换上次持久化好的文件,以此确保可以随时备份,同时具备极高的性能和服务性。

AOF:redis将执行过的写指令记录,在系统崩溃重启后,顺序执行这些指令实现数据恢复。(类比于HBase中的WAL文件)

原理:redis的AOF文件只允许追加不允许修改。每秒钟都会更新缓存里的指令到磁盘。随着操作增多,AOF文件会越来越大,redis通过文件重写机制,压缩内容,文件重写同样先创建(fork)一个子进程,并写入临时文件,然后进行替换。

3、Redis主从架构

Redis支持一主多从和多级从属的主从结构,其主从同步是异步进行的,即不影响主逻辑,也不会降低处理性能。

原理:从服务器向主服务器发出SYNC指令,主服务器接收到后,调用BGSAVE指令创建一个子进程进行数据持久化,期间写指令缓存于内存。指令完成后,将持久化好的RDB发送给从服务器,从服务器将其存储到磁盘,并加载入内存,期间缓存的写指令以redis协议发送给从服务器。

4、Redis事务处理

redis通过MULTI、EXEC、DISCARD、WATCH四个指令构建事务处理。通过开始事务,命令入队,执行事务三个阶段实现事务的顺序执行,保证其原子性。

  1. MULTI:组装一个事务;
  2. EXEC:执行一个事务;
  3. DISCARD:取消一个事务;
  4. WATCH:监视key变化,若在执行前被改变,则取消事务执行。

5、Redis常见问题解析

NoSQL数据库——Redis_第3张图片

1)击穿:Redis获取某一key时, 由于key不存在, 而必须向DB发起一次请求的行为, 称为“Redis击穿”。

引发原因:第一次访问、恶意访问不存在key、key过期。

规避方案:启动时提前写入、命名规范中间拦截、合理TTL或永不过期。

2)雪崩:Redis缓存层由于某种原因宕机后,所有的请求会涌向存储层,短时间内的高并发请求可能会导致存储层挂机,称之为“Redis雪崩”。

规避方案:集群方式、限流。

6、Redis5.0新特性

新添一个数据结构Stream,支持多  播的可持久化消息队列(借鉴与Kafka)。Redis Stream有一个消息链表,将所有加入的消息都串起来,每个消息都有一个唯一的ID和对应的内容,并且消息持久化的。

NoSQL数据库——Redis_第4张图片

每个Stream都有唯一的名称,即Redis的key,在首次使用xadd指令追加消息时自动创建。

每个Stream都可以挂多个消费组,每个消费组会有个游标last_delivered_id在Stream数组之上往前移动,表示当前消费组已经消费到哪条消息了。每个消费组都有一个Stream内唯一的名称,消费组创建时需要指定从Stream的某个消息ID开始消费,这个ID用来初始化last_delivered_id变量。

每个消费组(Consumer Group)的状态都是独立的,相互不受影响。并且同一个消费组(Consumer Group)可以挂接多个消费者(Consumer),这些消费者之间是竞争关系,任意一个消费者读取了消息都会使游标last_delivered_id往前移动。每个消费者有一个组内唯一名称。

 

你可能感兴趣的:(数据库,redis,数据库)