卡包项目-总结
1. 主要开发框架及工具
JDK1.8 + mysql + SpringBoot + Hbase + Redis + Kafka
mysql :
1. 关系型数据库(由多张能互相连接的二维行列表格组成的数据库)
2. mysql索引的数据结构B+树
B+树是对B树的一种变形树,它与B树的差异在于:
- 有k个子结点的结点必然有k个关键码;
- 非叶结点仅具有索引作用,跟记录有关的信息均存放在叶结点中。
- 树的所有叶结点构成一个有序链表,可以按照关键码排序的次序遍历全部记录。
- 3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常非常高。
- 索引字段要尽量的小
- 索引的最左匹配特性
不同的存储引擎支持的索引类型也不一样 InnoDB 支持事务,支持行级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引; MyISAM 不支持事务,支持表级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
3. 事务隔离级别
- 未提交读(Read Uncommitted): 允许脏读,即可以读到其他会话中未提交事务修改的数据
- 提交度 (Read Committed): 只能读取到已经提交的数据
- 可重复读(Read Repeated): 在同一个事务内的查询和事务开始时刻一致的,InnoDB默认
- 串行读(Serializable):每次读都需要获得表级共享锁,读写都会相互阻塞
- 事务级别越高,性能越差。Read Committed可以满足大多数的场景。
使用mysql往往会遇到数据读写的瓶颈,而HBase这种分布式的存储架构面对数据的增长不需要做任何更改,只需要增加存储空间,且不会对读写性能有任何影响
Redis
1. K-V缓存系统
2. 支持的数据类型
- String
- Hash
- List
- Set
- SortedSet
3. 特点
- 原子性:redis所有单个命令都具有原子性(因为redis是单线程的)
- 过期机制
HBase
1. 列族式存储
2. Table = Rowkey + Family + Column + Timestamp + value
3. 数据存储模式: (Table, Rowkey, Family, Column, Timestamp) -> value
4. 默认一列数据可以保存三个版本
5. 行式索引维护大量的索引,存储成本比较高,不能做到线性扩展,但是随机读效率高,对事务处理得比较好。列式存储根据同一列数据相似性的原理,利于对数据进行压缩,存储成本就会降低。列数据分开存储可以实现并行查询。千万级别的可以选择行式存储
Kafka
消息系统:
点对点消息系统 : 一个消息只能被一个消费者消费
发布订阅消息系统 : 一个topic下有多个queue, 每个queue是点对点的方式,queue之间是发布订阅方式。发布到topic的消息会被所有订阅者消费。
kafka是一个分布式的发布订阅消息系统,能够支撑海量数据的消息传递。kafka将消息持久化到磁盘中,并对消息创建了备份,保证了数据的安全。
特点: 可靠性,可扩展性,高性能
用到的工具类
1. Apache DigestUtils : 线程安全,需引入commons-codec依赖
2. Apache RandomStringUtils : 需引入commons-lang依赖
- RandomStringUtils.random(5) : 产生5位长度的随机字符串
- RandomStringUtils.random(5, new char[]{'a','b','2','4'}) : 使用指定的字符生成5位长度的随机字符串
- RandomStringUtils.randomAlphanumeric(5) : 产生5位长度的字母和数字的随机字符串
- RandomStringUtils.randomNumeric(5) : 产生5位长度的数字随机字符串
- RandomStringUtils.randomAlphabetic(5) : 生成5位随机字符串,包含大小写
- RandomStringUtils.randomAscii(4) : 生成4位从ASCII 32到126的随机字符串
3. Apache DateUtils : 需引入commons-lang依赖
- Date parseDate(String str, String... parsePatterns)
- Date addYears(Date date, int amount)
- Date addDays(Date date, int amount)
- Date addHours(Date date, int amount)
- boolean isSameDay(Date date1, Date date2)
4. Google Guava Enums : 需引入guava依赖
- get Field
- getIfPresent
- stringConverter
5. starter-hbase : 需引入spring-boot-starter-hbase依赖
日志
- 记录日志
- 分析日志(action, userId, timestamp, remoteIp, info)