基础知识
keys patten *
exists key
expire key seconds 设置key生存时间
TTL key 查看key生存时间
PERSIST key 清除生存时间
PESPIRE key milliseconds 设置单位为毫秒
type key info memory 查看 mem_fragmentation_ratio 碎片比例
redis对消息可靠性,重发,重复消费没有处理
队列模式 lpush rpop brpop 阻塞pop方式命令
发布订阅模式 subscribe 订阅 publish 发布 unsubscribe
事务 弱事务-不支持回滚,开发阶段可以预见为了性能忽略回滚, MULTI EXEC DISCARD WATCH UNWATCH
multi 开启 生成命令队列
exec 取出命令执行
discard 清除队列,退出事务
watch 对多个key监控,如果有变化终止事务 可实现乐观锁 unwatch 解除监控
热点数据缓存。本地缓存速度快,扩展难,分布式缓存扩展容易速度慢,结合二者形成分级缓存。
memcache 使用多线程IO,充分利用多核优势,不支持持久化和主从同步
6.0引入多线程,原来使用单线程原因,使用IO多路复用减少线程切换,可维护性高,基于内存分片。多线程原因,只有网络读写和协议解析部分使用了多线程,del也采用多线程异步支持。
KV dictEntry的key–sds – redisObject16byte存value ptr指针–sds
内存分配器,refcount 引用计数
3.2 free+len+buf[] 3.2 之后 len+alloc+flags+buf[] 对不同长度字符串做了优化
Redis内存模型
列表–3.0 ziplist — 3.2 quicklist 双向链表和ziplist object encoding key
zskipnodelist - 跳表
持久化 RDB dump.rdb 触发时机-自定义快照规则,save和bgsave命令,flushall,主从复制操作。save 快照设置。rdb快照过程中不会替换rdb文件,执行fork函数后子进程写入临时文件。性能高,丢数据。
AOF appendonly.aof yes 追加性能低,不丢数据,固态硬盘提升性能
5.0 默认开启 aof-use-rdb-preamble
判断PSYNC请求,增量同步,同步快照-slave载入快照-master同步写缓冲-s载入缓冲-m同步增量
2.8后趋于稳定哨兵机制 Monitoring notification automactic failover 脑裂
cp sentinel.conf 设置monitor
redis集群演进终极版-去中心化,节点失效判断,半数通过,–cluster create replicas 指定从节点个数
bitmap hyperloglog 概率基数 hfadd hfcount geospatial 地图坐标 geoadd geodist
Redis Stream 消费组 xadd key * message value xrange xread阻塞读取 xgroup xreadgroup,基于内存应用场景-水平扩展提高处理能力。
Redis Pipeline 客户端批处理
redis lua 减少网络开销,复用
分布式锁redis
- 互斥性,高可用,避免死锁,加锁解锁为同一client
- setnx + expire 加锁 设置过期时间 expire key timeout set key value NX PX miliseconds
- 守护线程续命,value要有唯一性自己释放自己的锁 redisson
redis 性能调优
- 使用整型数字,共享对象,jemalloc特性
- 缩短键值对的存储长度
- 限制内存大小 maxmemory
- 淘汰策略 maxmemory-policy noeviction volatile-lru lfu
- 使用lazy free 异步删除
- 禁用长耗时查询命令 time complexity
- slowlog 优化耗时命令 类似mysql 慢查询 slowlog-log-shower-than slowlog-max-len
- 防止雪崩 hz 加随机数
- 使用混合持久化方式
- 使用pipeline,使用redis连接池 jedispool
- 使用cluster
- –intrinsic-latency 查看延迟时间 禁用THP
- 直接上云,起步更香
- 布隆解决缓存穿透
MongoDB
- Wird Tiger 存储引擎,分布式文件存储数据库,BSON二进制json,副本集理论支持无限扩展。
- 场景:文件存储,如通讯录、问卷调查
- Table - Collection Row - Document JOIN -
- MongoDB - Redis 内存管理机制,MongoDB热点存入内存, 其他磁盘。1.8之后依赖binlog持久化可靠性优于redis。MongoDB不支持事务。集群成熟。
- Wiretiger 写操作,Journaling文件。WAL先写日志或cache,后写磁盘。
- 集群主从复制,Primary Secondary 介质是Oplog
- mongodb.cfg 指定客户端访问ip为对外ip
- 副本集Replica集群,主节点写,有仲裁节点类似哨兵sentinel。replSet指定节点,arbiterOnly:true设置为仲裁节点
- 副本集和分配混合部署-data server存储数据由多个replica组成 config server提供路由映射 route server负载均衡,设置 sharesvr=true分片,sh.addShard(“rs001/0.0.0.0:27006”)
- 一个Collection集合的所有field域是Collection中document所有域的并集。
- 特殊数据结构,ObjectID,Regular 正则,Code js代码
- 高写入负载,不保证事务,基于位置的数据查询,表结构不明确,适用场景
- 虚拟内存,mmap
面试总结
- journaling == redolog
- 2.8以后已经解决数据稳定性得到解决,mysql单表超过5-10g或者1000w调性能降级,对事务不敏感,ObjectID组成4时间戳3机器id2进程id3计数器,一般自己生产
- 数据压缩步骤:删slave,master->slave,删master,slave->master
- 强一致性-读写串行化
- 1.8方法区变为元空间,Stack Frame支持jvm方法调用执行的数据结构,存储局部变量表,操作数栈,动态连接和方法返回地址。StackOverflowError,OutOfmemoryError。本地方法栈java应用于外界交互,操作系统或某些硬件交换信息。
- 方法区存储类型信息,类型常量池,字段信息,方法信息,类变量,指向类加载器的引用,运行时常量区。
- 设置堆参数,逻辑上连续。SurvivorRatio Eden:from:to=8:1:1
- Escape Analysis UserClassLoader --> application -->Extension --> bootstrap
- Java Memory Model
- G1回收流程,Initial Marking-Concurrent Marking - Final Marking - 筛选回收
- 组合索引区分度 select distinct(phone)/count(id) from t; (0,1]。1最好
- ICP,有索引的查询条件下推直接筛选,减少回表次数
- 慢查询开启时机:上线初期,查问题时。show processlist 实时监控。
- 偶尔变慢:锁阻塞,select for update查询事务锁定。脏页刷新。缓冲池和redolog不够用是会刷新脏页。
- mvcc非阻塞读。
- load factor --》rehashing
kafka
- Use cases :Messaging,Website Activity Tracking 用户活动跟踪/用户画像, Metrics,Log Aggregation 日志聚合,Stream Processing,Event Sourcing
- 高吞吐原因:顺序读写-分区存储不需要磁头寻道只用扇区旋转,零拷贝-不需要用户缓存不需要经过CPU的ALU、借助硬件的支持使用sendfile通过DMA方式实现真正的零拷贝、操作系统也会屏蔽这种区别、java中通过FileChannel.transferTo native方法实现,批量发送-设置阈值或者定时,消息压缩-压缩和解压分散打生产者和消费者解决网络传输瓶颈
- 软连接 ln -s /…/bin/kafka ./kafka 虚拟机完整克隆ip映射 listeners broker.id log.dirs num.partitons zookeeper.connect kafkaController分发请求
- vim /etc/sysconfig/network-script/ifcfg-ens33 poweroff ps aux|grep kafka -daemon 守护进程
- learn.kafka quickstart bin/kafka-topics.sh --list --bootstarp-server ip:port --replication-factor 复制因子 --partions
- –from-beginning 获取刚开始的消息 ZK命令:ls get 000.index存索引 000.log存消息 成对出现
- 日志查看 segment 日志通过工具 kafka-run-class.sh
- 内置分区,支持消息副本,高容错,适合大规模消息处理
- 架构:broker和consumer都通过ZK管理。
- Topic 分类标签,逻辑概念
- Partition 分区,物理概念,若干目录 leader follower 主备关系
- segment 段,partition继续拆分为大小相同的段 顺序存放 通过跳表查找消息
- Broker 集群主机节点,要提前预估 consumer和partition设置成broker的整数倍
- Producer
- Consumer Group rebalance 同组的consumer不允许消费同一个partition
- ISR OSR中的副本也可以追上来变为ISR
- offset 记录下次消费开始位置
- offset commit 提交给broker
- __consumer_offsets 默认topic 通过groupid对50取模存放offset Internal Topic Setting
- Broker Controller 选举分区leader,algorithm-polling
- Zookeeper 负责broker controller 选举
- Group Coordinator 管理current broker all consumer group,缓存consumer提交的offset
- 主从都对外提供服务,主备是备用不干活异地多活。
- HW HighWatermark机制,保证broker正常运转情况下,主从数据一致性
- HW截断机制,记录宕机时的LEO,会引起message lost
- acks参数设置消息reliable level
- unclean.leader.election.enable false - reliable high available low ; true - reliable low available high
- 重复消费问题及解决方案Repeated consumption and solutions 延长消费时间,手动提交。rebalance造成的repeated consumption不能完全解决。