笔记
Franco蜡笔小强
小码农
展开
-
【Redis】LRU
当 Redis 内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换 (swap)。交换会让 Redis 的性能急剧下降,对于访问量比较频繁的 Redis 来说,这样龟速的存取效率基本上等于不可用。在生产环境中我们是不允许 Redis 出现交换行为的,为了限制最大使用内存,Redis 提供了配置参数maxmemory来限制内存超出期望大小。当实际内存超出maxmemory时...原创 2019-03-28 11:00:36 · 466 阅读 · 0 评论 -
【Redis】快速列表
Redis 早期版本存储 list 列表数据结构使用的是压缩列表 ziplist 和普通的双向链表 linkedlist,也就是元素少时用 ziplist,元素多时用 linkedlist。// 链表的节点struct listNode<T> { listNode* prev; listNode* next; T value;}// 链表struc...原创 2019-03-14 11:44:57 · 398 阅读 · 0 评论 -
【Mysql】索引选择
选择普通索引还是唯一索引?对于查询过程来说:a、普通索引,查到满足条件的第一个记录后,继续查找下一个记录,直到第一个不满足条件的记录b、唯一索引,由于索引唯一性,查到第一个满足条件的记录后,停止检索但是,两者的性能差距微乎其微。因为InnoDB根据数据页来读写的。对于更新过程来说:概念:change buffer当需要更新一个数据页,如果数据页在内存中就直接更新,如果不在内存中,在不...原创 2019-03-04 15:55:15 · 847 阅读 · 0 评论 -
【Redis】简单限流
如何使用 Redis 来实现简单限流策略?首先我们来看一个常见 的简单的限流策略。系统要限定用户的某个行为在指定的时间里只能允许发生 N 次,如何使用 Redis 的数据结构来实现这个限流的功能?解决方案这个限流需求中存在一个滑动时间窗口,想想 zset 数据结构的 score 值,是不是可以通过 score 来圈出这个时间窗口来。而且我们只需要保留这个时间窗口,窗口之外的数据都可以砍...原创 2019-03-04 14:50:36 · 377 阅读 · 0 评论 -
【Mysql】 怎么保证数据不丢失
只要redo log 和binlog保证持久化到磁盘,就能确保MySQL异常重启后,数据可以恢复原创 2019-03-04 10:48:47 · 1403 阅读 · 0 评论 -
【Mysql】幻读
幻读是什么?幻读有什么问题?原创 2019-02-27 12:08:20 · 1305 阅读 · 0 评论 -
【Mysql】怎么保证高可用
几种造成主从延迟的情况:1.主库DML语句并发大,从库qps高2.从库服务器配置差或者一台服务器上几台从库(资源竞争激烈,特别是io)3.主库和从库的参数配置不一样4.大事务(DDL,我觉得DDL也相当于一个大事务)5.从库上在进行备份操作6.表上无主键的情况(主库利用索引更改数据,备库回放只能用全表扫描,这种情况可以调整slave_rows_search_algorithms参数适当...原创 2019-03-06 11:15:02 · 248 阅读 · 0 评论 -
【Redis】通信协议
RESP(Redis Serialization Protocol)RESP 是 Redis 序列化协议的简写。它是一种直观的文本协议,优势在于实现异常简单,解析性能极好。Redis 协议将传输的结构数据分为 5 种最小单元类型,单元结束时统一加上回车换行符号\r\n。单行字符串 以+符号开头。 多行字符串 以$符号开头,后跟字符串长度。 整数值 以:符号开头,后跟整数...原创 2019-03-08 14:31:11 · 212 阅读 · 0 评论 -
【Redis】线程IO模型
Redis 是个单线程程序!这点必须铭记。也许你会怀疑高并发的 Redis 中间件怎么可能是单线程。很抱歉,它就是单线程,你的怀疑暴露了你基础知识的不足。莫要瞧不起单线程,除了 Redis 之外,Node.js 也是单线程,Nginx 也是单线程,但是它们都是服务器高性能的典范。Redis 单线程为什么还能这么快?因为它所有的数据都在内存中,所有的运算都是内存级别的运算。正因为 Red...原创 2019-03-08 14:24:26 · 183 阅读 · 0 评论 -
【Mysql】 日志和索引相关问题
binlog(归档日志)和redo log(重做日志)配合崩溃回复,如果不这样两阶段提交,会导致Mysql出现主备数据不一致等问题。在两阶段提交的不同瞬间,mysql如果发生异常重启,是怎么保证数据完整性的?时刻A:发生crash,此时binlog还没写,redo log也还没提交,所以崩溃回复的时候,这个事务会回滚。这时候binlog还没写,所以也不会传到备库。时刻B:崩溃回复时...原创 2019-02-21 11:14:49 · 223 阅读 · 0 评论 -
【Mysql】 count() 慢问题
不同引擎中,count(*)有不同的实现方式MyISAM:把一个表的总行数存在了磁盘,因此在获取行数时候直接返回,效率高。如果加where条件就不能返回这么快。InnoDB:需要一行行从引擎里面读出来,累计计数,因为事务的支持所以通过MVCC并发控制,读取行数时候据需要一行行的读出来判断。MySQL优化器会找到最小的那棵树来遍历,在保证逻辑正确的前提下,尽量减少扫描的数据量,是数据库系...原创 2019-02-21 10:35:18 · 1677 阅读 · 0 评论 -
【Redis】跳跃列表
Redis 的 zset 是一个复合结构,一方面它需要一个 hash 结构来存储 value 和 score 的对应关系,另一方面需要提供按照 score 来排序的功能,还需要能够指定 score 的范围来获取 value 列表的功能,这就需要另外一个结构「跳跃列表」。zset 的内部实现是一个 hash 字典加一个跳跃列表 (skiplist)。hash 结构在讲字典结...原创 2019-03-15 11:43:34 · 1004 阅读 · 1 评论 -
【Redis】持久化
Redis 的数据全部在内存里,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证 Redis 的数据不会因为故障而丢失,这种机制就是 Redis 的持久化机制。Redis 的持久化机制有两种,第一种是快照,第二种是 AOF 日志。快照是一次全量备份,AOF 日志是连续的增量备份。快照是内存数据的二进制序列化形式,在存储上非常紧凑,而 AOF 日志记录的是内存数据修改的指令记录文本。AO...原创 2019-03-11 10:56:36 · 122 阅读 · 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 · 423 阅读 · 0 评论 -
【Redis】过期策略
过期的 key 集合redis 会将每个设置了过期时间的 key 放入到一个独立的字典中,以后会定时遍历这个字典来删除到期的 key。除了定时遍历之外,它还会使用惰性策略来删除过期的 key,所谓惰性策略就是在客户端访问这个 key 的时候,redis 对 key 的过期时间进行检查,如果过期了就立即删除。定时删除是集中处理,惰性删除是零散处理。定时扫描策略Redis 默认会每秒进行十...原创 2019-03-27 12:14:06 · 169 阅读 · 0 评论 -
【Mysql】join使用
原创 2019-03-19 10:39:47 · 139 阅读 · 0 评论 -
【Redis】懒惰删除
一直以来我们认为 Redis 是单线程的,单线程为 Redis 带来了代码的简洁性和丰富多样的数据结构。不过Redis内部实际上并不是只有一个主线程,它还有几个异步线程专门用来处理一些耗时的操作。Redis 为什么要懒惰删除(lazy free)?删除指令del会直接释放对象的内存,大部分情况下,这个指令非常快,没有明显延迟。不过如果删除的 key 是一个非常大的对象,比如一个包含了千...原创 2019-03-29 14:36:27 · 1920 阅读 · 0 评论 -
【Mysql】InnoDB和Memory
原创 2019-03-25 11:27:32 · 507 阅读 · 0 评论 -
【SpringMVC】Tomcat
Tomcat的顶层结构BootStrap启动过程Catalina启动过程Server启动过程Service启动过程Tomcat生命周期管理Lifecycle接口LifecycleBase...原创 2019-03-21 18:21:42 · 410 阅读 · 0 评论 -
【SpringMVC】Servlet
init:初始化方法,容器启动时呗容器调用(也可能Servlet第一次用到时才被调用);只会被调用一次getServletConfig:获取servletConfig;service:具体处理一个请求;getServletInfo:获取一些Servlet相关信息destory:Servlet销毁,只会调用一次;GenericServlet是Servlet的默认实现:...原创 2019-03-21 17:30:07 · 191 阅读 · 0 评论 -
【Redis】压缩列表
Redis 为了节约内存空间使用,zset 和 hash 容器对象在元素个数较少的时候,采用压缩列表 (ziplist) 进行存储。压缩列表是一块连续的内存空间,元素之间紧挨着存储,没有任何冗余空隙。struct ziplist<T> { int32 zlbytes; // 整个压缩列表占用字节数 int32 zltail_offset; // 最后一个元素距离压...原创 2019-03-13 11:30:00 · 906 阅读 · 0 评论 -
【Redis】紧凑列表
Redis 5.0 又引入了一个新的数据结构 listpack,它是对 ziplist 结构的改进,在存储空间上会更加节省,而且结构上也比 ziplist 要精简。它的整体形式和 ziplist 还是比较接近的,如果你认真阅读了 ziplist 的内部结构分析,那么 listpack 也是比较容易理解的。struct listpack<T> { int32 total_b...原创 2019-03-18 12:23:52 · 783 阅读 · 0 评论 -
【Redis】事务
Redis 事务的基本使用每个事务的操作都有 begin、commit 和 rollback,begin 指示事务的开始,commit 指示事务的提交,rollback 指示事务的回滚。它大致的形式如下。begin();try { command1(); command2(); .... commit();} catch(Exception e) {...原创 2019-03-13 10:55:49 · 159 阅读 · 0 评论 -
【Mysql】临时表
原创 2019-03-21 12:15:08 · 146 阅读 · 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 · 344 阅读 · 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 · 207 阅读 · 0 评论 -
【Redis】布隆过滤器
想知道某一个值是不是已经在 HyperLogLog 结构里面了,它就无能为力了,它只提供了 pfadd 和 pfcount 方法,没有提供 pfcontains 这种方法。讲个使用场景,比如我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容。问题来了,新闻客户端推荐系统如何实现推送去重的?布隆过滤器是什么?布隆过滤器可以理解为一个不怎...原创 2019-03-01 18:43:38 · 2565 阅读 · 0 评论 -
【Redis】Redis 可以做什么?
记录帖子的点赞数、评论数和点击数 (hash)。 记录用户的帖子 ID 列表 (排序),便于快速显示用户的帖子列表 (zset)。 记录帖子的标题、摘要、作者和封面信息,用于列表页展示 (hash)。 记录帖子的点赞用户 ID 列表,评论 ID 列表,用于显示和去重计数 (zset)。 缓存近期热帖内容 (帖子内容空间占用比较大),减少数据库压力 (hash)。 记录帖子的相关文章 ID...原创 2019-02-21 18:23:28 · 205 阅读 · 0 评论 -
【Java核心技术】 JUC包中队列
有时候我们把并发包下面的所有容器都习惯叫作并发容器,但是严格来讲,类似 ConcurrentLinkedQueue 这种“Concurrent*”容器,才是真正代表并发。关于问题中它们的区别:Concurrent 类型基于 lock-free,在常见的多线程访问场景,一般可以提供较高吞吐量。LinkedBlockingQueue 内部则是基于锁,并提供了 BlockingQueue 的...原创 2018-11-24 09:53:29 · 875 阅读 · 0 评论 -
【Mysql】 事务隔离
1、事务的特性:原子性、一致性、隔离性、持久性2、多事务同时执行的时候,可能会出现的问题:脏读、不可重复读、幻读3、事务隔离级别:读未提交、读提交、可重复读、串行化4、不同事务隔离级别的区别:读未提交:一个事务还未提交,它所做的变更就可以被别的事务看到读提交:一个事务提交之后,它所做的变更才可以被别的事务看到可重复读:一个事务执行过程中看到的数据是一致的。未提交的更改对其他事务是不可见...原创 2018-11-21 10:49:41 · 162 阅读 · 0 评论 -
【Java核心技术】 动态代理是基于什么原理
代理模式(通过代理静默地解决一些业务无关的问题,比如远程、安全、事务、日志、资源关闭……让应用开发者可以只关心他的业务) 静态代理:事先写好代理类,可以手工编写,也可以用工具生成。缺点是每个业务类都要对应一个代理类,非常不灵活。 动态代理:运行时自动生成代理对象。缺点是生成代理代理对象和调用代理方法都要额外花费时间。 JDK动态代理:基于Java反射机制实现,必须要...原创 2018-11-02 09:57:27 · 782 阅读 · 0 评论 -
【Java核心技术】String、StringBuffer、StringBuilder有什么区别?
1 String(1) String的创建机理由于String在Java世界中使用过于频繁,Java为了避免在一个系统中产生大量的String对象,引入了字符串常量池。其运行机制是:创建一个字符串时,首先检查池中是否有值相同的字符串对象,如果有则不需要创建直接从池中刚查找到的对象引用;如果没有则新建字符串对象,返回对象引用,并且将新创建的对象放入池中。但是,通过new方法创建的String对象...原创 2018-11-02 09:55:31 · 149 阅读 · 0 评论 -
【算法与数据结构】算法复杂度分析
一、什么是复杂度分析?1.数据结构和算法解决是“如何让计算机更快时间、更省空间的解决问题”。2.因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能。3.分别用时间复杂度和空间复杂度两个概念来描述性能问题,二者统称为复杂度。4.复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。二、为什么要进行复杂度分析?1.和性能测试相比,复杂度分析有不依赖执行环境、成本低、效率高...原创 2018-10-26 18:13:37 · 258 阅读 · 0 评论 -
【网络协议】 ifconfig,IPaddr命令
1. ip addr → 不知道基本没有用Linux2. ifconfig 和 ip addr 的区别吗?3. CIDR4. 共有IP和私有IP5. MAC地址6. 网络设备的状态标识# 知识点:## 核心:1. IP设计时犯的错误?低估了未来网络的发展,32位地址不够用。于是有了现在IPv6(128位)分类错误。分成了5类。C类太少,B类太多。C类254个,网络都不够;D类6...原创 2018-10-26 18:08:04 · 1998 阅读 · 0 评论 -
【算法与数据结构】链表
1.如何分别用链表和数组实现LRU缓冲淘汰策略?1)什么是缓存?缓存是一种提高数据读取性能的技术,在硬件设计、软件开发中都有着非广泛的应用,比如常见的CPU缓存、数据库缓存、浏览器缓存等等。2)为什么使用缓存?即缓存的特点缓存的大小是有限的,当缓存被用满时,哪些数据应该被清理出去,哪些数据应该被保留?就需要用到缓存淘汰策略。3)什么是缓存淘汰策略?指的是当缓存被用满时清理数据的优先顺序...原创 2018-10-31 11:24:41 · 145 阅读 · 0 评论 -
【算法与数据结构】数组
数组看起来简单基础,但是很多人没有理解这个数据结构的精髓。带着为什么数组要从0开始编号,而不是从1开始的问题,进入主题。1. 数组如何实现随机访问1) 数组是一种线性数据结构,用连续的存储空间存储相同类型数据I) 线性表:数组、链表、队列、栈 非线性表:树 图II) 连续的内存空间、相同的数据,所以数组可以随机访问,但对数组进行删除插入,为了保证数组的连续性,就要做大量的数据搬移工作a)...原创 2018-10-29 16:14:31 · 166 阅读 · 0 评论 -
【Java核心技术】强引用、软引用、弱引用、幻象引用有什么区别
在Java语言中,除了基本数据类型外,其他的都是指向各类对象的对象引用;Java中根据其生命周期的长短,将引用分为4类。1 强引用特点:我们平常典型编码Object obj = new Object()中的obj就是强引用。通过关键字new创建的对象所关联的引用就是强引用。 当JVM内存空间不足,JVM宁愿抛出OutOfMemoryError运行时错误(OOM),使程序异常终止,也不会靠随意回...原创 2018-10-31 07:48:39 · 156 阅读 · 0 评论 -
【Redis】基础数据结构
Redis 基础数据结构Redis 有 5 种基础数据结构,分别为:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)。string (字符串)Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据。不同类型的数据结构的差异就在于 value 的结构不一样。...原创 2019-02-21 19:32:03 · 211 阅读 · 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 · 944 阅读 · 0 评论 -
【Redis】延时队列
Redis 的 list(列表) 数据结构常用来作为异步消息队列使用,使用rpush/lpush操作入队列,使用lpop 和 rpop来出队列。队列延迟blpop/brpop。这两个指令的前缀字符b代表的是blocking,也就是阻塞读。阻塞读在队列没有数据的时候,会立即进入休眠状态,一旦数据到来,则立刻醒过来。消息的延迟几乎为零。用blpop/brpop替代前面的lpop/rpop。...原创 2019-02-27 16:50:50 · 605 阅读 · 0 评论