有些来源于 JavaGuide,有些自己整理

redis的使用场景:

  • 热点数据的缓存
  • 排行榜,比如使用zset数据类型
  • 限时任务,比如短信验证码设置过期时间
  • 分布式锁,用在分布式项目中的定时任务,使用setnx避免定时任务重复执行
  • 计数器的应用,比如,incr原子性操作可以自增
  • 延时操作,比如下订单10分钟后没有支付自动失效
  • 求两个用户的共同好友
  • 消息队列

Redis的 lpush+brpop 命令可以实现阻塞队列,生产者客户端使用 lpush从列表左侧插入元素,多个消费者客户端使用 brpop 命令阻塞式的抢夺尾部的元素,多个客户端保证了消费的负载均衡和高可用性。

  • 共享session

一个分布式web服务将用户的Session信息保存在各自的服务器中,这样会造成一个问题,出于负载均衡的考虑,分布式服务会将用户的访问均衡到不同的服务器上,用户刷新一次可能会发现需要重新登陆。为了解决这个问题,可以使用Redis对用户的Session进行集中管理。

Redis为什么这么快?

基于内存操作
数据结构简单 string list set zset hash
单线程,避免了不必要的上下文切换和竞争条件,也不存在多线程或者多线程导致的切换而消耗CPU,不去考虑各种锁的问题,不存在加锁释放锁,没有因为死锁导致的性能消耗
多路I/O复用模型,非阻塞IO

Redis持久化的方式

RDB、AOF
RDB:内存快照,redis按照一定时间策略把内存的数据以快照的方式,保存到磁盘的二进制文件,产生的数据叫dump.rdb
AOF:redis会将每个写操作通过Write函数追加到文件最后。Redis重启会通过执行AOF文件中保存的写命令在内存中重建数据库。

RDB和AOF的区别:

AOF更新频率高
AOF比RDB更安全,文件更大
RDB性能比AOF好
两个都配置了,优先AOF

Redis和Memcache的区别

共同点:
都是基于内存的数据库,一般当做缓存来用
都有过期策略
性能都很高
不同点:
redis有更丰富的数据类型(list、string、set、zset、hash),memcache的只支持k/v类型的数据
redis可以持久化数据,memcache不行
redis在内存使用完后,会将一部分数据放入磁盘中,memcache只能在内存使用完之后报异常

为什么使用Redis/为什么要使用缓存?

高性能、高并发
高性能:用户第一次访问数据时,数据从硬盘中读取,速度很慢,但是如果将这些访问比较高频的数据放入缓存中,当用户第二次访问时,直接从内存中拿数据,速度会很快。当然,我们也要保证数据库和缓存的数据的一致性。当数据库修改了值,缓存也要改变
高并发:MySQL的QPS一般是在1w左右(4核8g),如果使用Redis,那么QPS可以达到10w,最高能达到30w,使用缓存比查询数据库能获得更高的并发量。

QPS:服务器每秒能够查询的次数

Redis单线程

Redis通过I/O多路复用监听来自客户端的大量连接

《redis开发与运维》

Redis拓扑结构

一主一从结构、一主多从结构、树状主从结构
一主一从结构用于主节点主线宕机时从节点提供故障转移支持
一主多从结构可以实现redis读写分离,写操作在主节点,读操作在从节点;但是多个从节点会导致主节点写命令多次发送消耗网络带宽
树状主从结构
引入复制中间层,降低主节点负载和需要传送给从节点的数据量,当主节点需要挂载多个从节点时,为了避免对主节点的性能干扰,可以采用这种结构降低主节点压力。

Redis复制过程

从节点执行slaveof命令,就开始复制

  1. 保存主节点信息
  2. 主从建立socket连接
  3. 发送ping命令
  4. 权限验证(requirepass)
  5. 同步数据集
  6. 命令持续复制

    数据同步有两种方式:全量复制和部分复制

    全量复制用于初次复制的场景
    部分复制用于在主从复制中因网络闪断等原因造成数据丢失的场景,朱接地那会补发丢失的数据

通过对比主从结点的复制偏移量,可以判断主从结点数据是否一致

复制积压缓冲区

主节点响应写命令时,不但会把命令发送给从节点,还会写入复制积压缓冲区
缓冲区本质上是先进先出的定长队列,能实现保存最近已经复制数据的功能,用于部分复制和复制命令丢失的数据补救

UML时序图

Redis - 图1
通过UML类图可以将类之间的所有关系(泛化、实现、关联、聚合、组合、依赖)都能具体的体现出来。
<>表示是一个抽象类
类和类的实现关系,用带空心箭头的虚线表示
继承关系,即类和类的泛化关系,用带空心箭头的实线表示
发动机和小车,类和类之间的组合关系,用带实心菱形箭头的实线表示
学生和班级,类与类之间的聚合关系,用带空心菱形箭头的实线表示
学生和身份证之间是关联关系,用实线表示
学生和小车,之间是依赖关系,用带箭头的虚线表示