Redis内存淘汰策略
将Redis作为缓存使用,难免会遇到内存空间存储瓶颈,当Redis内存超出物理内存限制时,内存数据就会与磁盘产生频繁交换,使Redis性能急剧下降。此时如何淘汰无用数据释放空间,存储新数据就变得尤为重要了。
配置一般配置文件为redis.conf,通过以下配置修改redis使用的内存,和淘汰策略
12345//设置Redis最大占用内存大小为100Mmaxmemory 100mb// 修改内存淘汰策略maxmemory-policy allkeys-lru
同时也可使用命令进行修改:
12345678//设置Redis最大占用内存大小为100M127.0.0.1:6379> config set maxmemory 100mb//获取设置的Redis能使用的最大内存大小127.0.0.1:6379> config get maxmemory127.0.0.1:6379> config get maxmemory-policy127.0.0.1:6379> config set m ...
Redis三种集群模式
Redis一般支持三种集群方案:主从复制、哨兵(Sentinel)模式、Cluster模式,至少面试被问到的时候能够说上来一两句才不至于尴尬。
主从复制模式主从模式将redis节点分为了主节点和从节点两种类型,主节点支持读写,从节点一般只支持读,也就是说在使用的过程中,主节点可以接收来自客户端的读写命令,从节点只能接收读命令。一台数据库更新后,则会将更改的数据同步到其他数据库上。有两个优点:读写分离、容灾备份。各个节点保存着同一份数据。
基本原理:
从节点上线后,则会向主节点发送一个sync命令;
主节点接收到命令后,则会生成数据库的快照,使用BGSAVE命令生成RDB文件,并缓冲在这期间的写命令;
主节点BGSAVE执行完成后,将文件发送给所有的从节点,并缓冲发送期间的写命令;
从数据库收到后则会丢弃旧数据,重新载入快照;
主数据库继续向从数据库发送缓存的写命令;
从数据库执行缓存的写命令,从数据库初始化完成;
主数据库接受一个写命令,则向从数据库发送一个写命令。
优点:
支持主从复制,主机会自动将数据同步到从机,可以进行读写分离;
为了分载 Master 的读操作压力, ...
Redis持久化原理
Redis数据是放在内存中的,如果断电、故障、内存满都会丢失数据。因此,有的时候需要将数据持久化到磁盘中,故障恢复后,将重要的数据重新加载到内存中。一般提供了两种方式:RDB和AOF,抑或两者的结合。以下对两种方式进行阐述和对比优缺点。
RDB基本概念RDB是Redis Database的简称,是在指定时间间隔对内存中的数据进行的快照存储,默认生成的文件名为:dump.rdb
使用
使用save命令,同步操作,将数据持久化到硬盘上,注意此过程无法接收其他操作;
使用bgsave命令,异步操作,fork个子进程持久化。
服务器自动触发操作,配置文件如下:123456# 900s内至少达到一条写命令save 900 1# 300s内至少达至10条写命令save 300 10# 60s内至少达到10000条写命令save 60 10000
优点
RDB 是一个非常紧凑(compact)的文件,它保存了 Redis 在某个时间点上的数据集,并且恢复的速度也很快,非常适合数据备份;
通过RDB进行数据备,由于使用子进程生成,所以对Redis服务器性能影响较小。缺点
会丢失一部分数据,还 ...
MySQL聚集索引和非聚集索引
MySQL的Innodb存储引擎的索引分为聚集索引和非聚集索引两大类,不同的索引会带来不同的查询效率,根据自己的业务设计正确的索引,才能最大程度提高应用体验。
基本概念聚集索引(Clustered Index)索引的键值决定了表中相应行的物理顺序,类似字典,按照拼音进行排列。聚集索引对于经常需要范围查询的列特别有效,找到一个值后,可以同时查找到物理相邻的数据,减少磁盘IO,增加拆线呢效率。
非聚集索引(Nonclustered indexes)非聚集索引索引项顺序存储,但索引项对应的内容却是随机存储的,叶子节点是索引节点,然后指针指向了实际存储的顺序。
例子建表:
1234567891011create table student (`id` INT UNSIGNED AUTO_INCREMENT,`name` VARCHAR(255),PRIMARY KEY(`id`),KEY(`name`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
该表中主键id是该表的聚集索引、name为非聚集索引;表中的每行数据都是按照聚集索引id排序存储的;比如要查找na ...
MySQL存储引擎介绍
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能。
MySQL服务器使用可插拔的存储引擎架构,使存储引擎可以加载和卸载到运行中的MySQL服务器。常用的存储引擎有MyISAM、InnoDB(8.0之后默认使用)等,不同的引擎提供了不同的特性。
各种存储引擎的特性查看支持的存储引擎环境:Mysql8.0.19进入命令行输入:show engines查看支持的引擎信息:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465mysql> show engines\G*************************** 1. row *************************** Engine: MEMORY S ...
Bean的加载过程
Spring中的一切对象都被IoC容器托管,对象是合适加载,如何加载,什么时候销毁的呢。
Spring中Bean的生命周期
需要注意的地方:
BeanNameAware接口,需要实现setBeanName(String s)方法,Spring将bean的id传过来,一般没啥作用;
BeanFactoryAware接口,实现setBeanFactory(BeanFactory beanFactory)方法,spring传递的容器工厂实例;
ApplicationContextAwaer接口,实现setApplicationContext(ApplicationContext applicationContext)接口,传递过来的是应用上下文;
BeanPostProcess接口,实现postProcessBeforeInitialization和postProcessAfterInitialization,bean初始化之前和之后的处理;
InitializingBean接口,实现afterPropertiesSet,全部属性设置完成后执行;
使用后,如果bean实现了Dispos ...
Spring的Bean注入的几种方式
依赖注入(Dependency Injection, DI)和IoC,作为Spring的核心,Spring中的一切对象都被IoC容器托管,当一个对象需要使用另一个对象中的方法时,可以通过注入的方式,而不是通过手动创建来使用,有几种注入方式。
字段注入最常用,最简单的一种方式。在类属性上添加@Autowired或者@Resource注解,实现对象的注入。
1234567891011121314@Servicepublic class AggregateService { @Autowired @Qualifier(value = "serviceOne") private ServiceOne serviceOne; @Resource(name = "serviceTwo") private ServiceTwo serviceTwo; public void queryOne() { }}
两个注解的区别:
@Autowired是首先根据对象的类型去查找b ...
SpringBoot读取配置文件的方式
Spring Boot有3种读取自定义配置的方法,不用自己单独写解析类。
SpringBoot配置项的加载顺序优先级,从1->4,会互补覆盖。高优先级有的配置会覆盖低优先级的配置。如果同时有properties和yml则properties的文件优先级高于yml
项目根目录config的文件夹下的application.properties
项目根目录下的application.properties
classpath下config文件夹下的application.properties
classpath下的application.properties
当然,在命令行运行的情况下可以指定配置文件 java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties,或者可以在jar包同目录下放置配置文件,或者同目录config下放置配置文件。classpath:/config/则会加载config目录下的所有配置。
通过Va ...
抽象队列同步器AQS
Java中的大部分同步类都是基于AbstractQueuedSynchronizer实现的,简单来说就是抽象类、队列、同步器,可以用来构建锁和同步器的框架。
Java线上故障排查
线上故障主要会包括cpu、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。
CPUCPU异常往往还是比较好定位的。原因包括业务逻辑问题(死循环)、频繁gc以及上下文切换过多。而最常见的往往是业务逻辑(或者框架逻辑)导致的,可以使用jstack来分析对应的堆栈情况。
使用jstack分析cpu问题在线上环境可以使用jps命令查看运行中的Java程序的进程id,然后使用命令top -H -p pid查看该进程占用率高的线程。然后将暂用最高的pid转成16进制的nid(本机线程id)printf '%x\n' pid
使用jstack命令找到堆栈信息,jstack pid |grep nid -C5
这样就能找到问题代码。
频繁gc问题使用命令jstat -gc pid 1000查看gc分代的变化情况,
磁盘内存网络