JAVA编程思想学习手账初整理

news/2024/3/29 8:28:51/文章来源:https://blog.csdn.net/chenjf0221/article/details/128111062

redis:

缓存击穿:对于访问过期的key查询数据时,加锁,保证只有一个线程去底层获取数据,并返回结果缓存
缓存穿透:对于访问不存在的key时给出空结果并缓存,或引入布隆过滤器将数据提前缓存在布隆过滤器中
缓存雪崩:对于key采用随机过期时间,避免大量的key在同一时间失效导致数据库承载过高

持久化机制:

AOF:以追加 命令行记录的方式记录完整的日志  优点:能够完整恢复数据  缺点:恢复备份效率低

RDB:以二进制的方式定时本分数据  优点:恢复备份效率高 缺点:存在备份时间临界区有丢失数据的可能

AOF + RDB:定时备份数据以二进制的方式写入文件,增量以命令行的记录方式追加到文件当中

数据类型:

string : 字符串(操作命令:set get append setrange getrange strlen)

             数值(操作命令:incr)   理解待加深

             bitmap 

list:       理解待加深

hash:   理解待加深

set:      理解待加深

sorted_set   理解待加深
 

并发编程:

synchronized (悲观锁,非公平锁 ) 与 lock(reetrantLock,readwriteLock)(非公平锁、乐观锁)

synchronized:1.6之前为重型锁:线程获取不到锁会直接进入(锁池)队列等待直到上一个线程释放锁之后才可以争取锁

                        1.6之后引入了锁升级概念:JAVA对象头部(MarkWord)包含锁的信息,锁升级状态由无锁到第一次加锁升级为偏向锁,第二次加锁发生锁竞争则升级为轻量级锁,轻量级锁通过CAS自旋尝试获取锁,如仍然获取不到锁则升级为重量级锁进入锁池等待即1.6之前的方式

reetrantLock:底层采用CAS+AQS方式实现的锁机制,当一个线程想要获取锁先通过CAS自旋方式尝试获取锁;如获取不到则将当前线程封装为Node对象并存入AQS双向队列中,

                          1:AQS双向队列中已有线程在等待则将当前线程挂接在已有线程后面并将指针互相连接上,且挂接成功后会将上一个Node节点的状态(waitStatus)更新为-1表示上一个Node节点后面挂接的Node节点可被唤醒,处于AQS队列的头部Node节点会通过CAS方式尝试获取锁资源

                          2:AQS双向队列中没有线程在等待,则会创建一个虚拟的头部节点(head)并将当前Node节点挂接在虚拟节点之后,且将虚拟头部节点(head)的状态(waitStatus)设置为-1,以便更高效率的唤醒后面的线程节点

readwriteLock:读读不互斥,读写互斥,写写互斥;与reetranLock的区别在于更在细化的对锁的颗粒度做了区别,以适用读、写的不同场景下的效率提升

concurrentHashMap:多线程并发的线程安全集合类;采用数组+单向链接+红黑树的数据结构 ,当数组长度大于64(实则为了优化效率,数组的查询时间复杂度为O(1))且单向链表长度大于8(优化效率,单向链接的查询时间复杂度为O(n))时单向链接将转化成红黑树结构(时间复杂度Ologn)

CAS:比较并交换;程序运行时会先从内存中获取数据到CPU进行计算,再将计算完的结果写入到内存

                             1:如果多个线程同一时间从内存中获取同一份的数据进行计算则会引发数据不一致性的问题(其他线程不能及时拿到某一线程计算完写入的内存中的数据)

                              2:因此CAS的方式就是数据在CPU计算完之后写入到内存时,会比较此时内存中的值与当前CPU中获取的值是否一致,如一致则认为没有其它的线程修改过值正常写入,反之就认为值被其它线程篡改过则写入失败,再次通过CAS自旋方式直到写入成功为止

 Executors创建线程池的几种方式:

  newFixedThreadPool:固定线程数的线程池,当添加的线程数超过定义的线程数时则进入阻塞队列(LinkedBlockingQueue),遵循FIFO(先进先出)原则等待线程池中有空闲的线程数时再 进行工作

  newScheduledThreadPool:固定线程数的定时任务线程池,底层采用延迟队列(DelayedWorkQueue),可按固定的周期或者延迟多久的时间执行任务

newCachedThreadPool:创建存活时间为60秒的线程池,当前第一次有任务进来会直接创建新线程,如60秒内再次有任务进入会复用已创建的存活线程执行任务,如60秒内无任务进入则会结束当前线程池。如60秒外有任务进入则会创建新的线程执行;因为任务只要提交线程池中,就必然会有线程处理

newSingleThreadExecutor:单例线程池,线程池中只有一个线程在工作,后续进来的任务会进入到阻塞对列中等待,遵循FIFO(先进先出)原则,因此单例线程池适合按顺序执行的一系列任务

 newWorkStealingPool:并行计算底层使用ForkJoinPool;核心思想分而治之,线程窃取;使用场景,将一个大的任务按照一定的规则拆分(需手动编写拆分逻辑) 并放到当前线程的阻塞队列当中,其它的空闲线程可以去处理有任务的线程的阻塞列队中的任务 ,优点:线程池中空闲线程可以被充分利用                     

线程数计算:

核心线程数=cpu核数 * cpu利用率 * (1 + w/c)=cpu核数 * (1-阻塞系数)

分布式

CAP:Consistency(一致性)   Availability(可用性)    Partition Tolerance(分区容错性)

微服务规定原则:CP /  AP   三选二挑一 

C:保证微服务之间的数据强一致性,如zookeeper 发送消息必须等待其它节点都有反馈结果才可成功

A:保证微服务之间的可用,如某个节点掉线(需返回错误响应结果)但其他节点可正常使用则不影响整体的服务调用流程

P:保证由于网络故障原因(网络不可靠运行)引起的服务波动不影响整体的系统运行,分布式系统的基石

nacos:阿里开源的微服务注册中心

服务注册:微服务调用注册中心客服端服务发送微服务实例信息完成注册

服务心跳:客户端会以默认5秒的频率向服务端发送心跳,告知注册中心当前服务的健康状态

服务健康检查:服务端启用定时任务默认每15秒检查一次注册服务列表的健康状态如超过25秒未响应则将服务置不健康状态并下线

服务发现:注册中心的服务能被其它服务检测到且可调用

服务同步:CP

Mysql

b+tree:矮胖形的树状结构;

              1:非子叶节点存储子叶节点的分区指针信息不存储数据

              2:子叶节点存储主键信息(如有主键存储主键列信息,否则存储唯一索引列信息,两者都未生成则会存储生成隐式的rowid)

  联合索引:多列组合创建的索引;

               1:最左前缀原则:where 条件中必须包第一列的字段才会生效且需正确命中索引   

               2:原理:多列联合索引先按第一列构建b+tree结构,第二列基于第一列再构建b+tree索引以此类推,因此第一列未命中索引,第二例自然不会命中索引

               3:回表查询:对于普通索引(二级索引,非聚簇索引),构建b+tree不会存储该列数据,而是存储主键对应的指针引用,所以普通索引查询时先从主键索引中找到对应的主键再根据主键查询返回完整数据    待加深理解

                

                    

JVM

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_39244.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统封装制作

工具网址: 镜像下载: Windows 10 22H2 - MSDN - 山己几子木 (sjjzm.com)pe工具:【新提醒】优启通 v3.7.2022.0910(2022.10.14 发布)_IT天空原创软件_IT天空 (itsk.com)万能驱动:万能驱动 v7.22.0912.2&…

IOC 的底层原理和Bean管理XML方式、xml注入集合属性

目录 什么是IOC IOC底层管理 工厂模式 IOC 的过程 IOC 接口 IOC 操作Bean 原理 Bean 管理操作有两种方式 1. 基于xml 配置方式创建对象 2. 基于xml方式注入属性 第二种使用有参数构造注入 p 名称空间注入 ICO操作Bean管理(xml 注入其他类型属性&#xff…

翻转单词序列、按之字形顺序打印二叉树、二叉搜索树的第k个节点

1、翻转单词序列 本题考点:子串划分,子串逆置 牛客链接 题目描述: 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻…

网络安全与IP安全

网络安全 是指网络系统的硬件,软件以及系统中的数据收到的保护。 保护的基本属性为:机密性,身份认证,完整性和可用性; 基本特征:相对性,时效性,相关性,不确定性&#xf…

azkaban表project_flows数据分析

project_flows表中数据是怎么存入进去的呢,其中有个JSON字符串是乱码,怎么设置的呢?搜索插入语句地方如下: 查看压缩类型,2为Gzip压缩 public enum EncodingType {PLAIN(1), GZIP(2); 查看flow.toObject方法,其实返回的是一个MAP,定义如下: 查看convertJsonToBytes方…

YonBuilder开发之后端函数

在前几期的文章中我们已经介绍过如何在YonBuilder中使用前端函数实现数据过滤功能。相对应于前端函数,在YonBuilder中还可以使用后端函数实现对于程序的扩展。通过前端函数实现的更多的是与页面交互相关的功能,而后端函数主要是用于预制按钮功能的扩展开…

自然算法 - AI面试基础补全

手撕BP神经网络手写Bert和Transformer(BERT很细节的地方,比如文字标签CLS,par)学习pytorch,tensorflow AI算法岗位 可看网站 牛客网站 面经回复 github 项目连接 算法工程师岗位必备知识 问答 ELMO、GPT、…

操作系统_多线程笔记(二)

文章目录1.线程状态2.多线程在的意义是什么?1.线程状态 状态是针对当前线程调度的情况来描述的,因为线程是系统调度的基本单位,所以状态是属于线程的属性 线程的六种状态: 注意: 1.一旦内核里的PCB消亡了,此时代码中创建的thread也就没有用了,即内核里的线程释放的时候无…

信号包络及其提取方法(Matlab)

信号包络及其提取方法 介绍信号包络,以及信号包络的提取方法。 一、信号包络 直观地从时域来讲,信号包络就是信号波形的轮廓。 本质上,信号包络是带通信号的基带部分。 一个实带通信号记为x(t),将它频谱的中心频点搬移到零频…

Win,M1Mac上安装jupyter的MATLAB支持插件的方法

tags: MATLAB Win Mac Tips 写在前面 11月的最后一天了, 总结一下支持MATLAB的一个jupyter的插件, 有了这个你就可以在jupyter notebook或者jupyter lab上面使用MATLAB语句了, 还是很不错的, 虽然我安装了好久… 下面来说一下我在我的电脑以及朋友的电脑(Win11)上面安装这个…

实例方法(instance method)、类方法、构造方法(三)

实例方法(没有static)的概念 对象被称为实例。实例相关的有:实例变量、实例方法。实例变量是对象变量。实例方法是对象方法。实例方法没有static。(对象方法,对象级别的方法) 实例方法的调用需要先new一个…

高维多元时序数据聚类

1. 简介 收集数据的能力不断增强,使我们有可能收集大量的异构数据。在可用的异构数据中,时间序列代表着尚未被充分探索的信息母体。当前的数据挖掘技术在分析时间序列时存在多个缺点,尤其是在应同时分析多个时间序列(即多维时间序…

JVM运行时数据 堆

JVM运行时数据 堆快速调试堆参数设置堆分类运行流程Minor GC、Major GC与Full GC分代思想内存分配策略TLAB堆空间参数设置快速调试 一个JVM实例只存在一个堆内存,对也是Java内存管理的核心区域Java 堆区在Jvm启动的时候创建,其空间大小也就确定了。是JV…

[附源码]计算机毕业设计springboot课室预约系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

NVIDIA 7th SkyHackathon(八)使用 Flask 与 Vue 开发 Web

1.页面效果 Web 采用 flaskvue 开发,效果图如下 2.后端 import sys import subprocess import os from PIL import Image from datetime import datetime from ASR_metrics import utils as metricsfrom werkzeug.wrappers import Request, Response from …

分层架构理论基础

一、三层架构 1、什么是三层架构 三层架构(3-tier architecture)通常意义上的三层架构就是将整个业务应用划分为:表示层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层…

数仓之hive自定义UDTF函数详解

学习目录一、自定义UDTF函数一、自定义UDTF函数 1.说明文档 A custom UDTF can be created by extending the GenericUDTF abstract class and then implementing the initialize, process, and possibly close methods. The initialize method is called by Hive to notify t…

本机使用python操作hdfs搭建及常见问题

一.虚拟机安装CentOS7并配置共享文件夹 二.CentOS 7 上hadoop伪分布式搭建全流程完整教程 三.本机使用python操作hdfs搭建及常见问题 四.mapreduce搭建 五.mapper-reducer编程搭建 本机使用python操作hdfs搭建及常见问题一、环境搭建1.打开虚拟机系统,打开hadoop2.修…

高效率开发Web安全扫描器之路(一)

一、背景 经常看到一些SRC和CNVD上厉害的大佬提交了很多的漏洞,一直好奇它们怎么能挖到这么多漏洞,开始还以为它们不上班除了睡觉就挖漏洞,后来有机会认识了一些大佬,发现它们大部分漏洞其实是通过工具挖掘的,比如说下…

安卓版微信8.0.31内测版出炉:安装包变小,功能变多!

人是社会性生物,建立依恋、经营亲密关系是人的本能,只不过到了网络时代之后,用户进行交流的方式几乎都变成了微信等社交软件。 不仅可以让用户很便捷的和朋友进行沟通,并且在上班办公的时候,也是可以轻松传输文件等&a…