决战面试
LemmonTreelss
引刀成一快,不负少年头
展开
-
排序算法——冒泡排序VS插入排序
一、概述 最经典、最常用的排序算法有:冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、按照时间复杂度分为三类。如下图所示 二、如何分析一个排序算法 (1)排序算法的执行效率 1、最好情况、最坏情况、平均情况时间复杂度...原创 2019-03-04 20:27:50 · 4795 阅读 · 0 评论 -
JWT实现鉴权
一、前言 JWT全称JSON Web Token,是一种基于JSON的,用于在网络上声明某种主张的令牌(Token)。JWT通常由三部分组成:头信息(header)、消息体(payload)、签名(signature)。 头信息(Header)指定了该JWT使用的签名算法:header = '{"alg":"HS256","typ":"...原创 2019-03-10 23:36:57 · 8859 阅读 · 0 评论 -
如何设计一个秒杀系统——秒杀系统架构设计都有哪些关键点
一、如何理解秒杀系统 秒杀系统其实主要解决两个问题,一个是并发读,一个是并发写。并发读的核心优化理念是尽量减少用户到服务端来“读”数据,或者让他们读更少的数据;并发写的处理原则也一样,它要求我们在数据库层面独立出来一个库,做特殊的处理。另外,我们还要针对秒杀系统做一些保护,针对意料之外的情况设计兜底方案,以防止最坏的情况发生。 总之,要遵循几个原则,就是要保证用户请...原创 2019-03-11 09:52:34 · 2045 阅读 · 0 评论 -
【MySQL】基础架构
一、MySQL逻辑架构 总体上来说,MySQL可以分为Server层和存储引擎层两部分。 Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务功能,以及所有的内置函数(比如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。 存储引擎层负责数据的存储和提取,其架构...原创 2019-03-17 10:46:04 · 356 阅读 · 1 评论 -
【MySQL】事务隔离——为什么你改了,我还看不见
一、前言 事务就是保证一组数据库操作,要么全部成功,要么全部失败。在MySQL中,事务支持是在引擎层实现的。众所周知,MySQL是一个支持多引擎的系统,但并不是所有的引擎都支持事务。比如MySQL原生的MyISAM引擎就不支持事务,这也是MyISAM被InnoDB取代的重要原因之一。二、隔离性与隔离级别 提到事务,你肯定会想到ACID(Atomicity、Con...原创 2020-08-19 08:44:37 · 162 阅读 · 0 评论 -
访问频率控制——防止恶意用户频繁访问
一、需求 现在有需求如下:限制1秒中,每个用户最多访问10次后台接口二、方案 1、方案一: 采用Redis String数据结构,以用户id为key,访问次数为value。过期时间为1s。 每次访问都使用INCR命令递增该键的键值,如果递增后的值为1(第一次访问),设置过期时间。这样每次访问先获取该键值,当键值超过100时,说...原创 2019-03-06 11:01:39 · 9995 阅读 · 3 评论 -
Zookeeper实现分布式锁
一、分布式锁 首先谈一谈什么是分布式锁。 在多线程并发情况下,如何保证一个代码块在同一时间只能由一个线程访问?可以用锁来实现,比如Java的Synchronized语言,以及ReentrantLock类等。这样可以保证在同一个JVM内,同一时间只有一个线程访问。 如何在分布式集群环境,保证不同节点的线程同步执行?二、节点 然后介...原创 2019-03-10 21:16:43 · 379 阅读 · 0 评论 -
分布式事务
一、什么是事务 首先谈一谈什么是事务?举个栗子,张三要给李四转账100元,张三的数据库账户要扣掉100元,李四的数据库账户要增加100元。这就涉及两个操作,这两个操作要么全部成功,要么全部失败。这就是一个事务。事务共包含四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),简称ACID。 ...原创 2019-02-15 22:42:19 · 174 阅读 · 1 评论 -
数据结构与算法之美——学习笔记
一、前言 近期在准备面试,而数据结构与算法是面试不可回避的重中之重,可以说只有有笔试题,至少有一道算法题。而算法一直是自己软肋,这次不得不正视这个问题。过去对数据结构与算法一直不太重视,总觉得这些太基础,离实际编程太远,然而事实是,要写出高质量的代码,算法必不可少。最近在极客时间入手了《数据结构与算法之美》,希望能久旱逢甘霖~~~二、为什么要学习数据结构与算法 ...原创 2019-02-25 16:33:03 · 1793 阅读 · 3 评论 -
数据结构与算法之美——复杂度分析——学习笔记
一、前言 只要讲到数据结构与算法,就一定离不开时间、空间复杂度分析。可以说,复杂度分析是整个算法学习的精髓,只要掌握了它,只要掌握了复杂度分析,数据结构与算法的内容基本上就掌握了一半。二、为什么需要复杂度分析 俗话说,实践是检验真理的唯一标准,那么把代码跑一遍,通过统计、监控、就能得到算法执行的时间和占用的内存大小。这个方法叫做事后统计法。为什么还要做时间、空间...原创 2019-02-25 19:41:44 · 304 阅读 · 2 评论 -
数据结构与算法之美——跳表
一、概述 二分查找算法:底层依赖的是数组随机访问的特性,所以只能用数组来实现。如果数据存储在链表中,就真的没法用二分查找算法了吗? 实际上,我们只需要对链表稍加改造,就可以支持类似“二分”的查找算法。改造之后的数据结构叫做跳表(Skip list)。它是一种各方面性能都比较优秀的动态数据结构,可以支持快速的插入、删除、查找操作,写起来也不复杂,甚至可以替代红黑树(R...原创 2019-03-19 22:21:10 · 676 阅读 · 2 评论 -
数据结构与算法之美——散列表——理论篇
一、散列思想 散列表的英文叫Hash Table,也叫哈希表或者Hash表。散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。 散列表时间复杂度是O(1)的特性。我们通过散列函数把元素的键值映射为下标,然后将数据存储在数组中对应下标的位置。当我们按照键值查询元素时,我们用同样的散列函...原创 2019-03-05 14:10:49 · 208 阅读 · 0 评论 -
数据结构与算法之美——散列表——实战篇(上)
一、前言 通过理论篇,我们知道,散列表的查询效率跟散列函数、装载因子、散列冲突等都有关系。如果散列函数设计得不好,或者装载因此过高,都可能导致散列冲突发生的概率升高,查询效率下降。 在极端情况下,有些恶意的攻击者,还有可能通过精心构造的数据,使得所有的数据经过散列函数之后,都散列到同一个槽里。如果我们使用的是基于链表的冲突解决方法,那这个时候,散列表就会退化为链表,...原创 2019-03-19 22:20:51 · 350 阅读 · 2 评论 -
redis cluster集群数据分布方案
一、前提 首先我们来回顾一下redis有哪些数据结构。List、Set、Sorted Set、Hash。 (1)List:列表,可以当作一个队列或者栈来使用。 (2)Set:集合,包含不重复的字符串,没有次序 (3)Sorted Set:有序集合,有次序的不重复字符串 (4)Hash:包含键值对的无序散列表,和Java中的Has...原创 2019-02-20 20:41:44 · 1196 阅读 · 0 评论 -
数据结构与算法之美——栈——学习笔记
一、栈 栈就像一摞叠在一起的盘子,我们平时放盘子的时候,都是从下往上一个个放;取的时候,我们是从上往下一个一个依次取。先进后出,这就是典型的栈结构。栈是一种“操作受限”的线性表,只允许在一段插入和删除数据。 事实上,从功能上来说,数组或链表确实可以替代栈,特定的数据结构是对特定场景的抽象。数组或链表暴露了太多的操作接口,操作上的确灵活自由,但使用时就比较不可控,...原创 2019-03-17 20:26:41 · 444 阅读 · 1 评论 -
数据结构与算法之美——数组
二、是什么 1、线性表 线性表,顾名思义,就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。 数组、链表、栈、队列等也是线性表结构。 与之对应的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,数据之间并不是简单的前后关系。 2、连续的内存空间和相同类型的数据三、数据访问 ...原创 2019-02-26 15:38:38 · 268 阅读 · 3 评论 -
数据结构与算法之美——链表
一、前言 相比数组,链表是一种稍微复杂的数据结构。对于初学者而言,掌握链表要比数组稍难一些。这两个非常基础、非常常用的数据结构,常常放到一起来比较。二、数组VS链表 数组与链表是非常基础、常用的数据结构,我们常常会放到一块来比较。 1、底层的存储结构 为了直观对比,我画了一张图,从图中我们看到,数组需要一块连续的内存空间来存储,...原创 2019-03-17 19:35:37 · 333 阅读 · 2 评论 -
数据结构与算法之美——散列表——实战篇(下)
一、前言 在之前的学习中,有两种数据结构,散列表和链表,经常会被放在一起使用。 在链表那一节,提及了用链表来实现LUR缓存淘汰算法,但是链表实现LRU缓存淘汰算法的时间复杂度为O(n),通过散列表可以将时间复杂度降低到O(1)。 在跳表那一节,提到Redis的有序集合是使用跳表来实现的,跳表可以看作一种改进版的链表。Redis有序集合不仅使用了跳表,...原创 2019-03-19 09:06:12 · 437 阅读 · 1 评论 -
数据结构与算法之美——递归——学习笔记
一、前言 先说一下递归的几个常见应用:一是裴波那契数列,二是注册返佣金,找最终推荐人,三是青蛙跳台阶。二、如何理解“递归” 作者从它学习数据结构与算法的经历来看,作者认为有两个最难理解的知识点,一个是动态规划另一个就是递归。 递归是一种应用非常广泛的算法(或者编程技巧)。之后我们要将的很多数据结构和算法的编程实现都要用到递归。比如DFS深度...原创 2019-03-02 21:27:47 · 474 阅读 · 0 评论 -
数据结构与算法之美——二叉树
一、前言 前面我们讲的都是线性表结构,今天我们讲一种非线性表结构,树。树这种数据结构比线性表的数据结构要复杂得多,内容也比较多。二、树 什么是树? 树是n(n≥0)个结点的有限集。n=0时称为空树。在任意一颗非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、......原创 2020-08-12 17:14:28 · 99 阅读 · 0 评论