1 引入
- redis属于nosql,支持多样化数据,高性能
2 特点
- 支持多种数据类型
- 持久化
- 高效率
- 基于内存操作:Redis是单线程的,redis是基于内存操作,它的瓶颈取决于内存和网络带宽,不在CPU。多线程CPU会进行上下文切换,所以redis采用单线程效率是最高的。(基于磁盘操作选择多线程是因为,磁盘读取速度慢,多线程能够提高cpu的利用率)
3 数据类型
3.1 五种基本数据类型
- String字符串(可用于计数器,缓存等)
- List列表(底层是链表。可以当作栈,队列,阻塞队列来使用)
- Set集合(值不重复,可以用于且交集,如共同好友等)
- ZSet有序集合(相对Set多一个值,ZSet会根据该值排序,可用于排行榜之类的)
- Hash(本质跟String类似,key-value形式,hash多用于对象存储,String多用于字符串存储)
3.2 三种特殊数类型
- Geospatial(可以添加地理位置(经纬度),可以计算两地间的距离,或者查找某地周围元素,它底层是ZSet,可以使用ZSet相关命令操作Geospatial)
- Hyperloglog(可以求并集,可以用于统计网站访问量(同一个用户算一次访问),占用固定12kb内存,就可以统计2^64用户量,有0.81%错误率。如果不允许出错,可以使用set或自定义数据类型)
- Bitmap(位存储,只有0,1两个状态,用于统计两个状态的信息,如活跃,不活跃。如使用bitmap记录员工一年打卡记录,可以很快算出打卡天数)
4 事务
4.1 含义
- redis事务本质是一组命令的集合。reids事务没有隔离级别概念,事务命令加入队列后,要发起执行命令才执行。流程:开启事务(multi)-命令入队-执行事务(exec)
4.2 特点
- 单条命令是原子性,但事务不保证原子性
- 在命令入队后,可以使用discard取消事务
- 在入队的命令中,若命令本身有错,执行事务后所有命令不会生效。若是其中命令出现运行时异常(1/0),则执行事务时,其他命令生效,异常命令抛出异常。
4.3 Redis事务中的监控Watch(乐观锁)
- 悲观锁:做什么都加锁
- 乐观锁:只有更新数据时判断是否有人改过该数据,改过不执行。Redis中watch就是乐观锁。(先监控一个数据,在开启事务,加入命令执行时判断监控数据是否被修改,修改就会导致执行事务失败)
5 持久化
5.1 含义
- redis是内存数据库,如果不将内存中的数据保存到磁盘,一旦出现如断电情况,数据就会丢失
5.2 rdb
- 定义:在指定间隔内将内存中的数据集快照写入磁盘,恢复时将快照文件直接读到内存中
- 触发机制
配置文件中的Sava规则满足时(如save 900 1表示900秒内,有至少1个内容修改就进行持久化操作。)
执行flushall命令
退出redis时 - 优缺点
优点:效率较高,适合大规模数据恢复
缺点:因为是一定间隔时间进行复制,所以数据可能不完整
5.3 aof
- 定义:将所有执行过的写命令记录下来,恢复的时候再全部执行一遍(aof默认不开启)
- 触发机制
配置文件中可以设置- appendfsync always # 每次修改都会 sync。数据完整,但消耗性能
- appendfsync everysec # 每秒执行一次 sync,可能会丢失这1s的数据!
- appendfsync no # 不执行 sync,这个时候操作系统自己同步数据,速度最快!
执行flushall命令
退出redis时
- 优缺点
优点:如果每次命令都同步,数据完整性会很好
缺点:效率比rdb慢
6 发布订阅
- 含义:是一种消息通信模式,可以用于实时聊天系统,订阅关注系统等,对于复杂场景可以使用消息中间件MQ
- 组成:消息发送者,频道,消息订阅者
- Redis-server维护一个字典,字典键就是一个个频道,字典值就是一个链表(保存所有订阅了该频道的客户端)。
- 订阅频道:通过subscribe订阅某个频道(如:SUBSCRIBEkuangshenshuo,若字典无该频道,会新生成一个)
- 发布消息:通过publish命令发布消息(如:PUBLISHkuangshenshuo“hello,kuangshen”),redis-server会根据publish给定的频道作为键,在字典中查找对应订阅该频道的客户,最后将消息发给所有客户。
7 主从复制
7.1 含义
- 将一台redis服务器作为主节点,将其数据复制到其他从节点redis服务器,数据复制只能从主节点到从节点,主节点master写为主,从节点slave读为主
7.2 作用
- 数据的备份
- 数据恢复
- 负载均衡(读写分离)
- 高可用基石(如它是哨兵模式基础)
7.3 相关说明
- 默认每个 redis服务器都是主节点,可以设置它的主节点(配置文件或命令行设置,命令行设置下次启动不生效)
- 只有主机节点可以写,从机节点只能读
- 一个主节点可以多个从节点,一个从节点只能有一个主节点。
- 主机宕机后,从机依然可以使用
- 复制原理:每次从机重新连接主机都会进行一次全量复制,正常情况都是进行增量复制(只复制主机中新增加的数据)
- Redis层层链路:一个主机可以同时作为主机和从机(主属性还是从机,不能写)
- 如果主机宕机了,可以手动使用slaveof no one让自己变成主机(手动太麻烦,后面引入哨兵模式)
8 哨兵模式
8.1 原理
- 主机宕机后,自动从从机中选择主机(哨兵是独立的进程,用于监控每个reids服务器是否正常运行。如果发现主机宕机后,就会选择一个新的主机,然后通过发布订阅模式通知其他的从机让他们切换主机)
8.2 多哨兵模式
- 哨兵也可能宕机,所以一般也有多个哨兵,当一个哨兵认为主机服务器不可用时,成为主观下线。当发现主机不可用的哨兵到达一定值时,就会进行failover故障转移操作,通过投票选择一个新的主机。
8.3 最简单的单哨兵模式配置
- 首先新建哨兵配置文件sentinel.conf,
- 然后加入内容:sentinel monitor myredis 127.0.0.1 6379 1(myredis表示名称可以随便取,127.0.0.1 6379表示监控的主机,1表示1个哨兵发现主机挂了就投票选新的主机)
- 最后启动哨兵模式:redis-sentinel kconfig/sentinel.conf
8.4 优缺点
- 优点:主从复制的优点他都有,自动切换主机更加健壮。
- redis不好在线扩容。多哨兵配置麻烦。
9 缓存穿透
9.1 定义
- 在缓存中查不到,数据库也查不到,大量请求都在持久层数据库时,就造成了缓存穿透。
9.2 解决方案
- 布隆过滤器:一种数据结构,对所有可能查询的参数以hash形象存储,当查询时,在控制层先进行校验,过滤不符合的查询请求。
- 缓存空对象:持久层数据库查不到时,将返回的空对象也缓存起来,并设置一个过期时间,后面查询这个值时,就会在缓存中获取了,减少持久层数据库的压力(数据一致性有影响)
10 缓存击穿
10.1 定义
- 在某个热点key过期的瞬间,大量该值的请求在缓存中查不到,都会涌入数据库。
10.2 解决方案
- 热点词不过期
- 加互斥锁:使用分布式锁,对每个key同时只有一个线程去查询,其他该key的查询等待。
11 缓存雪崩
11.1 定义
- 在某个时间段,缓存集中过期,或者reids宕机。
11.2 解决方案
- redis高可用(多台redis集群)
- 加互斥锁:使用分布式锁,对每个key同时只有一个线程去查询,其他该key的查询等待
- 数据预热:正式部署前,将可能大量访问的数据先访问一边,让它加载到缓存中去。
更多推荐
redis脑图
发布评论