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命令,就开始复制
- 保存主节点信息
- 主从建立socket连接
- 发送ping命令
- 权限验证(requirepass)
- 同步数据集
- 命令持续复制
数据同步有两种方式:全量复制和部分复制
全量复制用于初次复制的场景
部分复制用于在主从复制中因网络闪断等原因造成数据丢失的场景,朱接地那会补发丢失的数据
复制积压缓冲区
主节点响应写命令时,不但会把命令发送给从节点,还会写入复制积压缓冲区
缓冲区本质上是先进先出的定长队列,能实现保存最近已经复制数据的功能,用于部分复制和复制命令丢失的数据补救
UML时序图
通过UML类图可以将类之间的所有关系(泛化、实现、关联、聚合、组合、依赖)都能具体的体现出来。
<
类和类的实现关系,用带空心箭头的虚线表示
继承关系,即类和类的泛化关系,用带空心箭头的实线表示
发动机和小车,类和类之间的组合关系,用带实心菱形箭头的实线表示
学生和班级,类与类之间的聚合关系,用带空心菱形箭头的实线表示
学生和身份证之间是关联关系,用实线表示
学生和小车,之间是依赖关系,用带箭头的虚线表示