一.redis为什么那么快
- io多路复用, 数据存在内存
二.redis单线程多线程6.x以后版本
-
多路复用器(不负责数据的读写)为io多线程
- 就是多个客户端与服务端连接时, io多路复用程序(多线程)会监听socket(用户连接)是否进行read, write等操作时, 会把这些指令封装成一个事件, 分发给文件处理分发器(单线程).
-
redis工作线程只有一条
- redis的操作式原子的单指令, pipline一个客户端的集合lua脚本的方式
- 事务的执行是原子性的, 不存在回滚的操作, 尽量少使用事务, 事务内指令尽量少, 尽量快.
三.redis持久化存储
RDB, AOF主从同步也算是持久化;
一.AOF高版本情况下AOF是可以通过执行日志得到全部的内存数据的方式, 但是追求性能;
2.1 体积变大, 重复无效指令, 重写, 后台用线程把内存的kv生成指令写个新的aof
2.2 4.x 新的性能模式: 把重写方式换成rdb放到aof文件的头部, 比2.1快了再追加日志
2.3 先执行完命令再写入日志, 有点是, 会对命令进行检查, 所以不能先写入日志再执行命令
- always 执行完命令, 马上写入日志.
- everysec 执行完命令, 先写入aof内存缓冲区, 每隔1s.
- no 执行完命令, 先写入aof内存缓冲区, 又计算机系统决定何时写入磁盘.
always同步写回,可以基本保证数据不丢失,no策略则性能高但是数据可能会丢失,一般可以考虑折中选择everysec。
二.RDB
redis的默认持久化策略, 把内存数据以快照的形式保存到磁盘上.他记录的是, 数据而不是操作. 优点: 恢复数据时, 由于数据是保存在磁盘中, 就是数据的复制操作, 不需要重新读取数据到内存. 缺点: 由于是全量的复制, 对磁盘的消耗较大, 最少5分钟备份一次, 如果服务器丢失, 会丢失5分钟的数据.
四. redis的集群
1:主从复制 主从其实就是一般包含一个主,一个或多个从,从节点从主节点复制数据,可以实现读写分离,主节点做写,从节点做读。在配置上基本没什么要改的。这里用Linux做演示。 优点:可以实现读写分离,主节点的数据会自动复制到从节点,分担主节点的压力 缺点:当主节点宕机了,会导致部分数据未同步。也不具备容错和回复功能,无论主节点或者从节点宕机都需要等重启之后才能使用
2:哨兵(Sentinel) 其实哨兵模式也是一种主从,只不过增加了哨兵的功能,用于监控主节点的状态,当主节点宕机之后会进行投票重新选出主节点。 哨兵的宕机分为两种:主观宕机(我认为你掉线了)和客观宕机(我们认为你掉线了),当客观宕机了之后就会再选举一个从节点作为主节点,而这又可以分为两步
3:Cluster 集群采用了多主多从,按照一定的规则进行分片,将数据分别存储,一定程度上解决了哨兵模式下单机存储有限的问题。 集群模式一般是3主3从,且需要ruby辅助搭建。 1:复制5个redis出来,作为3主3从,端口可以自定义
5. 在python中写分布式锁
一. 加锁
1. 创建uuid就是value
2. setnx(key,value)如果key存在则返回0, 设置成功返回1
3. 进入if
4. expire(key, time)给key设置超时时间
5. elif再判断ttl释放成功设置了锁, 以防万一造成死锁
6. 如果没设置锁再使用expire设置超时时间
二. 释放锁
1. 接收uuid就是value
2. pipline开启管道
3. watch监控key是否发生改变, 有其他客户端改了键值对就释放失败, 进行循环
4. 获取key是查看value是否==uuid
5. 是则使用multi队列
6. delete删除key
7. excute提交
8. 关闭监控unwatch