1.简介
高可用,高性能 吞吐量能达到10W级别的nosql缓存中间件。
为什么单线程还那么快?
因为他底层用的是单线程io多路复用,也就是说 多个io请求 复用 一个线程,主线程 会把多个io放进一个任务队列,由一个任务分发器分发给工作线程进行io,这样批量处理io请求,所以它的性能是很快的
2.数据结构 以及应用场景
String 存储字符串 计数,提供了原子性操作
map 存储对象 session
list 集合 队列 列表(先进先出) 文章列表 好友列表
set 不可重复无序,可以统计点赞列表、关注列表,网站ip访问量
zset 有序不可重复 , 加了个分数 用来排序, 排行榜
zskiplist 跳跃表:多层级链表,写入时随机获取层级,高层级的数据也会写入低层级,查询时会从高层级开始查询,没有查到就降低层级从该节点继续查询,提高查询效率,空间换时间
bitmap 数据结构就是内存中连续的二进制位(bit)并且每个bit位初始值都是0,数据hash后的值转成bit位 存在在bit 用户签到,布隆过滤器: 通过key算bit的占位是否存在,如果bit没有命中那么这个key就没有保存过,如果命中 则说明 这个key 有可能被保存过
布隆过滤器
hyperloglog 不精确统计 统计uv浏览量
1.内部结构是有固定的16384个桶
2.通过对值进行hash 选取低14位 计算出 选的哪个桶
3.再通过15位开始数0的个数,这个个数 大于 桶当前的值 就更新为桶的值 返回1
UV浏览量统计
ziplist
高级用法:
1.pipeline 批量执行命令,减少网络开销
2.lua脚本,串行执行一系列命令,锁,秒杀场景 nginx + lua 直接访问redis(库存获取 和 库存扣减)
3.事务:最后一个功能是事务,但 Redis 提供的不是严格的事务,Redis 只保证串行执行命令,并且能保证全部执行,但是执行命令失败时并不会回滚,而是会继续执行下去。
3.高可用 架构
1.单例
2.主从
3.主从+sentinel哨兵
4.cluster集群 多master节点,集群slave冗余机制:防止master 和 slave 都挂掉,没有slave切换
4.主从复制 + 心跳 + 持久化
matser 10S一次心跳,slave 1S一次心跳
主从复制是异步的:
1.首次由slave发起psync命令给master
2.master收到消息,根据本地offset 发送消息给slave
3.首次请求会触发全量复制(fork进程来拷贝数据,引起性能抖动),后续就是增量复制(由master 主动发起异步复制)
4.复制超时时间默认60S 超时会认为复制失败
持久化:
rdb快照:将内存数据生成快照替换旧的快照文件,触发机制 60 300 900s,10000 10 1 操作,有可能造成数据丢失(不能优先作为数据恢复方案),持久化fork紫禁城来io操作如果数据文件太大会导致客户端服务暂停,恢复数据速度快,数据文件小
优化快照生成影响性能:控制redis实例内存大小10G以内,部署多master
aof文件追加:每次操作就追加一条操作日志,先写缓存中每秒刷入日志文件,顺序写性能好,丢失数据比较少