redis:
内存中的数据结构存储系统,可以用作数据库、缓存、消息中间件。
k-v字典存储系统,跨平台的非关系型数据库。
支持网络、基于内存、分布式、可选持久化。
LRU驱动事件,事务,不同级别的磁盘持久化。
(LRU,Least Recently Used,最近最少使用)算法。缓存中也常使用。。
最近经常被访问的数据,在以后也会经常被访问,经常被访问的数据,需要快速被命中,不常访问的数据,超出容量时要将其淘汰。
缓存穿透:缓存和数据库中都没有的数据,用户不断的发起请求(我们搜索服务应该不存在这种情况)解决方法:对请求接口做校验,不合法的直接拦截。
缓存击穿:缓存没有命中但是数据库中有数据(一般指缓存到期)解决方法:热点数据永不过期(搜索频率很高的设置为不会过期)(并发查一条数据)
缓存雪崩:缓存中数据大量都到了过期时间,查询量大 都查询不到。(很多数据都查不到)
解决方法:热点数据永不过期,过期时间设置随机。
缓存管理策略:
缓存淘汰策略:过期的,最少使用的删除掉。(LRU)
缓存更新策略。保证缓存内容和db数据内容一致。(低峰时期,对缓存内容批量更新)另外,db数据更新,也有一致性策略、保证缓存和db的一致性。(缓存索引非耦合策略,缓存逐步过期,减少不一致的项)
读和写操作都是并发的,没法保证顺序,就会出现缓存和数据库不一致的问题。
redis哨兵(sentinel), 自动分区。
哨兵模式(sentinel):哨兵系统可以监控一个或多个redis master服务,以及从服务,某个master下线后,自动将该master从服务升级为master来代替。
redis发布(publish)-订阅(subscribe), 一种消息通信模式,发送者(pub)发布消息,订阅者(sub)接收消息.
新消息通过PUBLISH命令发送到频道channel中时,这个消息就会被发送给订阅它的所有客户端。
redis stream: 用于消息队列(MQ, Message Queue), 提供消息持久化,主备复制功能,
—————-
MQ(Message Queue),消息队列
分布式项目中,MQ基本都是必备消息中间件。
目的:异步处理,提高系统性能,降低系统耦合。
(异步处理:减小高并发的压力,
消息队列的处理速度快于数据库,消息队列的伸缩性更好,
短时间高并发产生的事务存储在消息队列中,
生产者消费者模式,事件驱动结构。。
系统可用性降低:引入了一个新模块,消息丢失 mq挂掉,
系统复杂性提高:重复消费、消息丢失、消息顺序。。
一致性问题:是异步的。。
常用Kafka优点
核心功能强大,吞吐量高,ms级延迟,高可用可靠性,分布式任意拓展, 存在消息重复消费。。
———-
缓存服务
pika:
360开发的一个类redis存储系统,完全支持redis协议,
pika针对redis的一些问题而进行的优化
(redis内存限制、主从高可用问题、启动恢复时间长、缓冲区容易写满)
pika优势在于多线程, redis单线程性能厉害。
etcd 和 redis都是键值存储库
etcd:核心在于分布式存储,强调各个节点之间通信、同步,确保各个节点上数据和事务的一致性。 服务发现工作更稳定,单节点的读写能力可能并不强。
redis:内存型缓存,节点一致性主要是数据,读写能力很强。qps达10w+
redis:缓存能力很强,mysql缓存、多级缓存,
etcd:主要做一些事务管理,基础架构服务、容器类服务部署。
———————-
mysql:
innodb:是mysql的数据库内部引擎,用了这个才能支持事务。 内存存储引擎, 页是管理数据的最小磁盘单位,b-tree节点就是实际存放表数据的节点, 一个innodb页有7个部分组成:
fil header/fil trailer
page header/page dictionary:页的状态信息
dictionary:存储稀疏索引,
user records:页面里 真正存放行记录的部分,
free space:空余空间。 链表结构(从左到右寻找空白节点插入)
b+树查找, 内存中进行。
索引:mysql索引大大提高检索速度
索引优化,是提高查询性能最重要的手段。(查询时每次只能用1个索引)
索引的作用:大大减小服务需要扫描的数据量,大大加快数据检索速度,随机IO变成顺序IO。
innodb存储引擎:使用b+树建立索引,关系数据库中最常用的
(b+树并不能找到给定键对应的具体值,只能找到数据行对应的页,整个页读入内存,在内存找到具体数据行)
b+树是平衡树,查找任意节点耗费时间都是完全相同的,比较次数就是b+树的高度。
数据库中b+树索引分为聚集索引(clustered index)和辅助索引(secondary index),
聚集索引 存放一条行记录的全部信息。
辅助索引:只包含索引列和一个用于查找对应行记录的书签。
主键 看作是 聚集索引,如果没有创建,系统自动创建一个隐含列为表的聚集索引。
mysql 并发控制:
乐观并发控制(默认不出问题。遇到了问题了就重试,写的时候看是否被其他修改了, 整个过程中就没有枷锁。)乐观锁不会死锁, 但是冲突和重试过多时,增加负担,最好用悲观锁。
响应速度要求很高,并发量很大时,推荐乐观锁。(这时悲观锁会有性能问题。)
悲观并发控制(最常见的方法,就是锁)
共享锁,排他锁,两种实现方式。实现了标准的行级锁。
多版本并发控制
并发控制要考虑:冲突频率、重试成本、响应速度和并发量。
——————
事务相关
一件事情有n个组成单元,一起成功 或者一起失败,n个组成单元放在一起,就是一个事务。。
mysql:一条sql语句就是一个事务。。 默认开启事务并提交事务。。
开启事务,事务提交, 事务回滚。。
事务特性:ACID,
原子性(事务是一个不可分割的单位,全部发生、全部不发生)
、一致性,(事务前后 数据完整性必须保持一致)
隔离性,)多个用户并发访问,一个用户的事务不能被其他用户的事务干扰,互相隔离)
持久性,(事务被提交,对数据的改变是永久性的,即使故障也不能有影响)
事务的四种隔离级别
1.read uncommited,读取尚未提交的数据(哪个问题都解决不了)
2.read commited,读取已经提交的数据(可以解决脏读)
3.重复读取,(解决脏读和不可重复读)mysql默认。
4.串行化,可以解决脏读,不可重复读,虚读,相当于锁表。



