介绍redis的两种持久化方式rdb和aof
rdbRDB方式,是将redis某一时刻的数据持久化到磁盘中,是一种快照式的持久化方法。
有两个Redis命令可以用于生成RDB文件,一个是SAVE,另一个是BGSAVE。
RDB文件的载入工作是在服务器启动时自动执行的,所以Redis并没有专门用于载入RDB文件的命令,只要Redis服务器在启动时检测到RDB文件存在,它就会自动载入RDB文件。
如果服务器开启了AOF持久化功能,那么服务器会优先使用AOF文件来还原数据库状态。只
有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件来还原数据库状态。
服务器在载入RDB文件期间,会一直处于阻塞状态,直到载入工作完成为止。
saveSAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求:
bgsaveBGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求:
在这个命令执行期间,服务器处理SAVE、BGSAVE、BGREWRITEAOF三个命令的方式会和平时有所不同。 ...
详细介绍redis String类型
whatString是redis的基本类型之一
12345678910111213141516171819202122232425262728293031set name shy #设置name为shy的键值对get name #获取键为name的值keys * #查看所有键值对exits key名字 #返回1,表示key存在,0表示不存在move key名字 1 #1表示当前数据库,删除keyexpire key名字 10 #设置key名字的过期时间为10秒ttl key名字 #查看key名字的过期时间还剩多少秒type key名字 #key的类型append key名字 值 #向key的值追加数据strlen key名字 #获取key的长度incr key #给key+1decr key #给key-1incrby key 步长 #key每次加多少decrby key 步长# key每次减多少getrange key 0 3 #截取字符串从0到3getrange key 0 -1 #查看所有内容setr ...
一个有序数组,比如1 1 2 3 4 5 6 ,要拿到前五个不重复的长度
思路代码实现1234567891011121314151617public static int [] get(int [] res){ if (res.length < 1){ return res; } int i = 0, r = i+1; while (r < res.length){ if (res[i]==res[r]){ r++; continue; } i++; res[i]=res[r]; r++; } int[] ints = Arrays.copyOf(res, i + 1); return ints;}
文章摘要
目的AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
概念
切面(Aspect): Aspect 声明类似于 Java 中的类声明,事务管理是AOP一个最典型的应用。在AOP中,切面一般使用 @Aspect 注解来使用,在XML 中,可以使用 <aop:aspect> 来定义一个切面。
连接点(Join Point): 一个在程序执行期间的某一个操作,就像是执行一个方法或者处理一个异常。在Spring AOP中,一个连接点就代表了一个方法的执行。
通知(Advice):在切面中(类)的某个连接点(方法出)采取的动作,会有四种不同的通知方式: **around(环绕通知),before(前置通知),after(后置通知), exception(异常通知),return(返回通知)**。许多AOP框架(包括Spring)将建议把通知作为为拦截器,并在连接点周围维护一系列拦截器。
切入点(Pointcut):表示一组连接点,通知 ...
B树是为了提高磁盘或外部存储设备查找效率而产生的一种多路平衡查找树。
B+树为B树的变形结构,用于大多数数据库或文件系统的存储而设计。
B树其实又被称为B-树
B树相对于红黑树的区别在大规模数据存储的时候,红黑树往往出现由于树的深度过大而造成磁盘IO读写过于频繁,进而导致效率低下的情况。为什么会出现这样的情况,我们知道要获取磁盘上数据,必须先通过磁盘移动臂移动到数据所在的柱面,然后找到指定盘面,接着旋转盘面找到数据所在的磁道,最后对数据进行读写。磁盘IO代价主要花费在查找所需的柱面上,树的深度过大会造成磁盘IO频繁读写。根据磁盘查找存取的次数往往由树的高度所决定,所以,只要我们通过某种较好的树结构减少树的结构尽量减少树的高度,B树可以有多个子女,从几十到上千,可以降低树的高度。
B树和B+树的区别
B树则所有节点都带有带有指向记录(数据)的指针(ROWID),B+树中只有叶子节点会带有指向记录(数据)的指针(ROWID)。因为B+树它把所有的卫星数据(或指向数据的指针)都存储在叶节点中,内部节点只存放关键字和孩子指针,不会带上指向记录的指针(ROWID),这样,一个块中可以容纳 ...
彻底搞懂java的父类与子类的关系
缘由java出现继承的原因其实很简单,就是为了代码复用,减少编写很多无用的代码
单继承众所周知,java是单继承的,为什么那?
主要是因为如果a继承了b和c的方法,但是b和c中有同名的方法,那就无法确定到底是调用的是哪个父类的方法
注意事项
除了object类,一个类只有一个父类,并且在没有明确声明继承与哪个类的时候,默认继承object类
子类无法访问父类的private字段或者private方法
子类不会继承任何父类的构造方法。子类默认的构造方法是编译器自动生成的,不是继承的。
如果父类没有默认的构造方法,子类就必须显式调用super()并给出参数以便让编译器定位到父类的一个合适的构造方法,否则就会报错
正常情况下,只要某个class没有final修饰符,那么任何类都可以从该class继承。
推荐使用向上转型,使用向下转型的时候,可能会报错,推荐使用instanceof 判断之后再进行向下转型
java中静态属性和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏。
初始化顺序
父类静态成员和静态初始化快,按在代码中出现 ...
文章摘要
介绍一致性hash的来源和实现
来源为什么会出现这个东西那?
主要是有了将数据均匀的分散到各个节点中,并且尽量的在加减节点时能使受影响的数据最少的这个需求,传统的hash满足不了,所以出现这个东西
实现范围首先是将所有的哈希值构成了一个环,其范围在 0 ~ 2^32-1,然后各个节点分布在这个环上
容错性
比如在n1服务器宕机的时候,依然根据顺时针方向,k2 和 k3 保持不变,只有 k1 被重新映射到了 N3。这样就很好的保证了容错性,当一个节点宕机时只会影响到少少部分的数据。
拓展性
在 N2 和 N3 之间新增了一个节点 N4 ,这时会发现受印象的数据只有 k3,其余数据也是保持不变,所以这样也很好的保证了拓展性。
虚拟节点出现这个东西的原因是因为,当服务器数量比较少的时候,会出现数据分布不均匀的情况
于是引入了虚拟节点
虚拟节点的意思其实就是一个key进行多次hash,得到的值,都在hash环上,但是这几个都是虚拟的机器,实际上还是存储在实际的机器上
参考文章:
https://crossoverjie.top/2018/01/08/Consistent-H ...
详细介绍Spring的IOC
IOCbeans和context两个包是IOC的基础,BeanFactory接口提供了管理bean的机制,而 ApplicationContext是BeanFactory的一个子接口,它增加了AOP的整合,资源国际化,事件发布,以及应用层的context,比如WebApplicationContext。
简单点的说,BeanFactory提供了配置框架和基本功能,ApplicationContext增加了企业开发需要的特性,Spring的IOC容器一般也就是指ApplicationContext。
Beanbean的标识符必须唯一,一般情况下只有一个标识符,但可以有多个名称
在xml配置中,id, name 都是指的标识符,bean可以定义多个名称,在name属性中指定(逗号,分号或者空格分隔多个别名)
如果一个bean没有定义ID,则将会以它的simple name作为名字(首字母小写,如果多个大写字母开头,则保持原样)
1<alias name="fromName" alias="toName"/ ...
简单介绍
定义红黑树是一种含有红黑结点并能自平衡的二叉查找树。它必须满足下面性质:
性质1:每个节点要么是黑色,要么是红色。
性质2:根节点是黑色。
性质3:每个叶子节点是黑色。
性质4:每个红色结点的两个子结点一定都是黑色。
性质5:任意一结点到每个叶子结点的路径都包含数量相同的黑结点。
自平衡左旋以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,左子结点保持不变
这个图 就非常的形象的表示了左旋的结果,其实我们理解左旋可以分为以下两点
旋转节点的右子节点变为它的父节点,左子节点不变,新的右子节点是原来右子节点的左子节点
旋转节点的右子节点 左子节点为 旋转节点;右子节点不变
套用到上图就是
pivot是旋转节点,y变为pivot的父节点,左节点还是a,右节点变为b
y的左节点是pivot,右节点不变,还是c
右旋以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,右子结点保持不变
同左旋刚好相反,左和右的互换,两个点
旋转节点的左子节点变为它的父节点 ...
string类型的介绍
string不可变性123456789//由于是final,所以string是不可继承的public final class String//final修饰的char[]代表了被存储的数据不可更改性//是final和privateprivate final char value[];//下面这个例子说明,是final和private一起来使得String的数据是不可改变的final int[] array={1,2,3,4};array[2]=100;System.out.println(array[2]);
原因
只有String是不可改变的,字符串池才有可能实现
如果字符串是可变的,会引发线程安全的问题
长度限制由于stirng其实就是一个char数组
char数组的下标是整型,integer
https://segmentfault.com/a/1190000020381075
三种常量池区分全局常量池全局字符串池里的内容是在类加载完成,经过验证,准备阶段之后在堆中生成字符串对象实例,然后将该字符串对象实例的引用值存到stri ...