
笔记
Franco蜡笔小强
小码农
展开
-
【Redis】懒惰删除
一直以来我们认为 Redis 是单线程的,单线程为 Redis 带来了代码的简洁性和丰富多样的数据结构。不过Redis内部实际上并不是只有一个主线程,它还有几个异步线程专门用来处理一些耗时的操作。Redis 为什么要懒惰删除(lazy free)?删除指令del会直接释放对象的内存,大部分情况下,这个指令非常快,没有明显延迟。不过如果删除的 key 是一个非常大的对象,比如一个包含了千...原创 2019-03-29 14:36:27 · 1994 阅读 · 0 评论 -
【Redis】LRU
当 Redis 内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换 (swap)。交换会让 Redis 的性能急剧下降,对于访问量比较频繁的 Redis 来说,这样龟速的存取效率基本上等于不可用。在生产环境中我们是不允许 Redis 出现交换行为的,为了限制最大使用内存,Redis 提供了配置参数maxmemory来限制内存超出期望大小。当实际内存超出maxmemory时...原创 2019-03-28 11:00:36 · 494 阅读 · 0 评论 -
【Redis】过期策略
过期的 key 集合redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定时遍历这个字典来删除到期的 key。除了定时遍历之外,它还会使用惰性策略来删除过期的 key,所谓惰性策略就是在客户端访问这个 key 的时候,redis 对 key 的过期时间进行检查,如果过期了就立即删除。定时删除是集中处理,惰性删除是零散处理。定时扫描策略Redis 默认会每秒进行十...原创 2019-03-27 12:14:06 · 199 阅读 · 0 评论 -
【Mysql】InnoDB和Memory
原创 2019-03-25 11:27:32 · 544 阅读 · 0 评论 -
【SpringMVC】Tomcat
Tomcat的顶层结构BootStrap启动过程Catalina启动过程Server启动过程Service启动过程Tomcat生命周期管理Lifecycle接口LifecycleBase...原创 2019-03-21 18:21:42 · 466 阅读 · 0 评论 -
【SpringMVC】Servlet
init:初始化方法,容器启动时呗容器调用(也可能Servlet第一次用到时才被调用);只会被调用一次getServletConfig:获取servletConfig;service:具体处理一个请求;getServletInfo:获取一些Servlet相关信息destory:Servlet销毁,只会调用一次;GenericServlet是Servlet的默认实现:...原创 2019-03-21 17:30:07 · 228 阅读 · 0 评论 -
【Mysql】临时表
原创 2019-03-21 12:15:08 · 169 阅读 · 0 评论 -
【Mysql】join使用
原创 2019-03-19 10:39:47 · 157 阅读 · 0 评论 -
【Redis】紧凑列表
Redis 5.0 又引入了一个新的数据结构 listpack,它是对 ziplist 结构的改进,在存储空间上会更加节省,而且结构上也比 ziplist 要精简。它的整体形式和 ziplist 还是比较接近的,如果你认真阅读了 ziplist 的内部结构分析,那么 listpack 也是比较容易理解的。struct listpack<T> { int32 total_b...原创 2019-03-18 12:23:52 · 834 阅读 · 0 评论 -
【Redis】跳跃列表
Redis 的 zset 是一个复合结构,一方面它需要一个 hash 结构来存储 value 和 score 的对应关系,另一方面需要提供按照 score 来排序的功能,还需要能够指定 score 的范围来获取 value 列表的功能,这就需要另外一个结构「跳跃列表」。zset 的内部实现是一个 hash 字典加一个跳跃列表 (skiplist)。hash 结构在讲字典结...原创 2019-03-15 11:43:34 · 1066 阅读 · 1 评论 -
【Redis】快速列表
Redis 早期版本存储 list 列表数据结构使用的是压缩列表 ziplist 和普通的双向链表 linkedlist,也就是元素少时用 ziplist,元素多时用 linkedlist。// 链表的节点struct listNode<T> { listNode* prev; listNode* next; T value;}// 链表struc...原创 2019-03-14 11:44:57 · 445 阅读 · 0 评论 -
【Redis】压缩列表
Redis 为了节约内存空间使用,zset 和 hash 容器对象在元素个数较少的时候,采用压缩列表 (ziplist) 进行存储。压缩列表是一块连续的内存空间,元素之间紧挨着存储,没有任何冗余空隙。struct ziplist<T> { int32 zlbytes; // 整个压缩列表占用字节数 int32 zltail_offset; // 最后一个元素距离压...原创 2019-03-13 11:30:00 · 963 阅读 · 0 评论 -
【Redis】事务
Redis 事务的基本使用每个事务的操作都有 begin、commit 和 rollback,begin 指示事务的开始,commit 指示事务的提交,rollback 指示事务的回滚。它大致的形式如下。begin();try { command1(); command2(); .... commit();} catch(Exception e) {...原创 2019-03-13 10:55:49 · 193 阅读 · 0 评论 -
【Redis】字符串内部结构
Redis 的字符串叫着「SDS」,也就是Simple Dynamic String。它的结构是一个带长度信息的字节数组。struct SDS<T> { T capacity; // 数组容量 T len; // 数组长度 byte flags; // 特殊标识位,不理睬它 byte[] content; // 数组内容}content里面存储了真正的字...原创 2019-03-11 11:15:32 · 466 阅读 · 0 评论 -
【Redis】持久化
Redis 的数据全部在内存里,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证 Redis 的数据不会因为故障而丢失,这种机制就是 Redis 的持久化机制。Redis 的持久化机制有两种,第一种是快照,第二种是 AOF 日志。快照是一次全量备份,AOF 日志是连续的增量备份。快照是内存数据的二进制序列化形式,在存储上非常紧凑,而 AOF 日志记录的是内存数据修改的指令记录文本。AO...原创 2019-03-11 10:56:36 · 139 阅读 · 0 评论 -
【Redis】通信协议
RESP(Redis Serialization Protocol)RESP 是 Redis 序列化协议的简写。它是一种直观的文本协议,优势在于实现异常简单,解析性能极好。Redis 协议将传输的结构数据分为 5 种最小单元类型,单元结束时统一加上回车换行符号\r\n。单行字符串 以+符号开头。 多行字符串 以$符号开头,后跟字符串长度。 整数值 以:符号开头,后跟整数...原创 2019-03-08 14:31:11 · 258 阅读 · 0 评论 -
【Redis】线程IO模型
Redis 是个单线程程序!这点必须铭记。也许你会怀疑高并发的 Redis 中间件怎么可能是单线程。很抱歉,它就是单线程,你的怀疑暴露了你基础知识的不足。莫要瞧不起单线程,除了 Redis 之外,Node.js 也是单线程,Nginx 也是单线程,但是它们都是服务器高性能的典范。Redis 单线程为什么还能这么快?因为它所有的数据都在内存中,所有的运算都是内存级别的运算。正因为 Red...原创 2019-03-08 14:24:26 · 209 阅读 · 0 评论 -
【Mysql】怎么保证高可用
几种造成主从延迟的情况:1.主库DML语句并发大,从库qps高2.从库服务器配置差或者一台服务器上几台从库(资源竞争激烈,特别是io)3.主库和从库的参数配置不一样4.大事务(DDL,我觉得DDL也相当于一个大事务)5.从库上在进行备份操作6.表上无主键的情况(主库利用索引更改数据,备库回放只能用全表扫描,这种情况可以调整slave_rows_search_algorithms参数适当...原创 2019-03-06 11:15:02 · 281 阅读 · 0 评论 -
【Mysql】怎么保证主备一致
Mysql主备的基本原理binLog的三种格式statement,row,mixed原创 2019-03-05 11:14:34 · 306 阅读 · 0 评论 -
【Mysql】索引选择
选择普通索引还是唯一索引?对于查询过程来说:a、普通索引,查到满足条件的第一个记录后,继续查找下一个记录,直到第一个不满足条件的记录b、唯一索引,由于索引唯一性,查到第一个满足条件的记录后,停止检索但是,两者的性能差距微乎其微。因为InnoDB根据数据页来读写的。对于更新过程来说:概念:change buffer当需要更新一个数据页,如果数据页在内存中就直接更新,如果不在内存中,在不...原创 2019-03-04 15:55:15 · 897 阅读 · 0 评论 -
【Redis】简单限流
如何使用 Redis 来实现简单限流策略?首先我们来看一个常见 的简单的限流策略。系统要限定用户的某个行为在指定的时间里只能允许发生 N 次,如何使用 Redis 的数据结构来实现这个限流的功能?解决方案这个限流需求中存在一个滑动时间窗口,想想 zset 数据结构的 score 值,是不是可以通过 score 来圈出这个时间窗口来。而且我们只需要保留这个时间窗口,窗口之外的数据都可以砍...原创 2019-03-04 14:50:36 · 410 阅读 · 0 评论 -
【Mysql】 怎么保证数据不丢失
只要redo log 和binlog保证持久化到磁盘,就能确保MySQL异常重启后,数据可以恢复原创 2019-03-04 10:48:47 · 1466 阅读 · 0 评论 -
【Redis】布隆过滤器
想知道某一个值是不是已经在 HyperLogLog 结构里面了,它就无能为力了,它只提供了 pfadd 和 pfcount 方法,没有提供 pfcontains 这种方法。讲个使用场景,比如我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容。问题来了,新闻客户端推荐系统如何实现推送去重的?布隆过滤器是什么?布隆过滤器可以理解为一个不怎...原创 2019-03-01 18:43:38 · 2644 阅读 · 0 评论 -
【Redis】HyperLogLog-记录UV
Redis 提供了 HyperLogLog 数据结构就是用来解决这种统计问题的。HyperLogLog 提供不精确的去重计数方案,虽然不精确但是也不是非常不精确,标准误差是 0.81%,这样的精确度已经可以满足上面的 UV 统计需求了。使用方法HyperLogLog 提供了两个指令 pfadd 和 pfcount,根据字面意义很好理解,一个是增加计数,一个是获取计数。pfadd 用法和 s...原创 2019-03-01 17:41:36 · 701 阅读 · 0 评论 -
【Mysql】 行锁
两阶段锁:在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放, 而是要等到事务结束时才释放。建议:如果你的事务中需要锁多个行,要把最可能造成锁冲突、最可能影响并发度的锁尽量往后放。死锁:当并发系统中不同线程出现循环资源依赖,涉及的线程都在等待别的线程释放资源时,就会导致这几个线程都进入无限等待的状态。解决方案:1、通过参数 innodb_lock_wait_t...原创 2019-03-01 16:56:45 · 155 阅读 · 0 评论 -
【Mysql】 全局锁和表锁
总结:根据加锁范围:MySQL里面的锁可以分为:全局锁、表级锁、行级锁一、全局锁:对整个数据库实例加锁。MySQL提供加全局读锁的方法:Flush tables with read lock(FTWRL)这个命令可以使整个库处于只读状态。使用该命令之后,数据更新语句、数据定义语句和更新类事务的提交语句等操作都会被阻塞。使用场景:全库逻辑备份。风险:1.如果在主库备份,在备份期间不能...原创 2019-03-01 15:30:31 · 972 阅读 · 0 评论 -
【Mysql】 索引
1.索引的作用:提高数据查询效率2.常见索引模型:哈希表、有序数组、搜索树3.哈希表:键 - 值(key - value)。4.哈希思路:把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置5.哈希冲突的处理办法:链表6.哈希表适用场景:只有等值查询的场景7.有序数组:按顺序存储。查询用二分法就可以快速查询,时间复杂度是:O(log(N))8...原创 2019-03-01 15:22:51 · 134 阅读 · 0 评论 -
【Mysql】 update语句更新原理
update语句的执行流程图,浅色框表示在InnoDB内部执行的,深色框表示在执行器中执行的。1.首先客户端通过tcp/ip发送一条sql语句到server层的SQL interface2.SQL interface接到该请求后,先对该条语句进行解析,验证权限是否匹配3.验证通过以后,分析器会对该语句分析,是否语法有错误等4.接下来是优化器器生成相应的执行计划,选择最优的执行计划...原创 2019-03-01 14:44:00 · 12628 阅读 · 1 评论 -
【Mysql】改一行语句,锁这么多
CREATE TABLE `t` ( `id` int(11) NOT NULL, `c` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `c` (`c`)) ENGINE=InnoDB;insert into t values(0,0,0),(5,5,5),(10,...原创 2019-02-28 11:19:36 · 342 阅读 · 0 评论 -
【Redis】延时队列
Redis 的 list(列表) 数据结构常用来作为异步消息队列使用,使用rpush/lpush操作入队列,使用lpop 和 rpop来出队列。队列延迟blpop/brpop。这两个指令的前缀字符b代表的是blocking,也就是阻塞读。阻塞读在队列没有数据的时候,会立即进入休眠状态,一旦数据到来,则立刻醒过来。消息的延迟几乎为零。用blpop/brpop替代前面的lpop/rpop。...原创 2019-02-27 16:50:50 · 658 阅读 · 0 评论 -
【Mysql】幻读
幻读是什么?幻读有什么问题?原创 2019-02-27 12:08:20 · 1345 阅读 · 0 评论 -
【Mysql】 sql语句查询慢问题
查询时间长不返回等MDL锁mysql> show PROCESSLIST;查看waiting for table metadata lockmysql> select * from sys.schema_table_lock_waits;找到造成阻塞的process ID等flushflush tables t with read lock;flush tabl...原创 2019-02-26 11:37:12 · 385 阅读 · 0 评论 -
【Redis】分布式锁
redis 2.8 版本中作者加入了 set 指令的扩展参数,使得 setnx 和 expire 指令可以一起执行,彻底解决了分布式锁的乱象。从此以后所有的第三方分布式锁 library 可以休息了。> set lock:codehole true ex 5 nxOK... do something critical ...> del lock:codehole上面这...原创 2019-02-26 10:35:25 · 249 阅读 · 0 评论 -
【Mysql】 一条sql查询语句怎么执行
客户端连接到服务端,获取到权限等信息, 然后在连接的有效时长内(interactive_timeout和wait_timeout参数控制, 5.7版本会断开可以自动重连)对sql进行处理。首先会判断查询缓存是否开启,如果已经开启,会判断sql是select还是update/insert/delete,对于select,尝试去查询缓存,如果命中缓存直接返回数据给客户端, 如果缓存没有命中,或者...原创 2019-02-25 16:51:29 · 309 阅读 · 0 评论 -
【Mysql】不好的sql习惯
一、条件字段函数操作条件字段函数操作,不会使用索引;对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。二、隐式类型转换在MySQL中,字符串和数字做比较的话,是将字符串转换成数字。反之,则不会有类型转换,也就不会全表扫描。三、隐式字符编码转换...原创 2019-02-25 16:22:07 · 259 阅读 · 0 评论 -
【Mysql】 随机消息
mysql> select word from words order by rand() limit 3; 不要用这种方法,最好使用代码随机法。原创 2019-02-24 15:29:21 · 131 阅读 · 0 评论 -
【Mysql】 “order by”工作原理
CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` varchar(16) NOT NULL, `age` int(11) NOT NULL, `addr` varchar(128) DEFAULT NULL, PRIMARY KEY (`id`), KEY `cit...原创 2019-02-22 11:40:43 · 1005 阅读 · 0 评论 -
【Redis】基础数据结构
Redis 基础数据结构Redis 有 5 种基础数据结构,分别为:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)。string (字符串)Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据。不同类型的数据结构的差异就在于 value 的结构不一样。...原创 2019-02-21 19:32:03 · 248 阅读 · 0 评论 -
【Redis】Redis 可以做什么?
记录帖子的点赞数、评论数和点击数 (hash)。 记录用户的帖子 ID 列表 (排序),便于快速显示用户的帖子列表 (zset)。 记录帖子的标题、摘要、作者和封面信息,用于列表页展示 (hash)。 记录帖子的点赞用户 ID 列表,评论 ID 列表,用于显示和去重计数 (zset)。 缓存近期热帖内容 (帖子内容空间占用比较大),减少数据库压力 (hash)。 记录帖子的相关文章 ID...原创 2019-02-21 18:23:28 · 232 阅读 · 0 评论 -
【Mysql】 日志和索引相关问题
binlog(归档日志)和redo log(重做日志)配合崩溃回复,如果不这样两阶段提交,会导致Mysql出现主备数据不一致等问题。在两阶段提交的不同瞬间,mysql如果发生异常重启,是怎么保证数据完整性的?时刻A:发生crash,此时binlog还没写,redo log也还没提交,所以崩溃回复的时候,这个事务会回滚。这时候binlog还没写,所以也不会传到备库。时刻B:崩溃回复时...原创 2019-02-21 11:14:49 · 270 阅读 · 0 评论