rsa非对称加密:
利用了单向函数正向求解很简单,反向求解很复杂的特性。
- 随机选取两个质数p1,p2, n = p1*p2
- 随机选一个整数e,与φ(n) = (p1-1)*(p2-1)互为质数
- 加密过程(m^e) mod n = c,m是原信息,c为加密后的信息,n,e为公钥
- 解密过程(c^d) mod n = m,d为解密密钥
- d的求解很复杂,求解结果是d = (k*φ(n) + 1)/e
多线程充分利用多核 CPU
一个cpu只能处理一个线程,多核心技术是将多个一样的CPU放置于一个封装内(或直接将两个CPU做成一个芯片),而英特尔的HT技术是在CPU内部仅复制必要的资源、让CPU模拟成两个线程;也就是一个实体核心,两个逻辑线程,在一单位时间内处理两个线程的工作,模拟实体双核心、双线程运作。
相关参考链接:https://blog.csdn.net/huayushuangfei/article/details/79921638
mysql
-
事务的隔离级别
-
innodb
- 行级锁
- 支持外键(保持数据一致性)
- 默认隔离级别:可重复读RR
3.1 快照读模式(select)
可以解决脏读、不可重复读和幻读问题,快照读模式下通过MVCC来解决
3.2 当前读模式(update、insert写等操作)
当前读情况下解决幻读需要加锁(记录锁+间隙锁 或者 临键锁(Next-Key Locks))
3.3 MVCC(多版本并发控制)
InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现:系统版本号和删除时的版本号
解决快照读模式下,幻读问题;
快照读:执行select操作;其余是当前读,所以,mvvc不能根本上解决幻读的情况
3.4 脏读
事务A读取了事务B修改了但是未提交的数据,但是B事务由于某种原因导致事务回滚,但是A读取的仍然是事务B回滚之前的数据
3.5 不可重复读:
事务A读取了一条数据,这时事务B将该条数据修改,事务A再次读取该条数据时,和最开始读取的数据不一致
3.3 幻读:
事物A读取了一批数据,这时事务B再向表单中insert了一些数据,事务A再次读取时,会发现多了数据,出现幻读
3.4 记录锁
对行加锁:select * from user where userid = 1 for update;
3.5 间隙锁(gap锁)
对区间加锁:select * from user where userid between 1 and 3 for update;
3.6 临键锁 next-key locks
结合记录锁+间隙锁,它的封锁范围,既包含索引记录,又包含索引区间。
- innodb也会锁表
当执行update等操作时,会对操作影响的记录加上行锁和间隙锁。而业务的SQL语句update条件没有索引,所以就导致了全表被锁了
ElasticSearch
基于lucene的搜索引擎,在复杂过滤查询时效率更高。
1.涉及到多条件过滤、模糊查询时,mysql查询很慢;
2.涉及到count条目计算时,InnoDB不保存表的具体行数,需要全表扫描(MyISAM保存了行数)。es只需去查字段对应posting list的大小就行
- 全文检索(可以将关键字进行拆分):
select * from employee where emp_name like '张大三%';
在mysql中模糊查询时,查询时不支持拆分(没法查询'大三'),每次扫描都需要匹配那个文本的所有的字符,确认是否包含搜索的关键字;
-
倒排索引
-
建立term index 字典树结构(存放在内存)
-
联合索引查找时,合并采用跳表,并使用Roaring Bitmap(改进bitset)做缓存进一步加速合并
-
分片
索引可以分片,每个分片存储部分数据。
分片的好处:
- 支持横向扩展;比如数据量为3t,每个分片就存储1个t的数据
- 提高性能;数据分布在多台机器上,所有的操作会在多台机器上并行分布式执行,提高了吞吐量和性能
- es脑裂问题
即集群中不同的节点对于master的选择出现了分歧,出现了多个master竞争,导致主分片和副本的识别也发生了分歧,对一些分歧中的分片标识为了坏片
原因:
- 网络问题:网络延迟大,误以为master节点无响应
- 节点负载:主节点的角色既为master又为data
解决方法:
- 增加节点状态的响应时间
- 控制候选节点数在一般以上
- master节点和data节点做到角色分离,减少节点附在压力
每个分片的数据是有多个备份的;每个分片有一个primary shard,负责写入,数据同步到多个replica shard,负责读;读写分离。
- 集群部署
es集群通过选举,选举一个节点为master节点。
多个候选主节点,数量维持在一半以上。
-
master节点:维护索引元数据、负责切换 primary shard 和 replica shard 身份。
-
如果master节点挂掉了,会在候选主节点内选举出一个新的master节点。
-
primary shard挂了之后,其所属的replica shard会称为新的primary shard,primary shard修复之后,会成为replica shard。
celery分布式队列服务
任务发布者:后端代码编写任务函数
任务调度器:读取配置文件,周期性的将配置中到期的任务发送到任务队列
消息中间件(Broker):redis做消息队列
任务执行单元:worker
- 支持异步任务、定时任务
- 任务执行单元:多进程事件驱动模型;配置进程池,主进程从消息队列取任务,分发给进程中中的子进程,工作进程采用事件驱动模型,使用epoll实现io多路复用,监听内核的读写就绪,并执行相应回调。
网友评论