一、运用场景:
缓存
限流
降级
秒杀
排行榜
1.缓存
数据缓存-首页
2.限流的算法
漏桶
超出的部分直接丢弃。
缺点是无法处理突发大的流量,即使服务器还有大量空闲资源
而且会有临界问题。
令牌桶
没有令牌的,会丢弃掉
滑动窗口机制
一个时间窗口划分为多个时间窗口
解决临界问题,1s访问次数不超过100个,使用计数器counter +1 , 但是会有可能1s内瞬间发送200个请求。
3.降级
ngnix + lua + redis
4.秒杀
ngnix + lua + redis乐观锁 帮助公司实现高效的秒杀系统
秒杀的特点:
访问大,导致商城瘫痪
解决办法:
队列
负载均衡
接入层限流
很多的请求不会生成订单
带宽问题
超卖
解决办法:
mysql悲观锁 (对数据库加锁)
mysql乐观锁 (通过版本号控制)
php+队列
php + redis分布式锁 (setnx)
php + redis乐观锁
watch
multi
set
exec
ngnix + lua + redis乐观锁
限流
监视指定的key,看有没变化
二、redis的线程模型
单线程的,通过 IO多路复用 监听多个套接字
三、redis的优缺点
1.丰富的数据类型
string list hash set zset
2.持久化策略
RDB AOF
3.事务机制
支持事务
但对事务的支持比较弱
不支持回滚
4.内存淘汰策略
缺点:
内存限制,局限在较小的数据量
不支持故障转移
扩容
数据不一致
四、redis的list队列先进先出如何解决插队问题
单一列表
lpush rpop
rpush rpop
两个队列
一个普通队列 一个高级队列
五、redis,lpop一条数据后,插入数据库失败怎么办
lpop没有消息的时候,需要适当sleep一会再试
在消费者下线的情况下,生产的消息丢失,需要专业的rabbitmq
六、
缓存击穿
缓存中没有数据,数据库中有数据
解决办法:
热点数据永不过时
缓存雪崩
同一时间,缓存中的数据失效
解决办法:
为不同的数据设置不同时间段的过期时间
缓存穿透
缓存中 和 数据库中的数据都没有
解决办法:
布隆过滤器
将可能存在的数据哈希到一个足够大的bitmap中
七、redis的内存淘汰策略有哪些 内存不足 内存机制
会报错
移除最近最少使用的键
随机移除某个键
最近最少使用的键
更早过期时间的键
八、内存用完会怎样,内存不足
内存淘汰策略
增加内存
九、分布式锁的实现
setnx
可以控制用户的频繁操作
十、redis 和 mongoDB 的区别
数据类型
string list hash set zset
json
持久化机制
RDB AOF
binlog
事务
内存管理机制
LRU算法
热点数据保存到内存
十一、mongoDB分片
多台机器上 存储记录数据的过程
十二、
set get setex setnx setbit getbit exits expire hmset hgetall
mset mget
scan smembers keys
smember keys 遍历处理大的数据时 会阻塞
scan 分次进行 不会阻塞线程
scard
sadd
zadd
1.string
简单的key-value结构
2.list
列表
40亿元素
顺序排序,可以重复
根据下标读取元素
可以用作评论列表 消息列表
3.hash
可以存复杂的数据
hset hget hmset hsetnx hincrby
4.set
集合
无序集合,不重复
5.zset
有顺序集合,不重复,但是有权重,可以按照优先级
可以用作排行榜
主从复制
什么是主从复制
1.单向的
2.都是主节点
3.只有一个主节点 从节点多个
主从复制的作用
1.冗余
2.备份
3.高可用
4.安全
5.故障转移
主从复制原理流程
1.准备阶段
主从建立连接
2.数据同步阶段
ping - 权限验证 - 数据同步
3.命令传播阶段
redis实现主从复制的步骤
1、分别运行redis容器
2、配从库不配主库
slaveof ip port
redis主从复制进阶常见问题解决
1、数据延迟
info_replication_offset
master_replication_offset
repl_replication_offset
connected_slaves
slave_server_stale_data
yes
no
1
2 最低
3 不超过
2、配置不一致
maxmemory 内存相关配置要一致
3、数据丢失
min_slaves_to_write
min_slaves_max_lag
全量复制
全部数据会发送到从节点
全量复制的过程
1、主机会向从机发送runid offset 第一次 就会全量复制
2、从机保存主机的基本信息
3、主机接收到命令后,bgsave异步执行,生成RDB快照文件
4、主机把快照文件发送给到从机
5、发送数据到缓冲区
4、清空老数据
5、加载数据
部分复制
补发丢失的数据
复制积压缓冲区
主要保留着最近写的命令 + 偏移量
全量复制开销,主要有以下几项:
1、bgsave异步执行时间
2、RDB快照迁移时间 网络传输
3、老数据清除时间
4、数据加载的时间
slaveof ip port
从节点指向主节点的ip port
masterauth xxxx
master实例启用了密码保护
repl-backlog-size
缓冲区大小调节
slave_server_stale_data
是否继续应答来自客户端的请求
slave-read-only
从节点 是否只读
repl-ping-slave-period
redis持久化
RDB
数据保存到硬盘
save
阻塞 直到完成
bgsave
创建子进程 由子进程负责持久化
save m n
没办法毫秒级别
数据量大时,fork子进程也会阻塞
AOF
写命令保存到硬盘
bgrewriteof
auto_aof_rewrite_min_size
auto_aof_rewrite_percentage
指令的追加
压缩瘦身
appendonly no
appendfilename
appendfsync everysec
no-appendfsync-on-rewrite on
aof-load-truncate
是否仍然载入
重写机制
压缩文件
lpush list a b c
开启AOF
RDB AOF区别
1、保存的数据不一致
2、数据的恢复效率
3、完整性
4、压缩
5、每秒 追加 时间间隔
为啥需要持久化
主机误重启
异地灾备
linux配置优化
vm.overcommit_memory
swappiness
OOM
ulimit
redis优化
内存
键简短
超时时间
有效期
持久化
压缩
客户端连接的最大连接数
bit级别的存储
一次性添加多条数据 可以使用管道
redis连接池
redis哨兵
监控 看哪个节点挂掉
然后通过其他节点进行选举 选举出新的节点
整个过程 不需要人工介入
哨兵实现原理
1、检测问题
确定主从关系
节点间感知对方
心跳检测
2、找出问题
主客观下线
主观
单个
客观
多台
4、解决问题
选举领导者
故障转移
1.优先级配置
2.偏移量最大的节点
redis哨兵的功能
监控
通知
主节点故障转移
sentinel monitor mymater xxxx xxxx
sentinel down-after
sentinel paraller-syncs mymater 12
新节点发起复制的从节点个数
哨兵常见问题
数据丢失
min-slaves-to-write
min-slaves-max-lag
redis分布式
主从复制
哨兵
分布式集群
可以扩容 每个节点可以存不同数据
数据分布:
顺序分区
数据倾斜
哈希分区
节点伸缩
扩容操作
准备新节点
加入集群
迁移槽和数据
为主节点添加对应的从节点
redis集群
搭建redis集群
1、准备节点
cluster_enbale
cluster_node_timeout
cluster_configfile
2、节点握手
cluster meet
cluster node
3、分配槽
cluster addslots
redis分布式集群原理
key值分配
redis的每个节点会有两个东西
一个是插槽
一个是集群
节点通信
节点彼此不断通信,交换信息
开辟一个tcp通道
ping pong
集群伸缩
slowlog_log_lower_than
zset 跳表 b树 红黑树
有序集合 有权重
跳表只需要维护左右两个节点
b树 会引起子树的调整
红黑树 会引起节点的旋转
范围查询效率高于红黑树 从上到下查找的 上层范围更广
1、空间
2、排序
平衡查找树
红黑树的区别
树和图的区别
1、遍历
2、有根节点
3、分层的数据结构 网络结构
ngnix + lua + redis乐观锁 如何实现qps 20000的负载
限流 降级 缓存
怎么测算出来的
添加请求
qps
线程组
布隆过滤器
不需要存储key的值
布隆过滤器实操的几种方法
1、php+redis实现布隆过滤器
2、redis的插件 bloom-filter
bf.add
bf.exits
bf.madd
bf.reserve xxx xx xx
3、$redis->rawCommand()
对消息的确认
持久化只是保存当前这一时间节点的数据
如果到期了是不会放进去的
而且过期的会有对应淘汰策略
时间到了就会释放连接
不会释放连接 而是由php-fpm管理
redis的hash底层实现
ziplist压缩列表
dic
redis事务理解
一系列串行化命令的集合
会放在队列中
一个个顺序执行
要么全部执行成功 要么全部失败
没有回滚
事务性 高可用性
事务的原子性:
单条命令是原子性执行
但是事务不保证原子性
multi
exec
set
watch
discard
unwatch
zadd
zrem
zpopmax
zpopmin
zincrby score
zincrby score
zcard
zrank
zrangbyscore
zcount
zrange
zunionstore
zinterstore