数据结构

几乎每篇文章都会说到Redis的数据结构,可见它的重要性。

Redis是k-v形式的,k都是String类型;v有很多种数据类型,并且随着Redis版本的迭代,v的值也越多。我们常听说的有:String、List、Set、ZSet、Hash,高级的类型有geo、steam、hyperloglog、布隆过滤器等


提到Redis,大家都会想到几个名词:noSQL、缓存机制。官方上这样说:Redis 是一个高性能的key-value数据库。

noSQL:not only SQL,非关系型数据库

特点:高性能、高可用、高扩展

分类:K-V型(Redis)、文档性(MongoDB:分布式文件存储)、列存储(HBase)、图关系数据库(Neo4J、InfoGrid)

步入正题

一、Redis的持久化分为RDB和AOF。

RDB是指在一定时间内,会将内存中的数据集快照写入硬盘,当再次读取这些数据时,直接拿快照读到内存。

  • 优点:文件紧凑、全量备份;数据恢复时比AOF速度快
  • 缺点:数据完整性不严谨,比如还未触发快照时,本机宕机,对数据库的写操作就消失了,没有持久化到本地文件中。

触发机制:

save:阻塞的,执行save命令,其他命令不能执行,因此不推荐使用

bgsave命令:由子线程fork负责持久化,主线程仍然处理客户端请求,推荐

自动触发:配置文件来执行,在redis.conf中配置;save m n:表示m秒内数据集存在n次修改

AOF是以日志的方式记录每一条写操作,记录Redis执行过的写指令到appendonly.aof,只许追加不可改写;Redis启动后读取appendonly.aof来恢复数据。

重写:由于文件一直追加,会导致文件越来越庞大,为了避免这种情况,Redis新增了重写机制

触发机制:

appendfsync:always 每修改同步, 每一次数据变更持久化到硬盘上,性能差,数据完整性高。

appendfsync:everysec 每秒同步,如果1秒内宕机,数据会有丢失

appendfsync:no 不同步

  • 优点:更好的保护数据不丢失;不影响客户端的读写,适合做灾难性误删的紧急恢复
  • 缺点:文件大,持久化速度慢;恢复数据时会把日志中的记录都重新执行一遍,因此速度慢

 二、Redis的内存回收机制

主要分为过期删除策略内存淘汰策略

1.过期删除是指删除过期时间的key

分类:

定时删除:Redis在set时会给key设置一个过期时间,当到达这个过期时间时就会立即删除。对内存友好,缺点是CPU得处理大量过期数据,影响Redis的吞吐率和响应时间。

惰性删除:当访问key时才会判断key是否过期,过期了删除。这样提高了CPU的效率,但是内存可能会很大。

定期删除:每隔一段时间,检查是否有过期的key,清除部分过期的key

PS:redis使用的定期删除和惰性删除

2.内存淘汰指内存达到最大内存极限时,使用某种算法来决定清理掉哪些数据,以保证新数据的存入。

kafuka和redis_kafuka和redis

Redis淘汰策略算法LRU淘汰最近最久未使用的key

借鉴:

三、事务

(1)Redis事务的本质是一组命令按顺序执行,,一个事务中所有命令会被序列化。Redis事务没有原子性没有隔离级别

(2)Redis事务的特性有:

  • 顺序性
  • 一次性(一个事务执行完整个流程就完事了,想要执行其他的开启另外的事务)
  • 排他性(一个事务执行过程中不允许其他事物执行)

 (3)执行流程

  • 开启事务(multi)
  • 进入队列(自动触发)
  • 执行事务(exec)

 

kafuka和redis_1024程序员节_02

(4)乐观锁

事务执行过程中有另外线程修改了共享资源,会导致事务执行失败

watch 监视对象,事务执行成功,监视自动取消

unwhtch 事务执行失败时解锁

四、集群

(1)简介

Redis最开始使用的是主从模式,即master(主服务器)宕机需要手动配置把slave(从服务器)转为master;后来提出了哨兵模式,有一个哨兵监测master、slave,当master宕机自动将slave转为master;3.X之后提出了cluster集群模式

(2)集群搭建


(3)主从模式

Redis的主从模式实现了读写分离,master负责写操作,slave负责读操作。

作用

  • 数据冗余:数据的热备份
  • 故障恢复:假设主服务器宕机了,那么请求发来之后还可以访问从服务器,非特殊情况下不至于造成服务器奔溃
  • 负载均衡:读写分离,一般的请求80%都是读操作,去访问从服务器,减少了主服务器的压力
  • 高可用基石:主从复制是哨兵模式和集群的基石

主从同步

  • 全量同步:redis全量复制发生在slave初始化阶段,slave将master所有数据复制一份
  • 增量同步:slave初始化后开始正常工作时master发生的写同步到slave中

redis的主从策略:刚连接时触发全量同步,同步结束后,进行增量同步。

PS:redis默认情况下都是主服务器

(4)哨兵模式

哨兵模式是一种自动投票选举老大(master)的过程。当主服务器宕机,哨兵1检测到之后并不会立马进行故障转移,只是暂时认为master主观下线,当其他的哨兵也检测到主服务器不可用,这是会由一个哨兵发起投票,进行failover(故障转移)操作,即切换主服务器,切换成功后,通过发布订阅模型,通知哨兵把自己之前检测的从服务器改变为主服务器,这个过程称为客观下线。

kafuka和redis_缓存_03

主要配置(sentinel.conf)

#                 被监控的名称 IP+端口  这个1是指如果主机挂了,会从slave中投票产生新主机
sentinel  monitor  myredis  host  port  1

例:sentinel  monitor  myredis  127.0.0.1  6379  1

注意的点: 

  • 如果master宕机,会从slave中随机选择一个当主机,当之前的master再回来后,它成了现在master的slave 

优点:

  • 基于主从复制,主从的优点,哨兵都有
  • 自动配置,更加健壮
  • 主从切换,故障转移,系统可用性更好

缺点: 

  • redis不好在线扩容
  • 配置麻烦

五、缓存

(1)缓存穿透(查不到)

  • 概念:缓存中不存在,查询时直接查DB。一般情况下,没有问题,查完数据库后放回缓存即可。
  • 意外情况:故意访问DB中不存在的数据
  • 解决办法:①DB中不存在,缓存空对象 ②布隆过滤器拦截没有的数据

(2)缓存击穿(过期数据)

  • 概念:热点数据,大量请求访问某过期的key,全部请求到数据库上
  • 解决方案:

       ①互斥锁:同一时刻只有一个请求去DB中拿,然后放入缓存,其他请求等待去缓存中拿

       ②永不过期:创建一个新线程定时将数据库中的数据更新到缓存中;更成熟的方式是创建定时任务同步数据。

(3)缓存雪崩

概念:大量的key设置了相同的过期时间,此时有大量请求过来,查询数据库,引起雪崩。这种雪崩称为自然雪崩。

致命的雪崩:缓存服务器某个节点宕机或断网,此时所有请求都得访问数据库,可能导致服务器崩了。与自然的雪崩不同的是自然雪崩缓存服务器还在,只是某一时间段内有大量请求,然后这些请求在放入到缓存中数据库都能承受的住,那么这时数据库理应也承受的住。

PS:击穿与雪崩的区别即在于击穿是对于特定的热点数据来说,而雪崩是全部数据。

文末福利

一、发布订阅 

(1)概念

发布订阅有3个关键词:发布者、订阅者、频道。举个例子,我们的微信公众号,写微信公众号的那个人是发布者,微信公众平台就是频道,发布者写完之后发布到频道,订阅了公众号的人就是订阅者。

(2)命令

在Redis中关于发布订阅主要有以下命令:

subscribe   频道    //订阅频道
publish   频道   消息   //发布消息到频道

(3)原理

发布订阅后,会在redis-server中维护一个字典,字典的键就是一个个频道,值是订阅者。

kafuka和redis_服务器_04

(4)应用场景

  • 实时消息(比如平台给每一个注册的人统一发送的消息)
  • 即时聊天(比如边看比赛视频等边评论)
  • 群聊