Redis线程模型
6.x版本前是单线程(监听客户端,读写等操作都是一个线程来完成的)
6.x版本后由一些线程来监听客户端,读写等操作还是一个线程来完成的(并发安全考虑)
为什么单线程还这么快(高性能)?
-
基于内存操作(内存本身就很快)
-
底层是hash表结构,指哪打哪,时间复杂度是O(1)
-
IO多路复用和非阻塞 I/O(后面会补充,属于操作系统级别的IO) (还未理解)
-
减少了线程切换
reids的瓶颈是内存和网络带宽
Redis持久化
为什么要持久化?因为一旦机器崩溃可能会导致数据丢失,所以需要
持久化:把内存中的数据转存到硬盘中(根据一定规则写入)
RDB redis database
默认开启 原始文件名dump.rdb
定期将快照存储在rdb的文件中
触发储存机制(save(m:n)) 在m秒内n个键被进行改写 触发快照
shutdown save在关闭客户端时 保存快照
重启时Redis把rdb的文件恢复
AOF append only file
以日志的形式存储所有命令
不可改写 只能添加
需要手动开启配置
appendsync(同步) always/everysec 每次/秒修改都会消耗sync
Redis事物
不是原子性
开始事物命令 multi
执行事物命令 exec
即使事物中的语句有报错,错误语句之上都已经执行过了,并不会回滚 后面的语句好像也会执行
主从复制
主机 从机 集群
只能从主机写入
从从机读入
实现读写分离
即使有机器奔溃也不影响正常使用,当机器恢复会恢复数据
但是也会存在响应的服务,数据冗余 但是保证系统的稳定性
实现负载均衡 高性能(高可用)
哨兵机制
就是一个独立的任务 会定时给集群中的redis发送请求如果收不到响应 就说明该服务有问题,通过选举机制 选出一台来作为主机,当主机恢复后,临时主机就又恢复了从机
key过期策略
-
立即删除 对cpu不友好(到期立马删除)
-
惰性删除 对内存不友好(用的时候才查看是否到期)
-
定时删除 二者折中选择
缓存
-
缓存穿透 redis没有 数据库也没有
-
缓存击穿 redis过期了 数据库有 (热点key设定永不过期 或者同步锁)
-
缓存雪崩 redis的数据大量过期或者redis服务失效 (把热点key分布在不同从机)
-
这些都要从大量数据的条件下 来理解