2021年8月16日

摘要: 缓存雪崩 缓存雪崩指的是缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时间 内承受大量请求而崩掉。 解决办法 事前:尽量保证整个 Redis 集群的高可用性,发现机器宕机尽快补上,选择合适的内存淘汰策略。 事中:本地ehcache缓存 + hystrix限流&降级,避免My 阅读全文
posted @ 2021-08-16 20:40 超人不会灰啊 阅读(123) 评论(0) 推荐(0)
 
摘要: 一、缓存双淘汰法 1. 先淘汰缓存 2. 再写数据库 3. 往消息总线esb发送一个淘汰消息,发送立即返回。写请求的处理时间几乎没有增加,这个方法淘汰 了缓存两次。因此被称为“缓存双淘汰法“,而在消息总线下游,有一个异步淘汰缓存的消费者,在拿 到淘汰消息在1s后淘汰缓存,这样,即使在一秒内有脏数据入 阅读全文
posted @ 2021-08-16 17:05 超人不会灰啊 阅读(481) 评论(0) 推荐(0)
 
摘要: 这样的问题主要是在并发读写访问的时候,缓存和数据相互交叉执行。 一、单库情况下 同一时刻发生了并发读写请求,例如为A(写) B (读)2个请求 1. A请求发送一个写操作到服务端,第一步会淘汰cache,然后因为各种原因卡主了,不在执行后面业务 (例:大量的业务操作、调用其他服务处理消耗了1s)。 阅读全文
posted @ 2021-08-16 16:58 超人不会灰啊 阅读(384) 评论(0) 推荐(0)
 
摘要: 首先说一句,你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数 据一致性的问题,那么你如 何解决一致性问题? 一般来说,就是如果你的系统不是严格要求缓存+数据库必须一致性的话,缓存可以稍微的跟数据库偶 尔有不一致的 情况,最好不要做这个方案,最好将读请求和写请求串行化,串 阅读全文
posted @ 2021-08-16 16:45 超人不会灰啊 阅读(101) 评论(0) 推荐(0)
 
摘要: 所谓 Redis 的并发竞争 Key 的问题也就是多个系统同时对一个 key 进行操作,但是最后执行的顺序和我 们期望的顺序不同,这样也就导致了结果的不同! 推荐一种方案:分布式锁(zookeeper 和 Redis 都可以实现分布式锁)。(如果不存在 Redis 的并发竞争 Key 问 题,不要使 阅读全文
posted @ 2021-08-16 16:37 超人不会灰啊 阅读(229) 评论(0) 推荐(0)
 
摘要: Redis Sentinel(哨兵)着眼于高可用,在master宕机时会自动将slave提升为master,继续提供服务。 Sentinel(哨兵)可以监听集群中的服务器,并在主服务器进入下线状态时,自动从服务器中选举出新的主服务器。 Redis Cluster(集群)着眼于扩展性,在单个Redis 阅读全文
posted @ 2021-08-16 16:32 超人不会灰啊 阅读(101) 评论(0) 推荐(0)
 
摘要: AOF重写可以产生一个新的AOF文件,这个新的AOF文件和原有的AOF文件所保存的数据库状态一样, 但体积更小。 AOF重写是一个有歧义的名字,该功能是通过读取数据库中的键值对来实现的,程序无须对现有AOF文 件进行任伺读 入、分析或者写入操作。 在执行 BGREWRITEAOF 命令时,Redis 阅读全文
posted @ 2021-08-16 16:28 超人不会灰啊 阅读(165) 评论(0) 推荐(0)
 
摘要: Redis是一个支持持久化的内存数据库,通过持久化机制把内存中的数据同步到硬盘文件来保证数据持久化。当Redis重启后通过把硬盘文件重新加载到内存,就能达到恢复数据的目的。 很多时候我们需要持久化数据也就是将内存中的数据写入到硬盘里面,大部分原因是为了之后重用数据 (比如重启机 器、机器故障之后回复 阅读全文
posted @ 2021-08-16 16:25 超人不会灰啊 阅读(61) 评论(0) 推荐(0)
 
摘要: 并不能保证一定删除,Redsi有一个Redis 内存淘汰机制来确保数据一定会被删除。 首先介一下定期删除和惰性删除的工作流程: 1、定期删除,Redis默认每个100ms检查,是否有过期的key,有过期key则删除。需要说明的是,Redis不 是每个100ms将所有的key检查一次,而是随机抽取进行 阅读全文
posted @ 2021-08-16 15:53 超人不会灰啊 阅读(238) 评论(0) 推荐(0)
 
摘要: 1、Redis是一个单线程程序,也就说同一时刻它只能处理一个客户端请求; 2、Redis是通过IO多路复用(select,epoll,kqueue,依据不同的平台,采取不同的实现)来处理多个客 户端请求。 阅读全文
posted @ 2021-08-16 15:53 超人不会灰啊 阅读(355) 评论(0) 推荐(0)
 
摘要: Redis中有个设置时间过期的功能,即对存储在 Redis 数据库中的值可以设置一个过期时间。 作为一个缓存数据库, 这是非常实用的,比如一些 token 或者登录信息,尤其是短信验证码都是有时间 限制的,按照传统的数据库处理方式,一般都是自己判断过期,这样无疑会严重影响项目性能。 我们 set k 阅读全文
posted @ 2021-08-16 15:38 超人不会灰啊 阅读(991) 评论(0) 推荐(0)
 
摘要: 如果你打开看过 Redis 的源码就会发现Redis 内部使用文件事件处理器 file event handler,这个文件事件 处理器是单线程的,所以 Redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,根 据 socket 上的事件来选择对应的事件处理器进行处理 阅读全文
posted @ 2021-08-16 15:33 超人不会灰啊 阅读(77) 评论(0) 推荐(0)
 
摘要: 主要是有三个原因: 1、Redis的全部操作都是纯内存的操作; 2、Redis采用单线程,有效避免了频繁的 上下文切换; 3,采用了非阻塞I/O多路复用机制。 阅读全文
posted @ 2021-08-16 15:18 超人不会灰啊 阅读(49) 评论(0) 推荐(0)
 
摘要: 其实就是名字上的意思,热数据就是访问次数较多的数据,冷数据就是访问很少或者从不访问的数据。 需要注意的是只有热点数据,缓存才有价值对于冷数据而言,大部分数据可能还没有再次访问到就已经被挤出内存,不仅占用内存,而且价值不大。 数据更新前至少读取两次,缓存才有意义。这个是最基本的策略,如果缓存还没有起作 阅读全文
posted @ 2021-08-16 15:15 超人不会灰啊 阅读(1281) 评论(0) 推荐(1)
 
摘要: 这主要是基于一种客观原因来考虑的。因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶 颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理 成章地采用单线程的方案了(毕竟采用多线程会有很多麻烦!) 阅读全文
posted @ 2021-08-16 15:15 超人不会灰啊 阅读(110) 评论(0) 推荐(0)
 
摘要: 1、Memcached所有的值均是简单字符串,Redis作为其替代者,支持更为丰富的数据类型 2、Redis 的速度比 Memcached 快很多 3、Redis可以做到持久化数据 阅读全文
posted @ 2021-08-16 15:13 超人不会灰啊 阅读(58) 评论(0) 推荐(0)
 
摘要: 1、存储方式 Memecache把数据全部存在内存之中,断电后会挂掉,没有持久化功能,数据不能超过内存大小。 Redis有部份存在硬盘上,这样能保证数据的持久性。 2、数据支持类型 Memcache对数据类型支持相对简单,只有String这一种类型 Redis有复杂的数据类型。Redis不仅仅支持简 阅读全文
posted @ 2021-08-16 15:12 超人不会灰啊 阅读(79) 评论(0) 推荐(0)
 
摘要: 1 、 访 问 速 度 快 , 因 为 数 据 存 在 内 存 中 , 类 似 于 Java 中 的 HashMap 或 者 C++ 中 的 哈 希 表 ( 如 unordered_map/unordered_set),这两者的优势就是查找和操作的时间复杂度都是O(1) 2、数据类型丰富,支持Str 阅读全文
posted @ 2021-08-16 15:05 超人不会灰啊 阅读(1154) 评论(0) 推荐(0)
 
摘要: 严格意义上来说缓存分为本地缓存和分布式缓存。 那以 C++ 语言为例,我们可以使用 STL 下自带的容器 map 来实现缓存,但只能实现本地缓存,它最主 要的特点是轻量以及快速,但是其生命周期随着程序的销毁而结束,并且在多实例的情况下,每个实例 都需要各自保存一份缓存,缓存不具有一致性。 使用 Re 阅读全文
posted @ 2021-08-16 14:55 超人不会灰啊 阅读(367) 评论(0) 推荐(0)
 
摘要: 主要是因为 Redis 具备高性能和高并发两种特性。 高性能:假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将 该用户访问的数据存在缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作 缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的 阅读全文
posted @ 2021-08-16 14:54 超人不会灰啊 阅读(394) 评论(0) 推荐(0)
 
摘要: String String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。 常规key-value缓存 应用; 常规计数:微博数,粉丝数等。 Hash Hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储 阅读全文
posted @ 2021-08-16 14:49 超人不会灰啊 阅读(96) 评论(0) 推荐(0)
 
摘要: 简单动态字符串(Simple Dynamic String,SDS) Redis没有直接使用C语言传统的字符串,而是自己构建了一种名为简单动态字符串(Simple dynamic string,SDS)的抽象类型,并将SDS用作Redis的默认字符串表示。 其实SDS等同于C语言中的char * , 阅读全文
posted @ 2021-08-16 14:23 超人不会灰啊 阅读(70) 评论(0) 推荐(0)
 
摘要: Redis是一个数据库,不过与传统数据库不同的是Redis的数据库是存在内存中,所以读写速度非常快, 因此 Redis被广泛应用于缓存方向。 除此之外,Redis也经常用来做分布式锁,Redis提供了多种数据类型来支持不同的业务场景。除此之 外,Redis 支持事务持久化、LUA脚本、LRU驱动事件 阅读全文
posted @ 2021-08-16 14:02 超人不会灰啊 阅读(67) 评论(0) 推荐(0)
 
摘要: 在web服务框架中加入缓存。在服务器与数据库层之间加入缓存层,将高频访问的数据存入缓存中, 减少数据库的读取负担。 增加数据库索引,进而提高查询速度。(不过索引太多会导致速度变慢,并且数据库的写入会导致索 引的更新,也会导致速度变慢) 主从读写分离,让主服务器负责写,从服务器负责读。 将数据库进行拆 阅读全文
posted @ 2021-08-16 14:00 超人不会灰啊 阅读(78) 评论(0) 推荐(0)
 
摘要: 主要是利用Innodb的redo log。重写日志, 正如之前说的,MySQL是先把磁盘上的数据加载到内存中, 在内存中对数据进行修改,再写回到磁盘上。如果此时突然宕机,内存中的数据就会丢失。 怎么解决这 个问题? 简单啊,事务提交前直接把数据写入磁盘就行啊。 这么做有什么问题? 1.只修改一个页面 阅读全文
posted @ 2021-08-16 13:59 超人不会灰啊 阅读(369) 评论(0) 推荐(0)
 
摘要: 主要是利用 Innodb 的undo log。 undo log名为回滚日志,是实现原子性的关键,当事务回滚时能够撤销 所有已经成功执行的 SQL语句,他需要记录你要回滚的相应日志信息。 例如 当你delete一条数据的时候,就需要记录这条数据的信息,回滚的时候,insert这条旧数据 当你upda 阅读全文
posted @ 2021-08-16 13:48 超人不会灰啊 阅读(406) 评论(0) 推荐(0)
 
摘要: 分为两个层面来说。 从数据库层面,数据库通过原子性、隔离性、持久性来保证一致性。也就是说ACID四大特性之中, C(一致性)是目的,A(原子性)、I(隔离性)、D(持久性)是手段,是为了保证一致性,数据库提供的手 段。数据库必须要实现AID三大特性,才有可能实现一致性。例如,原子性无法保证,显然一致 阅读全文
posted @ 2021-08-16 13:47 超人不会灰啊 阅读(1163) 评论(0) 推荐(0)
 
摘要: ACID,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability) 我们以从A账户转账50元到B账户为例进行说明一下ACID这四大特性。 原子性 原子性是指一个事务是一个不可分割的工作单位,其中的操作要么都做,要么都不做。即要么转账 阅读全文
posted @ 2021-08-16 13:46 超人不会灰啊 阅读(169) 评论(0) 推荐(0)
 
摘要: MySQL中存储索引用到的数据结构是B+树,B+树的查询时间跟树的高度有关,是log(n),如果用hash存储,那么查询时间是O(1)。 采用Hash来存储确实要更快,但是采用B+树来存储索引的原因主要有以下两点: 一、从内存角度上说,数据库中的索引一般是在磁盘上,数据量大的情况可能无法一次性装入内 阅读全文
posted @ 2021-08-16 13:38 超人不会灰啊 阅读(200) 评论(0) 推荐(0)
 
摘要: 利用Hash需要把数据全部加载到内存中,如果数据量大,是一件很消耗内存的事,而采用B+树,是 基于按照节点分段加载,由此减少内存消耗。 和业务场景有段,对于唯一查找(查找一个值),Hash确实更快,但数据库中经常查询多条数据,这 时候由于B+数据的有序性,与叶子节点又有链表相连,他的查询效率会比Ha 阅读全文
posted @ 2021-08-16 13:34 超人不会灰啊 阅读(221) 评论(0) 推荐(0)
 
摘要: 我们在MySQL中的数据一般是放在磁盘中的,读取数据的时候肯定会有访问磁盘的操作,磁盘中有两个 机械运动的部分,分别是盘片旋转和磁臂移动。盘片旋转就是我们市面上所提到的多少转每分钟,而磁 盘移动则是在盘片旋转到指定位置以后,移动磁臂后开始进行数据的读写。那么这就存在一个定位到磁 盘中的块的过程,而定 阅读全文
posted @ 2021-08-16 13:31 超人不会灰啊 阅读(173) 评论(0) 推荐(0)
 
摘要: 拆分其实又分垂直拆分和水平拆分 案例: 简单购物系统暂设涉及如下表: 1.产品表(数据量10w,稳定) 2.订单表(数据量200w,且有增长趋势) 3.用户表 (数据量100w,且有增长趋势) 以 MySQL 为例讲述下水平拆分和垂直拆分,MySQL能容忍的数量级在百万静态数据可以到千万 垂直拆分 阅读全文
posted @ 2021-08-16 13:05 超人不会灰啊 阅读(109) 评论(0) 推荐(0)
 
摘要: 范式优化: 比如消除冗余(节省空间。。) 反范式优化:比如适当加冗余等(减少join) 限定数据的范围: 务必禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单 历史的时候,我们可以控制在一个月的范围内。 读/写分离: 经典的数据库拆分方案,主库负责写,从库负责读; 拆分表:分区将数 阅读全文
posted @ 2021-08-16 00:19 超人不会灰啊 阅读(111) 评论(0) 推荐(0)
 
摘要: 内连接:只有两个元素表相匹配的才能在结果集中显示。 外连接: 左外连接: 左边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。 右外连接:右边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。 全外连接:连接的表中不匹配的数据全部会显示出来。 交叉连接: 笛卡尔效应,显示的结果是链 阅读全文
posted @ 2021-08-16 00:16 超人不会灰啊 阅读(207) 评论(0) 推荐(0)
 
摘要: 表锁 不会出现死锁,发生锁冲突几率高,并发低。 MyISAM在执行查询语句(select)前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。 MySQL的表级锁有两种模式:表共享读锁和表独占写锁。 读锁会阻塞写,写锁会阻塞读和写 对MyISAM表的读操作,不会阻塞其它进程对 阅读全文
posted @ 2021-08-16 00:12 超人不会灰啊 阅读(193) 评论(0) 推荐(0)