- 博客(99)
- 收藏
- 关注
原创 mysql面试题(开发篇)
垂直分库一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同 的数据库上面,这样也就将数据或者说压力分担到不同的库上面,如下图:系统被切分成了,用户,订单交易,支付几个模块。水平分表把一张表里的内容按照不同的规则 写到不同的库里相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。视图定义:1、视图是一个虚表,是从一个或几个基本表(或视图)导出的表。2、只存放视图的定义,不存放视图对应的数据。
2023-06-06 18:04:09
336
原创 Redis集群
Redis集群什么是Redis集群?集群搭建集群命令节点SLOTS槽Redis Cluster原理在集群中录入值(组的概念)容量不够,redis如何扩容?并发写操作,redis如何分摊?什么是Redis集群?Redis集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/NRedis集群通过分区(partition)来提供一定程度的可用性(availability):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令
2021-04-26 11:31:44
132
原创 Redis的复制(Master/Slave)
Redis的复制是什么?能干嘛?怎么玩?常用的主从方式一主二仆薪火相传反客为主复制原理复制的缺点命令是什么? 就是我们常说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主能干嘛? 读写分离 容灾恢复怎么玩?配从(库)不配主(库)从库配置#配置从库slaveof 主库ip 主库端口#查看主从信息info replication 每次与master断开后,都需要重新连接,除非你配置
2021-04-26 11:27:42
238
原创 Redis的事务
Redis的事务是什么?能干嘛?常用命令这么玩?乐观锁和悲观锁Watch监控3阶段3特性是什么?可以一次执行多个命令,本质是一组命令的集合。一个事物中的所有命令都会被序列化,按顺序的串行执行而不会被其他命令插入,不许加塞。能干嘛?一个队列中,一次性的,顺序的,排他的执行一系列命令。常用命令命令描述multi标记一个事务的开始exec执行所有事务块内的命令discard取消事务,放弃执行事务块内的所有命令watch key [key]监视一个(或多个)
2021-04-26 11:11:33
115
原创 Redis的数据类型
Redis的数据类型公用命令key的命名建议StringhashlistsetzsetRedis五种数据类型:string、hash、list、set、zset公用命令del keydump key:序列化给定key,返回被序列化的值exists key:检查key是否存在expire key second:为key设定过期时间,以秒计算,可以不写second,默认为秒ttl key:返回key剩余时间,-1为永久,-2为失效persist key:移除key的过期时间,key将持久保存
2021-04-26 11:05:47
97
原创 Redis的持久化
Redis的持久化RDB介绍配置文件Fork触发条件如何恢复优势劣势使用场景AOF介绍如何恢复正常恢复异常恢复优势劣势总结RDB介绍 在指定的时间间隔内生成内存中整个数据集的持久化快照。快照文件默认被存储在当前文件夹中,名称为`dump.rdb`,可以通过dir和dbfilename参数来修改默认值。 Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。 整个过程中,主进程是不进行任何的I
2021-04-26 10:55:01
92
原创 Redis解析配置文件
Redis解析配置文件分布式和集群#是否在后台运行;no:不是后台运行daemonize yes #是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问,拒绝外部访问。protected-mode yes #redis的进程文件pidfile /var/run/redis/redis-server.pid #redis监听的端口号。port 6379 #此参数确定了TCP连接中已完成队列(完成三次握手之后)
2021-04-26 10:47:05
75
原创 Redis简介(一)
Redis简介简单介绍redis的安装为什么使用NOSQL单机 MySQL 的美好时代四种NoSQL对比3V+3高简单介绍键值(key-value)存储数据库列存储数据库:键仍然存在,但是指向了多个列,HBase (eg:博客平台(标签和文章),日志)文档型数据库 MongoDb (eg:淘宝商品的评价)图形数据库 Neo4j (eg:好友列表)> 扩展:MongoDB是一个基于分布式文件存储的数据库。有C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。Mong
2021-04-26 10:42:31
121
原创 乐观锁和悲观锁
乐观锁和悲观锁乐观锁概念乐观锁实现方式MybatisPlus使用乐观锁悲观锁乐观锁概念乐观锁:顾名思义,就是十分乐观,它总是认为不会出现问题,无论干什么都不去上锁~,如果出现了问题,再次更新值测试,这里使用了version字段。也就是每次更新的时候同时维护一个version字段乐观锁实现方式取出记录时,获取当前的version更新时,带上这个version执行更新时,set version = newVersion where version = oldVersion如果version不
2021-01-29 16:52:38
83
原创 线程池
Java中有哪些方法获取多线程前言Callable接口ThreadPoolExecutor为什么用线程池线程池的好处架构说明创建线程池底层实现线程池的重要参数拒绝策略线程池底层工作原理线程池运行架构图文字说明以顾客去银行办理业务为例,谈谈线程池的底层工作原理为什么不用默认创建的线程池?手写线程池采用默认拒绝策略采用CallerRunsPolicy拒绝策略采用 DiscardPolicy 拒绝策略采用DiscardOldestPolicy拒绝策略线程池的合理参数前言获取多线程的方法,我们都知道有三种,还有
2021-01-29 16:09:14
659
2
原创 为什么Synchronized无法禁止指令重排,却能保证有序性
为什么Synchronized无法禁止指令重排,却能保证有序性前言标准解答前言首先我们要分析下这道题,这简单的一个问题,其实里面还是包含了很多信息的,要想回答好这个问题,面试者至少要知道一下概念:Java内存模型并发编程有序性问题指令重排synchronized锁可重入锁排它锁as-if-serial语义单线程&多线程标准解答为了进一步提升计算机各方面能力,在硬件层面做了很多优化,如处理器优化和指令重排等,但是这些技术的引入就会导致有序性问题。先解释什么是有序性问题,
2021-01-29 15:46:44
380
原创 Java的锁(四)
Java锁之自旋锁描述优缺点手写自旋锁描述自旋锁:spinlock,是指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU原来提到的比较并交换,底层使用的就是自旋,自旋就是多次尝试,多次访问,不会阻塞的状态就是自旋。优缺点优点:循环比较获取直到成功为止,没有类似于wait的阻塞缺点:当不断自旋的线程越来越多的时候,会因为执行while循环不断的消耗CPU资源手写自旋锁通过CAS操作完成自旋锁,A线程先进来调用myLoc
2021-01-29 15:40:56
115
原创 Java的锁(三)
可重入锁和递归锁概念代码作用可重入锁验证证明Synchronized证明ReentrantLock概念可重入锁就是递归锁指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取到该锁的代码,在同一线程在外层方法获取锁的时候,在进入内层方法会自动获取锁也就是说:线程可以进入任何一个它已经拥有的锁所同步的代码块ReentrantLock / Synchronized 就是一个典型的可重入锁代码可重入锁就是,在一个method1方法中加入一把锁,方法2也加锁了,那么他们拥有的是同一把锁publi
2021-01-29 15:37:14
83
原创 Java的锁(二)
Java锁之公平锁和非公平锁概念如何创建两者区别题外话概念公平锁是指多个线程按照申请锁的顺序来获取锁,类似于排队买饭,先来后到,先来先服务,就是公平的,也就是队列非公平锁是指多个线程获取锁的顺序,并不是按照申请锁的顺序,有可能申请的线程比先申请的线程优先获取锁,在高并发环境下,有可能造成优先级翻转,或者饥饿的线程(也就是某个线程一直得不到锁)如何创建并发包中ReentrantLock的创建可以指定析构函数的boolean类型来得到公平锁或者非公平锁,默认是非公平锁/*** 创建一个可重
2021-01-29 15:31:59
74
原创 Java的锁(一)
独占锁(写锁) / 共享锁(读锁) / 互斥锁概念为什么会有写锁和读锁代码实现解决方法概念独占锁:指该锁一次只能被一个线程所持有。对ReentrantLock和Synchronized而言都是独占锁共享锁:指该锁可以被多个线程锁持有对ReentrantReadWriteLock其读锁是共享,其写锁是独占写的时候只能一个人写,但是读的时候,可以多个人同时读为什么会有写锁和读锁原来我们使用ReentrantLock创建锁的时候,是独占锁,也就是说一次只能一个线程访问,但是有一个读写分离场景,读的时
2021-01-29 15:24:06
205
原创 Stream API
Stream API了解Stream什么是StreamStream操作的三部曲创建流中间操作终止操作Stream流的操作筛选与切片映射排序终止操作规约收集了解StreamJava8中有两个比较大的改变Lambda表达式Stream API (java.util.stream.*)Stream是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找,过滤和映射数据等操作。使用Stream API对集合数据进行操作,就类似于使用SQL执行的数据库查询,也可以使用S
2021-01-29 15:08:41
86
原创 Lambda表达式
Lambda表达式为什么要用Lambda表达式实例代码策略设计模式匿名内部类Lambda表达式学习Lambda函数式接口场景训练Java内置函数接口Comsumer 消费型接口Supplier 供给型接口Function 函数型接口Predicate 断言型接口扩展为什么要用Lambda表达式Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码,将代码像数据一样传递,这样可以写出更简洁、更灵活的代码,作为一个更紧凑的代码风格,使Java语言表达能力得到了提升实例代码La
2021-01-29 10:34:20
119
原创 HashMap浅谈
HashMap浅谈HashMap1.7HashMap1.7存在死链问题HashMap每次扩容为什么是2倍JDK1.8结构变化为什么HashMap使用红黑树而不是AVL树总结ConcurrentHashMap变化为何JDK8要放弃分段锁?弃用的原因新的同步方案ConcurrentHashMap为什么要使用synchronized而不是如ReentranLock这样的可重入锁?锁的粒度Hash冲突扩容为什么是用Synchronized 而不是 ReentrantLock?减少内存开销获得JVM支持HashMa
2021-01-29 10:16:56
170
原创 浅谈ArrayList及扩容机制
浅谈ArrayList及扩容机制ArrayListArrayList相关问题ArrayList优缺点ArrayList和Vector的区别扩容机制add方法ensureCapacityInternal方法ensureExplicitCapacity方法grow方法总结ArrayListArrayList就是动态数组,其实就是Array的复杂版本,它提供了动态的添加元素和删除元素的方法,同时实现了Collection 和 List接口,能够灵活的设置数组的大小。通过源码的分析,我们可以看到ArrayLi
2021-01-28 16:13:21
236
原创 包含min函数的栈
包含min函数的栈题目描述思路代码题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。思路我们需要维护一个最小值的数组,这个数组存储每次push元素时候的最小值 # 压栈 def push(self, node): self.stack.append(node) # 维护当前最小的数组
2021-01-22 10:55:54
66
原创 栈的压入弹出序列
栈的压入弹出序列题目描述思路题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路我们以:1 2 3 4 5 进行压入,下面的:2 4 5 3 1 是弹出序列首先我们需要有一个栈,列表按照pushV的方式压入栈弹出的时候,需要循环判
2021-01-22 10:55:44
85
原创 链表中倒数第K个节点
从尾到头打印链表题目描述思考题目描述输入一个链表,按链表从尾到头的顺序返回一个ArrayList。思考在python中定义链表# 链表结构class ListNode: def __init__(self, x): self.val = x self.next = None# 打印链表def printChain(head): node = head while node: print(node.
2021-01-21 17:16:48
83
原创 反转链表
反转链表描述思考描述输入一个链表,反转链表后,输出新链表的表头。思考这个时候,我们就不能使用上一题的做法了反转后步骤:将现有的头换成尾,尾部的next换成None将从第二个指针node开始,循环将next指向前一个需要一直有一个指针指向还没有反转的链表的头部我们需要有三个指针,一个是左指针,中指针,右指针# 反转链表# 输入一个链表,反转链表后,输出新链表的表头。# 链表结构class ListNode: def __init__(self, x):
2021-01-21 17:16:37
106
原创 合并两个排序的链表
合并两个排序的链表描述思考描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思考先有两个单调递增的链表合并后从上图发现,我们一共需要4个指针,第一个是头指针,第二个和第三个分别是控制两个链表的移动的指针,第四个指针是最小值的指针(前面的指针)。class Solution: # 返回合并后列表 def Merge(self, pHead1, pHead2): if pHead1 == None:
2021-01-21 17:16:23
75
原创 复杂链表的复制
复杂链表的复制描述思考思考2描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思考下图是复杂链表的数据结构# 链表结构class RandomListNode: def __init__(self, x): self.label = x self.next =
2021-01-21 17:16:11
90
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人