0%

Redis数据类型

  • key:String类型,最大512MB
  • value:
    • Binary-safe strings(字符串/整数)
    • Lists 按照插入顺序保存的字符串集合
    • Sets 元素唯一 未排序的集合
    • Sorted sets 每个元素关联一个浮点数(score),元素根据这个score排序
    • Hashes
    • Bit arrays
    • HyperLogLogs
    • Streams

事物的特性

  1. 原子性(Atomicity):事物中的所有数据库操作都执行成功则整个事物之行成功,任何一个操作执行失败则整个事物回退。关注事物执行的状态:要么全成功,要么全失败。
  2. 一致性(consistency):事务不能破坏关系数据的完整性和业务逻辑上的一致性。例如银行转帐事务,不管事务成功还是失败,应该保证事务结束后ACCOUNTS表中Tom和Jack的存款和不变。关注数据的可见性只有最初和最终状态的数据对外可见。
  3. 隔离性(isolation):事务对其他事务的操作互相分离,即该事务提交前对其他事务不可见。
  4. 持久性(durability):事务一旦提交其结果就是永久性的,即使发生系统崩溃,重启数据库后数据库还是可以恢复到事务成功结束时的状态。

事物的隔离级别

  1. 读未提交(read uncommitted):一个事务未提交时所做的改动可以被另一个事务看到。
  2. 读提交(read committed):一个事务提交之后他所作的改动才能被其他事务看到。
  3. 可重复读(repeatable read):一个事务执行过程中的数据和它启动时的数据一致的,且未提交的变更对其他事务也是不可见的。
  4. 串行化(serializable):对同一条数据写操作会加“写锁”读操作会加“读锁”,当读写冲突时后来的事务要等先来的事务执行完才能继续执行。

配置方式

修改启动参数transaction-isolation

1
2
3
[mysqld]
transaction-isolation = REPEATABLE-READ
##k可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE

最近在看《MySQL技术内幕:InnoDB存储引擎》这本书,在此做个笔记记录下重点内容。由于面试中经常被问到MySQL索引相关的问题,而自己又一直没有完全理解因此先跳过其他部分重点看一下索引相关内容,也为面试做些准备。

MySQL中Innodb引擎的索引

Innodb引擎支持以下几种常见的索引:

  • B+树索引
  • 全文索引
  • 哈希索引

​ 其中哈希索引是自适应的,InnoDB引擎会根据表的使用情况自动为表生成哈希索引,不能人为干预是否在一张表中生存哈希索引。

​ B+树索引是传统意义上的索引,这是目前关系型数据库中查找最为常用和最有效的索引,这里就着重记录下B+树相关的内容。

阅读全文 »

常用命令

  1. 增加用户
1
2
3
4
5
6
7
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
##例子
CREATE USER 'dog'@'localhost' IDENTIFIED BY '123456';
CREATE USER 'pig'@'192.168.1.101_' IDENDIFIED BY '123456';
CREATE USER 'pig'@'%' IDENTIFIED BY '123456';
CREATE USER 'pig'@'%' IDENTIFIED BY '';
CREATE USER 'pig'@'%';
  1. 修改密码
1
2
3
set password for root@localhost = password('123'); 
##例子
SET PASSWORD FOR 'pig'@'%' = PASSWORD("123456");
  1. 授权
1
2
3
4
5
6
7
8
GRANT privileges ON databasename.tablename TO 'username'@'host'
## 例子
GRANT SELECT, INSERT ON test.user TO 'pig'@'%';
GRANT ALL ON *.* TO 'pig'@'%';
GRANT ALL ON maindataplus.* TO 'pig'@'%';

## 用以上命令授权的用户不能给其它用户授权,如果想让该用户可以授权,用以下命令:
GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;
阅读全文 »

MySQL基础组成结构

数据库和实例

  • 数据库:物理操作系统文件或其他形式的文件类型的集合。在MySQL数据库中,数据库文件可以是frm,MYD,MYI,ibd结尾的文件。当使用NDB引擎时,数据库的文件可能不是操作系统上的文件,而是存放于内存中的文件,但是定义不变。
  • 实例:MySQL数据库由后台线程以及一个共享内存区组成。共享内存可以被运行的后台线程所共享。数据库实例才是真正用于操作数据库文件的。

​ 直白来讲,数据库就是一个个文件组成(二进制文件)的,要对这些文件执行SELECT、INSERT、DELETE等操作需要通过数据库实例来完成。

数据库体系结构

​ MySQL由客户端,连接池组件(Connection Pool)、缓冲组件(Caches&Buffer)、查询分析器(Parser)、SQL优化器(Optimizer)、插件式存储引擎(Pluggable Storage Engines)、SQL接口组件(SQL Interface),管理服务和工具组件(Management Services & Utilities),物理文件(File System)构成。

图中的Connectors为不同语言实现的与MySQL交互的连接器用来建立连接执行SQL

当一条查询语句的执行过程如下图所示

存储引擎是基于表的而不是数据库。

一转眼2020年了,最近春节期间瘟疫肆虐,在家猫着无聊再学习一波JVM相关知识做一下笔记,争取年后能够成功跳槽。

在Java中类的加载是在程序运行中进行的,因此会对程序运行产生一些性能开销,但是增加了程序的灵活性。

类的加载是指将类的.class文件的二进制数据读入到内存中,将其放在运行时数据区的方法区中,然后在内存中创建一个java.lang.Class对象用来封装类在方法区内的数据。(规范并未规定Class对象放在哪里,hotspot将Class对象放在方法区中)

Java类加载的时机

加载 -> 连接 -> 初始化 -> 使用 -> 卸载 其中 连接又分为 “验证 -> 准备 -> 解析”三个阶段

符号引用:

直接引用:

主动使用:会对类进行初始化

1.创建类的实例

2.访问某个类或接口的静态变量,或者对该静态变量赋值

3.调用类的静态方法

4.反射

5.初始化一个类的子类

6.Java虚拟机启动时被标记为启动类的类(Java Test)

7.JDK1.7开始提供的动态语言支持 java.lang.invoke.MethodHandle实例的解析结果REF_getStatic,REF_putStatic,REF_invokeStatic句柄对应的类没有初始化,则初始化。

若常量在编译阶段可以确定会将其存入到调用这个常量的方法所在的类的常量池中,因此调用这个常量不会出发常量所在类的初始化。

若常量在编译阶段不确定其值不会放到常量池中,程序运行时会主动使用这个常量所在类,导致初始化。

对于数组实例,其类型为JVM在运行中动态生成的,表示为[Lcom.xxx.abc这种形式。动态生成的类型,其父类型就是Object。对于数组来说,JavaDoc经常将构成数组的元素为Component,实际上就是将数组降低一个维度后的类型。

Java类加载步骤

虚拟机参数

-XX:+TraceClassLoading 追踪类的加载信息并打印

折腾了几天的minikube几天终于把dashboard跑起来了😖😖,Google Bing GitHub上各种搜最后却通过更换了个老版本1.5.0搞定😅,由于我国特有网络问题,安装文件下载起来也显的异常艰难,用的移动宽带GitHub下载简直比蜗牛还慢🤦‍♂️

在此记录下这糟心的安装过程吧

​ 首先找了个梯子参照着官方文档中的步骤一步步安装,kuberctl和minikube安装顺利完成。由于我使用的VirtualBox的虚拟机在虚拟机中跑minikube,在启动minikube时需要使用minikube start --vm-driver=none大致意思是说使用该参数启动会使kubernetes组件运行在当前主机上而不是虚拟机中。

​ 至此一切都还算顺利,然后就想着看看dashboard长啥样,结果当启动dashboard的时候问题就来了,每次运行minikube dashboard都会报下面的503错误。

1
http://127.0.0.1:43249/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/%20is%20not%20accessible:%20Temporary%20Error:%20unexpected%20response%20code:%20503](http://127.0.0.1:43249/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ is not accessible: Temporary Error: unexpected response code: 503)

在一番搜索后并没有找到一个有效的解决方案,有的说要运行 minikube delete 删除~/.kube ~/.minikube文件夹再重新运行一遍minikube start,有的说通过kubectl proxy直接访问dashboard页面。经过这一番操作后得到的结果依旧是503。

​ 另外在搜索过程中发现在国内可以使用阿里的容器仓库下载会快很多,可参考这篇文章,文中介绍在启动参数后加上 minikube start --vm-driver=none --image-mirror-country cn默认将使用*registry.cn-hangzhou.aliyuncs.com/google_containers *作为安装Kubernetes的容器镜像仓库。

相关配置参数如下

  • --image-mirror-country cn 将缺省利用 registry.cn-hangzhou.aliyuncs.com/google_containers 作为安装Kubernetes的容器镜像仓库,
  • --iso-url=*** 利用阿里云的镜像地址下载相应的 .iso 文件
  • --cpus=2: 为minikube虚拟机分配CPU核数
  • --memory=2000mb: 为minikube虚拟机分配内存数
  • --kubernetes-version=***: minikube 虚拟机将使用的 kubernetes 版本

​ 但是就在今天中午的机缘巧合下,突然冒出了换个版本试试的想法,尝试了v1.4.0 、v1.5.1 、v1.5.0最终在1.5.0上终于不出现503,一脸懵逼的好了,不知道具体啥原因它就是好了😡😡。终归应该还是自己不够熟悉kubenetes的原因导致一个这个问题搞了这么久,但是也终于可以安下心来继续后续的学习了。

高可用集群数量最好大于等于3的奇数

Pod:k8s基础单元 内部包含多个容器

##K8S整体组成部分:

kubelet 直接和容器引擎交互 控制容器生命周期

kube-proxy 负责写入规则至iptables,IPVS实现服务映射访问

APIServer:所有服务访问的统一入口

ControllerManager 维持副本期望数目

Scheduler:负责接受任务,选择合适结点进行分配任务

ETCD:键值对数据库,存储K8S集群所有重要信息(持久化)

COREDNS:为集群中的SVC创建一个域名IP的对应关系解析

DASHBOAD:给K8S提供B/S访问

INGRESS CONTROLLER 实现七层代理

FEDERATION: 提供一个可以跨集群中心多K8S统一管理功能

PROMETHEUS: 提供K8S集群监控能力

ELK:提供K8S集群日志统一分析接入平台

##POD概念

基础容器pause,同一个pod中容器之间的端口不能冲突,

POD中容器共享存储和网络

ReplicationController 、ReplicaSet 、Deployment

新版本中RS取代RC RS支持集合式的selector

Deployment自动管理RS

Serverless 无服务器程序 不需要一个进程持续运行,需要时才调用

类信息存在方法区

链表的特点

链表由指针和节点组成,链表的种类有很多,比较常见的有单链表、双向链表、循环链表等。链表与数组不同,链表在内存中的存储占用零散的非连续的内存块,而数组则是连续的内存块空间。链表通过指针把分散在内存中的结点连接起来。 当想要查找链表中的某一个结点数据时需要从头开始查找直到找到目标数据位置,因此链表随机访问的时间复杂度为O(n)。

阅读全文 »

最近在折腾Hexo写博客,然鹅发现自2015年第一次玩之后MarkDown已经不会用了,因此在此记录下Markdown的一些用已做备用。

标题

使用#来表示标题,共六级:

  • “#” 一级标题
  • “##” 二级标题
  • “###” 三级标题

代码块

使用三个“ ` ”符号(键盘上~键)或一个制表符(使用了下感觉不是很好使)来表示一个代码块

1
这是一个代码块

图片

使用下面的方式来表示图片,不过不支持设置图片的宽高,设置宽高可使用<img>标签搞定

1
2
![Alt text](/path/to/img.jpg)
![Alt text](/path/to/img.jpg "Optional title")

表格

使用下面方式来创建一个表格

1
2
3
| 列名 | 内容 |
| - | - |
| abc | abcdef |