天天看点

redis kafka springboot学习笔记

基础知识

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
  1. 互斥性,高可用,避免死锁,加锁解锁为同一client
  2. setnx + expire 加锁 设置过期时间 expire key timeout set key value NX PX miliseconds
  3. 守护线程续命,value要有唯一性自己释放自己的锁 redisson
redis 性能调优
  1. 使用整型数字,共享对象,jemalloc特性
  2. 缩短键值对的存储长度
  3. 限制内存大小 maxmemory
  4. 淘汰策略 maxmemory-policy noeviction volatile-lru lfu
  5. 使用lazy free 异步删除
  6. 禁用长耗时查询命令 time complexity
  7. slowlog 优化耗时命令 类似mysql 慢查询 slowlog-log-shower-than slowlog-max-len
  8. 防止雪崩 hz 加随机数
  9. 使用混合持久化方式
  10. 使用pipeline,使用redis连接池 jedispool
  11. 使用cluster
  12. –intrinsic-latency 查看延迟时间 禁用THP
  13. 直接上云,起步更香
  14. 布隆解决缓存穿透

MongoDB

  1. Wird Tiger 存储引擎,分布式文件存储数据库,BSON二进制json,副本集理论支持无限扩展。
  2. 场景:文件存储,如通讯录、问卷调查
  3. Table - Collection Row - Document JOIN -
  4. MongoDB - Redis 内存管理机制,MongoDB热点存入内存, 其他磁盘。1.8之后依赖binlog持久化可靠性优于redis。MongoDB不支持事务。集群成熟。
  5. Wiretiger 写操作,Journaling文件。WAL先写日志或cache,后写磁盘。
  6. 集群主从复制,Primary Secondary 介质是Oplog
  7. mongodb.cfg 指定客户端访问ip为对外ip
  8. 副本集Replica集群,主节点写,有仲裁节点类似哨兵sentinel。replSet指定节点,arbiterOnly:true设置为仲裁节点
  9. 副本集和分配混合部署-data server存储数据由多个replica组成 config server提供路由映射 route server负载均衡,设置 sharesvr=true分片,sh.addShard(“rs001/0.0.0.0:27006”)
  10. 一个Collection集合的所有field域是Collection中document所有域的并集。
  11. 特殊数据结构,ObjectID,Regular 正则,Code js代码
  12. 高写入负载,不保证事务,基于位置的数据查询,表结构不明确,适用场景
  13. 虚拟内存,mmap
面试总结
  1. journaling == redolog
  2. 2.8以后已经解决数据稳定性得到解决,mysql单表超过5-10g或者1000w调性能降级,对事务不敏感,ObjectID组成4时间戳3机器id2进程id3计数器,一般自己生产
  3. 数据压缩步骤:删slave,master->slave,删master,slave->master
  4. 强一致性-读写串行化
  5. 1.8方法区变为元空间,Stack Frame支持jvm方法调用执行的数据结构,存储局部变量表,操作数栈,动态连接和方法返回地址。StackOverflowError,OutOfmemoryError。本地方法栈java应用于外界交互,操作系统或某些硬件交换信息。
  6. 方法区存储类型信息,类型常量池,字段信息,方法信息,类变量,指向类加载器的引用,运行时常量区。
  7. 设置堆参数,逻辑上连续。SurvivorRatio Eden:from:to=8:1:1
  8. Escape Analysis UserClassLoader --> application -->Extension --> bootstrap
  9. Java Memory Model
  10. G1回收流程,Initial Marking-Concurrent Marking - Final Marking - 筛选回收
  11. 组合索引区分度 select distinct(phone)/count(id) from t; (0,1]。1最好
  12. ICP,有索引的查询条件下推直接筛选,减少回表次数
  13. 慢查询开启时机:上线初期,查问题时。show processlist 实时监控。
  14. 偶尔变慢:锁阻塞,select for update查询事务锁定。脏页刷新。缓冲池和redolog不够用是会刷新脏页。
  15. mvcc非阻塞读。
  16. load factor --》rehashing

kafka

  1. Use cases :Messaging,Website Activity Tracking 用户活动跟踪/用户画像, Metrics,Log Aggregation 日志聚合,Stream Processing,Event Sourcing
  2. 高吞吐原因:顺序读写-分区存储不需要磁头寻道只用扇区旋转,零拷贝-不需要用户缓存不需要经过CPU的ALU、借助硬件的支持使用sendfile通过DMA方式实现真正的零拷贝、操作系统也会屏蔽这种区别、java中通过FileChannel.transferTo native方法实现,批量发送-设置阈值或者定时,消息压缩-压缩和解压分散打生产者和消费者解决网络传输瓶颈
  3. 软连接 ln -s /…/bin/kafka ./kafka 虚拟机完整克隆ip映射 listeners broker.id log.dirs num.partitons zookeeper.connect kafkaController分发请求
  4. vim /etc/sysconfig/network-script/ifcfg-ens33 poweroff ps aux|grep kafka -daemon 守护进程
  5. learn.kafka quickstart bin/kafka-topics.sh --list --bootstarp-server ip:port --replication-factor 复制因子 --partions
  6. –from-beginning 获取刚开始的消息 ZK命令:ls get 000.index存索引 000.log存消息 成对出现
  7. 日志查看 segment 日志通过工具 kafka-run-class.sh
  8. 内置分区,支持消息副本,高容错,适合大规模消息处理
  9. 架构:broker和consumer都通过ZK管理。
  10. Topic 分类标签,逻辑概念
  11. Partition 分区,物理概念,若干目录 leader follower 主备关系
  12. segment 段,partition继续拆分为大小相同的段 顺序存放 通过跳表查找消息
  13. Broker 集群主机节点,要提前预估 consumer和partition设置成broker的整数倍
  14. Producer
  15. Consumer Group rebalance 同组的consumer不允许消费同一个partition
  16. ISR OSR中的副本也可以追上来变为ISR
  17. offset 记录下次消费开始位置
  18. offset commit 提交给broker
  19. __consumer_offsets 默认topic 通过groupid对50取模存放offset Internal Topic Setting
  20. Broker Controller 选举分区leader,algorithm-polling
  21. Zookeeper 负责broker controller 选举
  22. Group Coordinator 管理current broker all consumer group,缓存consumer提交的offset
  23. 主从都对外提供服务,主备是备用不干活异地多活。
  24. HW HighWatermark机制,保证broker正常运转情况下,主从数据一致性
  25. HW截断机制,记录宕机时的LEO,会引起message lost
  26. acks参数设置消息reliable level
  27. unclean.leader.election.enable false - reliable high available low ; true - reliable low available high
  28. 重复消费问题及解决方案Repeated consumption and solutions 延长消费时间,手动提交。rebalance造成的repeated consumption不能完全解决。

Spring boot 源码

继续阅读