水专传奇
第一章 初入堂堂水专背景介绍 误入水泥地,心情很压抑。
临时抱佛脚,啊我临时抱佛脚。
docker安装、配置、下载软件等
dockerdocker官网
docker hub官网(需要魔法) 国内仓库
一、linux安装docker(使用root权限,如果不是,每个命令前加sudo)
官网安装教程
1. ubuntu安装docker
卸载ubuntu原装docker
1apt-get remove docker docker-engine docker.io containerd runc
更新软件包和版本数据:
1234# 1apt-get update# 2apt upgrade
安装docker所需的依赖文件
1apt-get install ca-certificates curl gnupg lsb-release
添加docker官方GPG密钥:
1curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
添加docker国内镜像源(此处选用阿里云):
1sudo add-apt-repository "deb [arch=amd64 ...
事务并发异常
事务管理
事务是由N步数据库操作序列组成的逻辑执行单元,这系列操作要么全执行,要么全放弃执行
事务的特性(ACID)
原子性:事务是应用中不可再分的最小执行体
一致性:事务执行的结果,需使数据从一个一致性状态,变为另一个一致性状态
隔离性:各个事务的执行互不干扰,任何事务的内部操作对其他的事务都是隔离的
持久性:事务一旦提交,对数据所做的任何改变都要记录到永久存储器中
事物的隔离性
第一类丢失更新:某一个事务的回滚导致另一个事务已更新的数据丢失了
第二类丢失更新:某一个事务的提交导致另一个事务已更新的数据丢失了
脏读:某一个事务读取了另一个事务未提交的数据
不可重复读:某一个事务,对同一数据前后读取的结果不一致
幻读:某一个事务,对同一个表前后查询到的行数不一致
事务隔离级别与是否避免的并发异常
实现机制
markdown语法详解
markdown常用语法 Markdown 是一种轻量级标记语言 ,广泛应用于各种文档及博客编写,多的不说,随便在github上搜个项目它的介绍绝对是md文档,又比如 用Word或者别的文本编辑器写好一篇文章,兴高采烈地发布到博客、论坛、网站上时,发现格式完全乱了,于是需要花费大量的时间来重新排版,处理图片、缩进、字体、加粗、标题等。三番五次之后,开始发现文章写作可能只花了半小时,重新排版就花了十多分钟。更让人不悦的是,当我们要把同一篇文章发布到另一个网页上时,这样的排版还要重新做一次。 而使用md完全避免了这些问题,md还是非常好上手的,编辑器也很多,比如vs code,MarkdownPad,BookPad,小书匠,Typora等等,反正一搜一大堆,可以按照自己的喜好使用,我用的是Typora。下面记录的是以前我学习markdown时的一些记录,内容不多但比较实用。
多级标题用几个#在文字前边就是几级标题,#后面要有空格或者ctrl+数字(上边的数字)
1234# 一级标题## 二级标题### 三级标题…… 以此类推
各种线,脚注***实现分割线
1*** 再敲个回车就会 ...
缓存穿透、缓存雪崩、缓存击穿三大问题介绍及解决思路
缓存穿透、缓存雪崩、缓存击穿三大问题介绍及解决思路缓存穿透概念 我们知道缓存的应用场景之一是一部分数据经常被访问,如果这部分数据只存放在数据库中的话,每次访问都要向数据库发送请求,大量并发下数据库压力就会非常大,可能导致查询效率低甚至是数据库崩溃。而缓存的使用相当于将这部分经常访问的数据放在缓存中,这样就会客户端请求就会直接指向缓存,大大减轻数据库的压力,当然这种效果只是缓存使用的一部分原因,缓存还有很多用处。
缓存穿透是指客户端请求的数据在缓存中和数据库中均不存在,首先缓存永远不会生效,这些请求就会交给数据库处理,而数据库也没有这些数据,也就无法将数据放到缓存中,缓存就无法起到作用了。这些请求相当于穿透了缓存,直接打向了数据库,这就是缓存穿透。
解决方案
缓存空对象:当我们客户端访问不存在的数据时,哪怕这个数据在数据库中也不存在,我们也把这个数据存入到redis中去,即value设为null,这样,下次用户过来访问这个不存在的数据,那么在redis中也能找到这个数据就不会进入到缓存了。
这种方式实现起来比较简单,缺点是容易造成数据短期的不一致,因为可能数据库中有相关数 ...
Redis常用数据结构
本文介绍redis的数据结构及使用redis数据结构概述Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样,常用类型有String、Hash、List、Set、SortedSet,接下来会分别介绍其结构特点和命令使用。
redis通用命令通用指令是部分数据类型的,都可以使用的指令,常见的有:
KEYS:查看符合模板的所有key(在生产环境下,不推荐使用keys 命令,因为这个命令在key过多的情况下,效率不高)
123456789127.0.0.1:6379> keys *1) "name"2) "age"127.0.0.1:6379># 查询以a开头的key127.0.0.1:6379> keys a*1) "age"127.0.0.1:6379>
DEL:删除一个指定的key
1234567891011121314151617181920212223242526272829127.0.0.1:6379> help del DEL k ...
idea插件分享2
IntelliJ IDEA提高写代码效率和代码规范性的插件上期分享了的插件主要是为了提高代码或编辑器的观赏性,以娱乐为主,这期分享更加实用的代码。
1.Key Promoter X该插件能够在你使用鼠标完成一项操作时,提供一个快捷键的提示。通过熟悉快捷键,能够大大提高你的编码效率。
2.CheckStyle-IDEA这个插件集成了Checkstyle,可以帮助你遵循编码规范。它会在你编写代码的同时检查语法错误、代码风格问题和潜在的Bug,并给出相应的警告或错误提示。
3.SonarLint这是一个非常受欢迎的静态代码分析工具,可以帮助你在编写代码时发现并修复潜在的问题。SonarLint能够检测代码质量问题、安全问题、性能问题等,使你的代码更加健壮。
4.Rainbow Brackets代码中的括号配对是编码过程中常见的错误,而这个插件会以不同的颜色显示括号,以明显区分不同的级别。这样一来你就能够更容易地识别括号是否匹配,减少错误率。
5.GitToolBox如果你使用Git进行版本控制,并频繁地切换支、查看日志、提交和推送更改,该插件能够大大提高你的工作效率。你可以通过该插件直接在I ...
idea插件分享1
IntelliJ IDEA好玩和好看的插件IntelliJ IDEA是一款功能强大的集成开发环境(IDE),而且还有一些好玩和好看的插件可以为你的编程体验增添一些乐趣和个性化。以下是几个推荐的好玩和好看的插件:
1. CodeGlance这个插件在编辑器的侧边栏添加了一个小型的缩略图,用来展示整个文件的结构。它能够帮助你更好地理解和导航代码。缩略图的外观非常简洁,既实用又美观。
2. Rainbow Brackets这个插件可以为括号加上不同的彩色,在你编写代码时,可以让你更容易找到每个括号的匹配对应关系。它不仅能提高代码的可读性,还能给编辑器增色不少。
3. Material Theme UI这是一款非常流行的主题插件,提供了一系列漂亮的颜色方案和界面样式,使得IDE的界面更加现代化和美观。你可以根据个人偏好自定义主题,让你的IDE与众不同。
4. Nyan Progress Bar这个插件会将进度条变成彩色的”Nyan Cat”,在后台任务执行时,它会伴随着”Nyan Cat”的奔跑,给你带来一些愉悦和娱乐。你可以在IDE设置中开启它,让编码过程更加有趣。
5. Presentat ...
安利edge浏览器chatgpt插件
WebTab插件___WeTab___是一个集成了众多实用功能的新标签页,让你的上网体验更加便捷和个性化。可以在edge浏览器的扩展中搜索添加,集成chatgpt只是其中一个功能,以下是一些WeTab的其他功能和特点:
1. 快速访问常用网站WeTab为你提供快速访问常用网站的功能,你可以在主界面轻松地设置你最常访问的网站链接。以后每次打开WeTab,你都可以直接点击链接,无需再手动输入网址或搜索。
2. 实时天气预报WeTab会根据你的地理位置实时提供准确的天气预报。你可以通过点击天气模块了解当前天气情况,以便做好出行、穿衣和活动的准备。
3. 智能搜索WeTab集成了强大的智能搜索功能,由ChatAI提供支持。ChatAI使用gpt-3.5-turbo模型,能够理解你的问题,并提供准确的答案或相关信息。无论是搜索具体的知识问题还是获取实用的建议,ChatAI都能为你提供帮助。
4. 个人待办事项WeTab还提供了个人待办事项功能,帮助你管理日常任务和提醒事项。你可以添加、编辑和完成任务,并设置提醒时间。无论是日常工作、学习还是生活,WeTab都能帮你保持高效和有序。
5. 自定义主 ...
完全二叉树的节点个数
完全二叉树的节点个数题目描述:求一个完全二叉树的节点个数。 leetcode链接
解题1.通用解法对于普通的二叉树,我们可以利用深度优先和广度优先方式,在遍历节点的过程中统计节点的个数,在此题中也可以采用这种方式,下面给出代码,不过多赘述。
代码如下:
123456789101112131415161718192021222324252627 /** * 深度优先 */public int countNodes(TreeNode root) { if(root== null) return 0; return countNodes(root.left)+countNodes(root.right)+1; }/*** 广度优先*/public int countNodes(TreeNode root) { if (root == null) return 0; Queue<TreeNode> queue = new LinkedList<>(); queu ...