情况一:记得root密码
用SET PASSWORD命令
1、打开终端win+r输入cmd回车即可打开;
2、通过mysql -u用户名 -p指定root用户登录MySQL,输入后回车会提示输入密码。
3、修改MySQL的root用户密码,格式:mysql> set password for 用户名@localhost = password(‘新密码’); 例子:mysql> set password for root@localhost = password(‘shapolang’); 上面例子将用户root的密码更改为shapolang;
重新登录,输入新密码shapolang就ok了;
情况二:忘记root密码,则需要重置root密码
方法一:
在my.ini的[mysqld]字段加入:
skip-grant-tables
重启mysql服务,这时的mysql不需要密码即可登录数据库
然后进入mysql
mysql>use mysql;
mysql>更新 user set password=password(‘新密码’) WHERE User=‘root’;
mysql>flush privileges;
运行之后最后去掉my.ini中的skip-grant-tables,重启mysqld即可。
方法二:
不使用修改my.ini重启服务的方法,通过非服务方式加skip-grant-tables运行mysql来修改mysql密码
停止mysql服务
打开命令行窗口,在bin目录下使用mysqld-nt.exe启动,即在命令行窗口执行: mysqld-nt --skip-grant-tables
然后另外打开一个命令行窗口,登录mysql,此时无需输入mysql密码即可进入。
按以上方法修改好密码后,关闭命令行运行mysql的那个窗口,此时即关闭了mysql,如果发现mysql仍在运行
的话可以结束掉对应进程来关闭。
启动mysql服务
故障现象:
1、服务器负载、网络IO、磁盘IO等都没有问题,很正常。
2、/var/log/secure日志无报错。
3、/var/log/maillog日志,10点48的时候提示连接不上redis服务,500条左右这样的报错。Aug 23 10:48:46 kkmail dovecot: auth-worker(1813): Error: redis: connect(127.0.0.1, 10035) failed: Connection refused
Aug 23 10:48:46 kkmail dovecot: auth-worker(1813): Error: dict(zheng@test.com,10.0.45.214): Failed to lookup key shared/passdb/10.0.45.214/pop3/zheng@test.com
Aug 23 10:48:46 kkmail dovecot: auth-worker(1818): Error: redis: connect(127.0.0.1, 10035) failed: Connection refused
Aug 23 10:48:46 kkmail dovecot: auth-worker(1818): Error: dict(jd@test.com,10.0.55.234): Failed to lookup key shared/passdb/10.0.55.234/pop3/jd@test.com
Aug 23 10:48:46 kkmail dovecot: auth-worker(1813): Error: redis: connect(127.0.0.1, 10035) failed: Connection refused
Aug 23 10:48:46 kkmail dovecot: auth-worker(1813): Error: dict(zhao@test.
CSS选择器 CSS 选择器用于“查找”(或选取)要设置样式的 HTML 元素。
我们可以将 CSS 选择器分为五类:
简单选择器(根据名称、id、类来选取元素)组合器选择器(根据它们之间的特定关系来选取元素)伪类选择器(根据特定状态选取元素)伪元素选择器(选取元素的一部分并设置其样式)属性选择器(根据属性或属性值来选取元素) CSS 元素选择器 元素选择器根据元素名称来选择 HTML 元素。
实例
在这里,页面上的所有 元素都将居中对齐,并带有红色文本颜色:
p { text-align: center; color: red; } CSS id 选择器 id 选择器使用 HTML 元素的 id 属性来选择特定元素。
元素的 id 在页面中是唯一的,因此 id 选择器用于选择一个唯一的元素!
要选择具有特定 id 的元素,请写一个井号(#),后跟该元素的 id。
实例
这条 CSS 规则将应用于 id=“para1” 的 HTML 元素:
#para1 { text-align: center; color: red; } 注意:id 名称不能以数字开头。
CSS 类选择器 类选择器选择有特定 class 属性的 HTML 元素。
如需选择拥有特定 class 的元素,请写一个句点(.)字符,后面跟类名。
通常我们会在云主机上运行很多服务,在调试这些服务的时候我们需要打开防火墙来访问指定的服务,但是这样会扩大我们的云主机的攻击面,让我们的云主机的安全受到威胁。虽然我们可以通过限制 IP 来减少威胁,但是每次都去云平台调整防火墙的 IP 限制显然是一件很麻烦的事。
VSCode 有一个 remote ssh 插件,装上这个插件后我们就可以通过 ssh 远程访问我们的主机了,这个插件有一个 port forward 功能,使用这个功能后我们就可以不用调整防火墙设置直接在本地访问云主机指定端口上的服务了。比如下面的截图就是把云主机的 5432 端口转移到本地。PostgreSQL 使用 5432 提供数据库服务,这样我们就可以在本地使用 PostgreSQL 服务了。
结论 我们可以使用 vscode remote ssh 插件的 port forward 功能来方便方便我们的调试工作。
参考链接 https://code.visualstudio.com/docs/remote/ssh
如何让 vscode 使用 ssh密钥 (key) 来连接到远程Linux上
硬盘损毁 自用群晖DSPlay 216+,双盘位安装 西数红盘 4T *2, 四年来一直没出过毛病,没成想搬家的时候坏掉了一个硬盘。系统里一直爆红-存储空间损毁。虽然仍然可以读取部分文件,但是文件夹和文件名称都有出现乱码,丢失了部分文件。
检查后是有扇区损坏,试过了扇区修复也无法解除报警。
因为没有做Raid,考虑再三还是决定更换硬盘,避免更多数据的丢失。
过程只需三步:
首先要买一个容量足够数据恢复的新硬盘。正好由于空间紧张,买了一块8T红盘。关机,将状态正常的硬盘位的硬盘替换为新买的硬盘。开机,用新硬盘创建存储空间。将损毁硬盘中可抢救的数据备份到新硬盘上。卸下损坏硬盘,装上原先完好的旧硬盘。 过程还是比较简单的,只是需要费点钱和时间,但是更换之后就可以恢复正常使用了。
系统? 开始执行前,产生一个问题,更换硬盘会不会影响NAS的系统 ?还能开机吗?
实际上群晖NAS在每个硬盘里都有系统分区,所以拆掉某一个硬盘并不会影响开机和使用。所以只要不是全部硬盘都挂了,能进去系统操作就可以直接操作文件,不算复杂。
预防硬盘损坏 使用UPS。推荐施耐德UPS,我之前使用过BK650,质量很好使用官方给出的兼容硬盘、兼容内存模块定期执行SMART检测 官方支持地址
如果一个存储空间损毁,该怎么办?
我如何防止存储空间损毁?
导致存储空间损毁的原因是什么以及如何处理?
如果硬盘处于“警告”,“严重”或其他异常状态,该怎么办?
Synology 产品兼容性列表
1、数据库范式的引入是为了解决数据插入、删除、更新异常及数据冗余问题,并不是提高访问效率。
关系型数据库设计必须符合第一范式(原子性),在这种范式下一个数据列只能有一个值。
2、sql注入中使用延时注入常用sleep(),benchmark().
3、视图是外模式(子模式)
索引可以加快查询语句的执行速度。
4、grant 权限 on.数据库.to 用户.(给用户是to)
revoke 权限 on 数据库 from 用户。(从用户那里收回来是from)
5、共享锁【S锁】:又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何改变。
排它锁【X锁】:又称写锁。若事务T对数据对象A加X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,知道事务T释放A上的锁,这保证了其他事务在事务T释放A行的锁之前不能再读取和修改A。
6、能接受“数据”窗体控件有文本框。
7、关系型数据模型的基本数据结构是关系(二维表);
层次数据模型的逻辑结构是树;
网状数据结构的逻辑结构是图。
8、视图 可以在视图上定义新的视图,但是不能在视图上再定义新的表。
视图可以通过视图或基本表得到,但是基本表不能通过视图得到。
9、计算机中的透明简单来说就是:计算机存在,但你不需要了解的。
DDBS中,透明性层次越高,应用程序编写越简单。(会用就行)
底层程序和应用程序不一样。
10、like是模糊搜索。
11、数据库技术的根本目的是解决数据的共享问题。
13、视图是虚表,视图可以更新,但是不是所有的视图都可以更新。
14、数据库恢复的基础是利用转储的冗余数据。这些冗余数据包括:日志文件,数据库后备副本。
15、在表中,查询的数据源可以是表和查询,意思是可以直接查询一个表,亦可以在一个查询子表上再查询。
16、delete * from 表,注意不能是del
17、在使用分组和排序子句进行数据检索时,可以减少查询中分组和排序的时间。
18、E-R图中:
矩形:实体;菱形:关系;椭圆:属性;
19、模式描述的是数据的全局逻辑结构,外模式(子模式)描述的是数据的局部逻辑结构。
20、想得到前几名的数据,可以先排序然后取limit 10
21、可重复度:在同一事务内的查询都是事务开始时刻一致的,innoDB默认级别。
22、事务日志用于保存数据库数据的变动,包括增删改等操作(更新)。
23、数据库加锁主要就是解决线程争抢资源的问题,即并发控制问题。常见锁有共享锁,排它锁。
SQL语言具有两种使用方式。分别是交互式SQL和嵌入式SQL。
24、表的数据表视图中,可以修改字段名称,删除字段和删除记录,但是不能修改字段类型。字段类型需要在设计视图中修改。
25、drop删除表数据和表结构,delete只删除表数据。
26、if判断条件非0即为真。
27、access提供了5中类型的查询:选择查询、参数查询、交叉表查询,操作查询和SQL查询。
28、加锁和解锁必须分开。
29、在E-R模型中:
关系数目=实体个数+多对多联系数
30、
问题背景 用python调试串口通信协议时,模拟一组16进制字节数据,通过文本形式表示,最终转为16进制形式,数据前后出现异常。
解决方法 不能使用encode(),应该使用b''字符表示'的形式,对比程序如下。
错误使用 #异常代码: data2='\xaa\x01\x01\x06\x01\x02\x03\x04\x05\x06\xc7'.encode() print("data2:",data2) #输出结果: #data2: b'\xc2\xaa\x01\x01\x06\x01\x02\x03\x04\x05\x06\xc3\x87' 正确 使用 #正常输出 data2=bytes(b'\xaa\x01\x01\x06\x01\x02\x03\x04\x05\x06\xc7') print("data2:",data2) #输出结果: #data2: b'\xaa\x01\x01\x06\x01\x02\x03\x04\x05\x06\xc7'
什么叫“半爬虫”呢?这是我自己给这类小爬虫的命名。
比如,有的网站,是动态渲染的,你只需要主页面的部分代码,不需要大动干戈的再用selenium测试一番,只需要在浏览器抓包“检查”中,把需要的代码范围的上一层复制一下,保存在本地txt(utf-8编码)中,然后用本爬虫解析就可以啦!
比如,我要下载《小猪佩奇》的241-250集(http://tv.sohu.com/s2015/fhzxm/),就只用把相应范围的代码复制到本地,在用本爬虫解析就行啦!
这是本地文件:
需要的局部html代码为:
<ul class="serielist tebbcon" style="display: block;"><li><em class="num">241</em><a href="//tv.sohu.com/v/MjAyMDA3MDkvbjYwMDg3OTc1Mi5zaHRtbA==.html" target="_blank" class="fs14 s-tit">第241集:猪爷爷的池塘</a></li><li><em class="num">242</em><a href="//tv.sohu.com/v/MjAyMDA3MDkvbjYwMDg3OTc1NC5zaHRtbA==.html" target="_blank" class="fs14 s-tit">第242集:在很久以前</a></li><li><em class="num">243</em><a href="//tv.sohu.com/v/MjAyMDA3MDkvbjYwMDg3OTc1Ni5zaHRtbA==.html" target="_blank" class="fs14 s-tit">第243集:警察局</a></li><li><em class="num">244</em><a href="//tv.sohu.com/v/MjAyMDA3MDkvbjYwMDg3OTc1OC5zaHRtbA==.html" target="_blank" class="fs14 s-tit">第244集:等我长大以后</a></li><li><em class="num">245</em><a href="//tv.sohu.com/v/MjAyMDA3MDkvbjYwMDg3OTc2MC5zaHRtbA==.html" target="_blank" class="fs14 s-tit">第245集:救护车</a></li><li><em class="num">246</em><a href="//tv.sohu.com/v/MjAyMDA3MDkvbjYwMDg3OTc2Mi5zaHRtbA==.html" target="_blank" class="fs14 s-tit">第246集:医生</a></li><li><em class="num">247</em><a href="//tv.sohu.com/v/MjAyMDA3MDkvbjYwMDg3OTc2NC5zaHRtbA==.html" target="_blank" class="fs14 s-tit">第247集:土豆超人</a></li><li><em class="num">248</em><a href="//tv.sohu.com/v/MjAyMDA3MDkvbjYwMDg3OTc2Ni5zaHRtbA==.html" target="_blank" class="fs14 s-tit">第248集:兔爷爷的气垫船</a></li><li><em class="num">249</em><a href="//tv.sohu.com/v/MjAyMDA3MDkvbjYwMDg3OTc2OC5zaHRtbA==.html" target="_blank" class="fs14 s-tit">第249集:幼儿园之星</a></li><li><em class="num">250</em><a href="//tv.sohu.com/v/MjAyMDA3MDkvbjYwMDg3OTc3MC5zaHRtbA==.html" target="_blank" class="fs14 s-tit">第250集:嘉年华</a></li></ul> 具体py代码为;
import requests import re import os import threading import queue import threadpool def download(i): try: print('正在多线程下载:',i) os.
Vue中key值的作用 首先v-for 在列表渲染时,我们可以用v-for基于一个数组来渲染一个列表。v-for指令需要使用item in arr形式的特殊语法来进行渲染列表,arr是源数据,
<ul id="example-1"> <li v-for="item in arr" :key="item.id"> {{ item.message }} </li> </ul> v-for中的key值 在vue.js文档中是这样写的
当Vue正在使用v-for渲染元素列表的时候,它默认的是使用**就地更新**的策略。如果数据项的顺序被改变,Vue将不会移动DOM元素来匹配数据项的顺序,而是采用了就地更新每个元素,并且确保他们在每个索引的位置正确渲染。
这个默认的模式是高效的,但是只是适用于不依赖子组件状态来临时DOM的状态的列表渲染输出。
为了能够更高效的渲染页面,你需要为每项提供一个唯一的key值。
注意:
这边提醒您,渲染时尽量提供id作为key值。
可以看出,通过key值的作用,给每个节点做一个唯一的标识,diff算法就可以正确识别此节点,找到正确的位置插入新的节点
key值特殊的属性主要使用在Vue的虚拟DOM算法,在新旧node对比时辨识VNodes,如果不使用key,Vue会使用一种最大限度减少动态元素,并且尽可能的尝试就地复用,相同类型元素的算法,而使用key值时,它会就与key的变化重新排列元素顺序,并且会移出key不存在的元素
总结:
key值的作用
在大多数情况下使用在循环语句中,从本质来有两点:
1、主要是用在vue的虚拟Dom算法,在新旧nodes对比时辨识VNodes,相当于唯一标识ID,
2、vue会尽可能的高效的渲染元素,通常恢复已有的元素而不是从头开始进行渲染,因此使用key值可以提高渲染效率,同理,改变某一个元素的key值会使该元素重新被渲染。
一、vscode 鼠标侧键 映射Alt+LEFT 或 RIGHT 实现代码便捷跳转? 1. (14 封私信 / 60 条消息) 如何使autohotkey只对特定窗口有效? - 知乎: https://www.zhihu.com/question/22437540?from=profile_question_card
2. 鼠标侧键在AHK如何表达?
[Autohotkey入门]告诉那些按钮它们的使命是听话: 热键 - 知乎: https://zhuanlan.zhihu.com/p/59697660
3. 解决代码
;;2021年4月27日 18:20:37 ;;限定以下程序只运行在vscode的里面 #IfWinActive ahk_exe Code.exe XButton2::!Right XButton1::!Left #IfWinActive
概念 RDB=RedisDateBase,Redis是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一但服务器进程退出,服务器中的数据库状态也会消失。所以需要用到持久化功能!RDB持久化是将当前进程中的数据生成快照保存到硬盘(因此也称作快照持久化),保存的文件后缀是rdb;当Redis重新启动时,可以读取快照文件恢复数据。RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。一般Redis默认启动RDB 具体原理 Redis单独创建(fork)一个子进程进行持久化,会先将数据写入到一个临时的文件中,待持久化过程都结束了,在用这个临时文件替换上次持久化好的文件。整个过程中,主进程食不进行任何IO操作的。这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,拿RDB方式要比AOF方式更加高效。RDB的缺点是最后一次持久化后的数据可能会丢失。
RDB配置详解: 在配置文件redis.conf全局搜索SNAPSHOTTING
RDB配置 1.通过搜索SNAPSHOTTING找到配置,并且配置触发条件
那么只要满足以下三个条件中的任意一个,BGSAVE命令就会被执行
服务器在900秒之内,对数据库进行了至少1次修改
服务器在300秒之内,对数据库进行了至少10次修改 服务器在60秒之内,对数据库进行了至少10000次修改。
我这里配置了60秒之内,对数据库进行了至少5次修改就触发RDB。其他的被我注掉了。
2.开启保存出错停止写入功能(默认开启)
如果RDB快照持久化操作被激活(至少一个条件被激活)并且持久化操作失败,Redis则会停止接受更新操作。
3.数据压缩(默认开启)
4.RDB文件校验(默认开启)
这会让格式更加耐攻击,但是当存储或者加载rbd文件的时候会有一个10%左右的性能下降
指定本地数据库文件名,一般采用默认的 dump.rdb
6.rdb文件是否删除同步锁(默认不开启)。
生成文件的工作目录
################################ 快照 ################################# # Save the DB on disk:保存数据库到磁盘 # save <秒> <更新> # 如果指定的秒数和数据库写操作次数都满足了就将数据库保存。 # 下面是保存操作的实例: # 900秒(15分钟)内至少1个key值改变(则进行数据库保存--持久化) # 300秒(5分钟)内至少10个key值改变(则进行数据库保存--持久化) # 60秒(1分钟)内至少10000个key值改变(则进行数据库保存--持久化) # 注释:注释掉“save”这一行配置项就可以让保存数据库功能失效。 # 你也可以通过增加一个只有一个空字符串的配置项(如下面的实例)来去掉前面的“save”配置。 # save "" save 900 1 save 300 10 save 60 10000 #在默认情况下,如果RDB快照持久化操作被激活(至少一个条件被激活)并且持久化操作失败,Redis则会停止接受更新操作。 #这样会让用户了解到数据没有被正确的存储到磁盘上。否则没人会注意到这个问题,可能会造成灾难。 #如果后台存储(持久化)操作进程再次工作,Redis会自动允许更新操作。 #然而,如果你已经恰当的配置了对Redis服务器的监视和备份,你也许想关掉这项功能。 #如此一来即使后台保存操作出错,redis也仍然可以继续像平常一样工作。 stop-writes-on-bgsave-error yes #是否在导出.rdb数据库文件的时候采用LZF压缩字符串和对象? #默认情况下总是设置成‘yes’, 他看起来是一把双刃剑。 #如果你想在存储的子进程中节省一些CPU就设置成'no', #但是这样如果你的kye/value是可压缩的,你的到处数据接就会很大。 rdbcompression yes #从版本RDB版本5开始,一个CRC64的校验就被放在了文件末尾。 #这会让格式更加耐攻击,但是当存储或者加载rbd文件的时候会有一个10%左右的性能下降, #所以,为了达到性能的最大化,你可以关掉这个配置项。 #没有校验的RDB文件会有一个0校验位,来告诉加载代码跳过校验检查。 rdbchecksum yes # 导出数据库的文件名称 dbfilename dump.
1. 模块化简介 在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种。前者用于服务器,后者用于浏览器。ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。
ES6 模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 模块,都只能在运行时确定这些东西。比如,CommonJS 模块就是对象,输入时必须查找对象属性。
模块化是指将一个大的程序文件,拆分程许多小的文件,然后将小文件组合起来。类似于vue中的组件化。
1.1 模块化的好处 防止命名冲突(不同模块的相同变量名,重复不冲突)代码复用(把一个功能代码放在同一个模板里,向外暴露接口,可供给多个地方使用)高维护性(如果多人对代码修改,不会产生过度冲突;代码和模块升级只需对某一个或某些模块进行升级) 1.2 模块块化规范产品 CommonJs 规范 =》 产品: NodeJs、BrowerifyAMD 规范 =》 产品: requireJSCMD 规范 =》 产品: seaJS 1.3 ES6模块块语法 模块功能主要由两个命令构成:export 和 import 。在引入模块时script要写type="module",不然会报错哦,Uncaught SyntaxError: Cannot use import statement outside a module。
export 命令用于规定模板块对外接口import 命令用于输入其他模块的对外接口 // module.js export let test = 'test' export function add (a, b) { return a + b } // xxx.
scala安装与配置 一、window系统安装Scala1.下载安装2.配置环境变量3.验证 二、linux系统安装Scala三、IDEA安装scala插件 一、window系统安装Scala 1.下载安装 首先去官网http://www.scala-lang.org/,然后点击导航栏的DOWNLOAD,进入下载链接:http://www.scala-lang.org/download/直接点击上面的按钮下载Windows安装包。msi格式,可以直接安装,然后双击运行,直至安装成功,此时查看环境变量会发现path路径里面已经自动配置了 scala的bin目录 。zip格式,解压后自己配置环境变量即可。
注意:安装目录不要有中文和空格。建议下载zip格式解压安装即可
2.配置环境变量 新增系统变量SCALA_HOME
配置PATH环境变量新增:%SCALA_HOME%\bin;
3.验证 打开cmd命令行,输入scala -version
二、linux系统安装Scala 下载压缩包,解压安装配置环境变量
验证
三、IDEA安装scala插件 方式一:找到与IntelliJ IDEA对应的scala版本直接安装
如图,在File下找到Settings
在弹出的对话框中点击Plugins,然后点击Install JetBrains plugin
方式二:在网站下载对应scala环境
https://plugins.jetbrains.com/plugin/1347-scala
该种方式适用于第一种方式无法成功的情况。
把下载的.zip格式的scala插件放到Intellij的安装的plugins目录下(不用解压),然后加载刚刚放到plugins目录下的.zip文件
安装完成后重启IntelliJ IDEA
配置安装完成
3. 测试
新建project
新建Scala测试object
为什么MySQL使用B+而不是使用B树、二叉树、AVL树呢? 本文转载自:https://blog.csdn.net/qq_36520235/article/details/94317993,感谢大神!
一、B+树做索引而不用B-树 那么Mysql如何衡量查询效率呢?– 磁盘IO次数。
一般来说索引非常大,尤其是关系性数据库这种数据量大的索引能达到亿级别,所以为了减少内存的占用,索引也会被存储在磁盘上。B-树/B+树 的特点就是每层节点数目非常多,层数很少,目的就是为了减少磁盘IO次数,但是B-树的每个节点都有data域(指针),这无疑增大了节点大小,说白了增加了磁盘IO次数(磁盘IO一次读出的数据量大小是固定的,单个数据变大,每次读出的就少,IO次数增多,一次IO多耗时),而B+树除了叶子节点其它节点并不存储数据,节点小,磁盘IO次数就少。
优点一: B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域。优点二: B+树所有的Data域在叶子节点,并且所有叶子节点之间都有一个链指针。 这样遍历叶子节点就能获得全部数据,这样就能进行区间访问啦。在数据库中基于范围的查询是非常频繁的,而B树不支持这样的遍历操作。 二、B+树做索引而不用红黑树 AVL 树(平衡二叉树)和红黑树(二叉查找树)基本都是存储在内存中才会使用的数据结构。在大规模数据存储的时候,红黑树往往出现由于树的深度过大而造成磁盘IO读写过于频繁,进而导致效率低下的情况。为什么会出现这样的情况,我们知道要获取磁盘上数据,必须先通过磁盘移动臂移动到数据所在的柱面,然后找到指定盘面,接着旋转盘面找到数据所在的磁道,最后对数据进行读写。磁盘IO代价主要花费在查找所需的柱面上,树的深度过大会造成磁盘IO频繁读写。根据磁盘查找存取的次数往往由树的高度所决定,所以,只要我们通过某种较好的树结构减少树的结构尽量减少树的高度,B树可以有多个子女,从几十到上千,可以降低树的高度。
数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。为了达到这个目的,在实际实现B-Tree还需要使用如下技巧:每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。
下面就一步一步从二叉树——>AVL(平衡二叉树)——>B Tree(多路平衡查找树)——>B+ Tree的一个演变的过程来进行分析,为什么使用B+ Tree的? (1)先从二叉树开始说起:
首先你得知道二叉树是什么吧:看下面的图一你就该很熟悉了吧然后你得知道二叉树查询的时间复杂度是O(log2(n)),这样感觉其实二叉树的查询效率挺高的,但是他会出现另一种现象,就是下面的图二:这样就导致了二叉树的查询效率不问题,如果运气好的话查询效率就很高,如果运气不好的话,就会出现图二的情况,因此在二叉树的基础上又进行的改进,演变出来了平衡二叉树(AVL树) 图一:
图二:
(2)然后到了平衡二叉树(AVL树):
1.首先你得知道平衡二叉树的定义吧:在满足二叉树的基础上,任意两个节点的两个子树的高度差不能超过1:就好比下面的这个图的一个效率很差的二叉树,比如5节点的左子树的高度是0,右字树的高度是2,,所以很明显不满足平衡二叉树的概念
2.AVL树主要是为了解决上面的图出现的情况,所以现在要把上图的二叉树转插入一个“9”节点然后换为一个平衡二叉树的情况就是下面的:
3.可以看出平衡二叉树的缺点就是:(1)维护平衡过程的成本代价很高,因为每次删除一个节点或者增加一个节点的话,需要一次或者多次的左旋,右旋等去维护“平衡”状态,(2)然后是查询的效率不稳定,还是会有看运气的成分在里面,(3)然后是如果节点很多的话,那么这个AVL树的高度还是会很高的,那么查询效率还是会很低,
4.还有就是节点存储的数据内容太少。没有很好利用操作系统和磁盘数据交换特性,也没有利用好磁盘IO的预读能力。因为操作系统和磁盘之间一次数据交换是已页为单位的,一页 = 4K,即每次IO操作系统会将4K数据加载进内存。但是,在二叉树每个节点的结构只保存一个关键字,一个数据区,两个子节点的引用,并不能够填满4K的内容。幸幸苦苦做了一次的IO操作,却只加载了一个关键字,在树的高度很高,恰好又搜索的关键字位于叶子节点或者支节点的时候,取一个关键字要做很多次的IO。因此平衡二叉树也是不太符合MySQL的查询结构的。
(3)然后到了使用B Tree(多路平衡查找树)
5.首先你也得知道B Tree的基本概念:所有的叶子节点的高度都是一样,这个保证了每次查询数据的时候都是稳定的查询效率,不会因为运气的影响
6.然后B Tree中其实每个非叶子节点内的小节点内其实都是一个二元组[key, data],key其实就是下图的那个25这种的,然后这个data其实对应的就是数据库中id等于25这条完整的数据记录的内存地址(因为在Myisam中他是数据和索引数据是分开的)
B树的特点:
1.首先B Tree的每一个节点上其实是有date的,这个date其实就是
2.然后是B Tree查询的效率不够稳定,他有可能在第一个节点中就查到了数据,并且返回
3.他的键值其实都是分布在整棵树上的节点上的任何一个节点
(4)然后到了使用B+ Tree(多路平衡查找树)
4.首先你要知道什么B+ Tree,其实他是专门为磁盘或者其他的直接存取辅助设备设计的一种平衡查找树,在B树中,所有的节点都是按照键值的大小顺序存放在同一层的叶子节点上,由各叶子节点的指针连接。
5.下图的一颗B树,是一个高度为2,每一页可以放4条记录,扇出是5。
重要的第一点:
6.重要的第一点:B+ Tree有一个很大的改变就是他的每一个非叶子节点的内节点中都没有date这个概念了,都变成了key,因为他的date都放在了叶子节点上,这样的一个最大的好处就利用了局部性原理(当一个数据被用到时,其附近的数据也通常会马上被使用)与磁盘预读的特性(磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个位置开始,顺序向后读取一定长度的数据【这个一定的长度就是一个节点的大小设置为16K】放入内存)
7.接着上面的:预读的长度一般为页(page)的整倍数。页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割为连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页得大小通常为4k),主存和磁盘以页为单位交换数据。当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中,然后异常返回,程序继续运行。
8.重要的第二点:由于上面我们说的预读原理,因为B+ Tree中节点的内节点无 data 域,其实就是因为没有date域了,但是每次IO的页的大小是固定的,但是B+Tree中没有了date域,那么肯定每次IO读取若干个块块中包含的Key域的值肯定更多啊,B+树单次磁盘 IO 的信息量大于B树,从这点来看B+树相对B树磁盘 IO 次数少。
9.数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。
10.为了达到这个目的在实际实现B-Tree还需要使用如下技巧:每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。
重要的第二点:
B+Tree中因为数据都在叶子节点,所以每次查询的时间复杂度是固定的,因为稳定性保证了而且叶子节点之间都是链表的结构,所以B+ Tree也是可以支持范围查询的,而B树每个节点 key 和 data 在一起,则无法区间查找。
一,新装的centos6.5可以直接执行以下步骤解决yum命令无法在线安装问题
1、进入/etc/yum.repos.d目录:cd /etc/yum.repos.d
2、备份CentOS-Base.repo文件:cp CentOS-Base.repo CentOS-Base.repo.backup
3、修改CentOS-Base.repo文件执行以下命令
1、注释掉所有的mirrorlist所在行:sed -i “s/mirrorlist=http/#mirrorlist=http/g” /etc/yum.repos.d/CentOS-Base.repo
2、取消所有的baseurl的注释:sed -i “s/#baseurl/baseurl/g” /etc/yum.repos.d/CentOS-Base.repo
3、替换镜像:sed -i “s@http://mirror.centos.org@http://mirrors.sohu.com@g” /etc/yum.repos.d/CentOS-Base.repo
4、清除缓存(两个命令):yum clean all rm -rf /var/cache/yum
5、生成yum缓存:yum makecache
6、在线安装:yum install lrzsz
视频地址关注头条
Rxjava分发使用
Observable.create( // 自定义source new ObservableOnSubscribe<String>() { @Override public void subscribe(ObservableEmitter<String> emitter) throws Exception { // 发射器.onNext emitter.onNext("A"); } }) // 3:subscribe订阅过程 源码分析 // ObservableCreate. subscribe .subscribe( // 自定义观察者 // 1:Observer new Observer<String>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(String s) { } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } Rxjava 不加 Retrofit框架的话使用为
public void rxJavaDownloadImageAction(View view) { // 起点 Observable.
查看oracle数据库服务器的名字
windows 中
1. select name from v$database ;
直接运行就可以查看了,
2.查看tnsnames.ora 的连接,有个SID,SID就是服务名了
1.查看oracle的安装目录,
方法是查看注册表:
如:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ORACLE_HOME REG_SZ E:\ORACLE\ORA92
得到了oracle的安装目录
一般来讲,如果服务器在安装时采用的是默认值那么这个值是:D:\ORACLE\ORA92
2.找到tnsnames.ora文件
在根目录下面找到\network\ADMIN\tnsnames.ora 文件,并打开
3.仔细查看里面的tnsnames.ora 配置
例如
# TNSNAMES.ORA Network Configuration File: d:\oracle\ora92\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.
WZZ=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = wzz)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = WZZ)
)
)
其中的service_name就是服务名,例如对如上面的文件 ,服务名就是WZZ
附 C#获取oracle服务器名 :
#region 从注册表中读取安装主目录的值
1、基类就是父类。成员还包括静态成员。
2、for循环,三个表达式都为空也是可以的。
我们使用while就是为了它的循环次数是不定的,而for循环一般限定了循环次数。但实质上,while循环能够实现的操作,for循环也能实现。
3、
在Java中,静态变量只能在类主体中定义,不能在方法中定义,静态变量属于类所有而不属于方法。
局部变量不能添加public等各种访问权限修饰符,但是可以用final修饰。
4、java中只有左移右移和无符号右移(>>>),没有无符号左移(<<<)。
5、哪个类可以改变字符集类型 ,用于处理Unicode
6、算法包括0个或多个输入,一个或多个输出,中间有穷个处理过程。
7、i=i++;i是中间变量,合并到下一行的处理中。
8、各种排序方法在各种情况下的算法复杂度。
10、AWT的基本组件:
TextField:表示文本框;
Menu:表示下拉菜单
Label:表示标签;
List:列表框;
11、
floor:意为地板,指向下取整,返回值不大于它的最大整数;
ceil:天花板,指向上取整,返回值不小于它的最小整数。
round:四舍五入,注意负数还有小数等于0.5的情况。
12、ArrayList list=new ArrayList();
这是默认创建大小为10的数组,每次扩容大小为1.5倍;
ArrayList list=new ArrayList(20);
这个使用的是ArrayList的有参构造函数,这是种指定数组大小的创建,创建时之间分配其大小,没有扩充。
13、布尔值可以是一个表达式的值,但必须是一个true或者false值。比如:boolean b=3>5;b的值为false;
java中在初始化数据时,必须按照标准的数据格式,比如float数据的后缀必须是f;这是初始化时的条件,但是在下面的表达式赋值运算时可以自动转型。
14、java编译成的是字节码,再被各系统的jvm翻译成本系统可以识别的机器码,这就是java一次编程多平台应用的跨平台性;
java源文件生成的是class文件,与系统无关;
注意字节码和机器码不是一回事,Java程序在运行时字节码才会被jvm翻译成机器码 ,所以说Java是解释型语言;
java编译出来的目标文件,要注意jvm的版本,并不是任意的jvm都可以运行。
15、Servlet的生命周期
16、javac的作用是将源程序编译成字节码。
17、
编译时异常必须显示处理,运行时异常交给虚拟机。
运行时异常可以不处理。当出现这样的异常时,总是由虚拟机接管。比如我们从来没有去处理过Null Pointer Exception异常,他就是运行时异常。休闲运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主线程抛出的异常,整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被catch块处理的,只不过往往不对它处理罢了。也就是说,如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
捕获到的异常不仅可以在当前方法中处理,还可以将异常抛给调用它的上一级方法来处理。
18、web程序中
当前用户上下文信息:session;
application:当前应用;
pageContext:当前页面;
request:当前请求。
19、子类重写父类的方法后,调用的方法都是子类重写后的方法,除非特意用super.方法名。
20、声明非静态内部类对象的方法:外部类名.内部类名 对象名=new 外部类名().new 内部类名();
(注意:此时等号后边需要创建外部类对象,所以有new 外部类名().new 内部类名())
声明静态内部类对象的方法:外部类名.内部类名 对象名=new外部类.内部类名();
(注意:此时等号右边不需要创建外部类对象,所以有new 外部类.内部类名()即可)
21、byte数据范围[-127,128],如果越界,观察符号位,如果为1,则表示负数,负数用补码表示。想要知道原码,用补码-1再取反。
22、RandomAccessFile 可以通过seek(long pos)方法去移动文件指针进行追加更新写入。
outstream是一个抽象类,不能实例化去写入;
23、实现多线程的三种方式:
继承Thread类,因为java是单继承,所以如果使用这个方式就不能再继承其他类了,同样,如果一个类已经继承了某个类,那么它就不能再继承thread实现多线程了。
用caxis显示更加靠谱一点
使用 ylim 设置有时候显示不了