Redis数据持久化机制
本文参考文章
1.数据库结构一个单机Redis服务器默认有16个数据库,这个数量是可以配置的,每个数据库都由一个redis.h和redisDB表示,记录了键空间、键过期时间、阻塞状态等
2 RDB持久化RDB持久化(快照持久化)将内存中的数据生成快照保存到磁盘里面,文件后缀是.rdb,是一个经过压缩的二进制文件,Redis重启的时候读取快照文件恢复数据
这是一个单文件全量数据,适合数据库的容灾备份,1G的快照文件载入内存的时间大概是20s
2.1 RDB的创建和载入2.1.1 手动保存
SAVE命令:是一个同步式命令,它会阻塞Redis服务器进程,直到RDB文件创建完成为止,期间服务器不能处理任何其他命令请求
BGSAVE:异步命令,开启一个子进程来创建RDB文件,父进程继续处理客户命令
2.1.2 自动保存满足一些条件的时候会自动触发BGSAVE方式进行保存(以下三个条件中的一个)
服务器在 900 秒之内,对数据库进行了至少 1 次修改。
服务器在 300 秒之内,对数据库进行了至少 10 次修改。
服务器在 60 秒之内,对数据库进行了至少 10000 次修改。
Redis ...
InnoDB -- InnoDB-存储引擎
[toc]
存储引擎体系架构上图为InnoDB存储引擎的架构,下面会对各个模块进行拆解
1.1 后台线程
master Thread:负责将缓冲池中的数据异步的刷新到磁盘上,维护数据一致性
IO Thread:进行异步IO管理线程
Purge Thread:负责对undo页进行回收,在InnoDB1.0版本之前这个工作是放到master线程上进行处理的
Page Cleaner Thread:负责处理脏页的刷新工作
1.2 内存
1.2.1 缓冲池
本质就是一个缓存机制,帮助解决磁盘和CPU之间读写速度差距过大的问题,我们来具体看看InnoDB的缓存机制是怎么样的
大体的流程是通用的,CPU只面向内存进行读写,数据需要先加载到缓冲池中,如果数据页已经在缓冲池中那就可以直接使用这个叫做缓冲池命中,而缓冲池和磁盘的同步并不是每次页数据发生更改就会进行同步,而是依赖一种叫Checkpoint的机制
所以我们可以看出缓冲池的大小是很大程度上决定了数据库处理速度的,我测试了一下我个人的服务器上这个缓冲池的大小是一个G
从InnoDB1.0开始就允许存在多个缓冲池,
1.2.2 缓冲池管理上面 ...
InnoDB -- InnoDB-文件
[toc]
文件参数文件这个可以直接视作配置文件,mysql通过这些参数来确定各类型文件的位置,以及设置一些内存分配和策略
123<!--通过这个命令可以看到具体的配置加载顺序-->mysql --help | grep my.cnf输出:/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
什么是参数键值对
参数类型分为动态和静态,就是有些参数可以在数据库启动后修改仍然生效,有的必须预先设置才会生效
动态修改的时候分为global和session,字面意思
日志文件错误日志记录了启动、运行和关闭过程中的异常,遇到问题时查看这个日志可以进行问题定位
慢查询日志12345678<!--查看是否开启慢查询-->show variables like 'slow_query_log'<!--查看慢查询阈值-->show variables like 'long_query_time'<!--查看当前日志记录的方式-->sh ...
InnoDB -- InnoDB-索引
[toc]
索引与算法存储索引概述InnoDB支持的几种索引:B+树(不是二叉binary,是balance)、全文、hash
B+数这个后面展开讲,hash是自适应的不受人为的干涉,全文这里也没讲是啥
数据结构和算法这里就是简单的介绍一下相关的算法和结构
二分查找需要数据本身就排好序的,折半查找
二叉查找树和平衡二叉树二叉查找树就一个左小右大的二叉树,不要求平衡,性能不是很高
平衡二叉树就是平衡的二叉查找树,平衡二叉树的查询性能是比较高的,最高的是最优二叉树,但这个东西构建和维护的开销大,一般只需要建立一个平衡二叉树
B+树
这个图可以很好的说明B+树的基础机构
插入操作这里就简单说一下
如果叶子节点和它的父节点都没满的话,就直接插入,这个时候最理想
如果叶子节点满了但是它的父节点还没满的话,那就分裂子节点把子节点的中间值放到父节点去
如果叶子节点和它的父节点都满了的话,就要先分裂子节点,再分裂父节点
另外如果叶子节点满了,但是做兄弟节点没满的话不会直接做分裂,左兄弟会检查做旋转操作来节省开销
删除操作它这里给每个节点设置最少也有有一半的数据,如果低于了一半那就需要做节点的合并, ...
InnoDB -- InnoDB-表
[toc]
表组织索引表InnoDB中表都是根据主键顺序组织存放的,叫做索引组织表,InnoDB中每张表中都要有一个主键,如果没有显式的创建主键,会自行选择或者创建主键
判断表中是否存在为空唯一的索引,有就让该列成为主键(多个索引时已第一个符合条件的索引为主键)
如果没有则自动创建一个6字节大小的指针(==不知道这个自动创建的指针的并发分配是怎么样的==)
==这里提到了两个键同一起作为主键可以查看一下==
InnoDB逻辑存储结构
解释一下上面这个图,Tablespace就不说了,Segment(段)就索引的叶子节点,Extent(区)一个段由多个区组成,一个区由多个Page组成,page中存储着Row行数据,下面展开说一下
Tablespace这个东西之前说过了,可以是放到共享的,也可以是每个表独立的,注意每个表独立的时候,其实独立存储的数据是表内行数据、索引和插入缓冲Bitmap页,其他类的数据(回滚undo、插入缓冲索引页、系统事务信息、二次写double write buffer等)还是放到共享空间中的,所以有的情况下共享空间还是会不断的增长
段 segment常见的段有 ...
python -- supervisor进程管理
简述supervisor本身就是由Python编写的,是一个很方便的进程管理工具;搭建教程产考
使用安装1pip3 install supervisor
搭建项目结构
在项目的根目录下创建一个文件夹supervisor来保存有关的文件
在supervisor文件夹下创建子文件夹configs,用来保存每个进程对应的配置文件
在项目中创建log文件夹来保存日志文件(如果有了就不用创建了)
在supervisor文件夹中创建supervisor.conf来保存主配置信息
配置文件(主)这里为了方便写入笔记,将所有的注释都删除了,其实还有很多的配置
123456789101112131415161718192021222324252627[unix_http_server]file=%(here)s/supervisor.sock ; the path to the socket filechmod=0700 ; socket file mode (default 0700)[supervisord]logfile=%(here)s/. ...
python -- virtualenv使用说明
一、virtualenv简介在linux上通常账户都没有root权限安装python库会受到限制,而且python的库五花八门每个项目的依赖都不同导致安装的库混乱,通过virtualenv可以在项目里面隔离出一个虚拟的python环境,这样只要对项目有权限就能自由的安装python库
python2解决方案pip在2021年放弃了对python2的维护,所以pip2不能正常使用了,但是pip还是指向了2并且可以使用
python -m pip install --user virtualenv
python -m virtualenv venv
新的解决方案Python3 在某一个版本中内置了venv,较低版本的Python3也需要安装该模块才能使用
python3 -m venv venv
使用
为项目搭建一个虚拟环境
python3 -m venv venv
进入虚拟环境
12345# 切换到项目目录下,上一步应该生成了一个venv目录,执行source venv/bin/activate# 检查目前的python驱动位置which python/Users/lu ...
python -- 代码风格
[TOC]
前言这里只是介绍Python代码的一些变量、函数命名和一些约定俗成的风格,目的是提高代码的可读性,这些风格规范不一定是Python的语法规范
一、解释器和编码可执行的Python脚本在很多的Python文件中能看到第一行有以下格式的语句
1#!/usr/bin/env python3.5
原因是在一些Unix系统上Python是可以像shell一样被直接执行的,这个语句是指定了Python解释器的版本,为了不和2.x版本冲突
指定编码在指定解释器版本后,是指定编码
1# -*- coding: utf-8 -*-
在Python3之后默认编码为utf-8,所以如果不是要指定为别的像上面的encoding的编码之类的话就不用写这个语句了
二、占位符和pass语句“_“下划线作为占位符for _ in range(10):
print("I'm sorry!")
在上面的案例中for循环在语法上需要一个循环的索引,但程序的逻辑中并不需要用到它,这个时候如果放一个i变量在这的话,vscode这样的编译器会提示你定义了一个参数但没有使用,这 ...
python -- 代码调试
breakpoint大概是python3.8版本引入了breakpoint()函数,用来替换pdb,功能非常接近,之前的pdb需要两句代码进行引入使用
PDB加入调试点直接在代码里面加上这两个语句,程序会在set_trace()方法这里停下来
import pdb
pdb.set_trace()
pdb常用命令1234567891011# 列出目前代码运行位置list # 执行下一句n# 退出quit或者q# 打印变量p 变量名# 动态改变值直接赋值即可
前端 -- vue cli 环境搭建
linux基本开发环境zsh命令行
zsh安装教程
vue+iview环境整体流程
安装Python、pip
安装Django框架,创建一个Django项目
安装nodejs
安装cnpm,用cnpm安装vue-cil:sudo cnpm install vue-cli -g
安装git
切换到Django项目根目录:vue-init webpack <前端项目名>
cd到前端项目cnpm install 然后cnpm run dev这时可以浏览器里面访问到vue项目了1234#启动服务并在后台运行cnpm run dev &#ssh退出后服务保持继续执行nohup cnpm run dev &
配置Django项目的文件,教程
运行 python manage.py runserver就可以在浏览器中访问了1.前端vue
这东西好像是不需要安装,直接在js文件中引入就可以了
npm install vue
安装cnpm:npm install -g cnpm –registry=https://registry.npm.taobao.org
ivie ...