2021年10月

UTF-8作为一种可变长度的字符编码,他是如何知道一个字符到底需要几个字节表示呢?他是如何这么智能和聪明的?

比如一个中文字符,在UTF-8编码中,可能需要占据三个字节的长度,而一个英文字符仅仅需要占据一个字节的长度。他们是如何协作,才得以保证不会输出乱码呢?

这一切,就要从UTF-8的规定说起了,有了这个规则,就能保证字符总是可以正确显示了。

  1. 如果一个字符只需要一个字节即可表示,那这个字节的二进制必须以0开始,如:0xxxxxxx
  2. 如果一个字符需要两个字节才能表示,那么这个字符的第一个字节(高位字节),需要以110开头,第二个字节(低位字节)需要以10开头,如:110xxxxx 10xxxxxx
  3. 如果一个字符需要三个字节才能表示,那么这个字符的高位字节,需要以1110开头,其余后面的两个低位字节已10开头,如:1110xxxx 10xxxxxx 10xxxxxx

聪明如你,一定从上面的123中发现了某种不可告人的秘密规律。假如现在是一个汉字,那么需要用三个字节表示,其中有8位已经是固定的了,还有16位是可用的。虽然是用三个字节表示,但是有效位只有16位,有效位还是占两个字节。

Maven是什么?Maven是java语言开发的,主要用于项目管理。他能干什么?他的功能有很多,但是通常而言,我们最尝使用他的两个功能:项目构建 和 依赖管理。

POM是什么?全称Project Object Model,项目对象模型。Maven将一个项目的开发以及管理抽象出一个对象模型,简称POM。不论你是要开发、测试、打包、部署…… 在这个模型里都有对应的方法。

pom.xml又是什么?这个文件就是POM对象模型的具体实现。如,最基本的配置,描述自己的项目:

    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <groupId>com.wlmqtc..www</groupId>
        <artifactId>maven</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </project>

其中:groupId 是组织代号,一般是URL反写,artifactId 是项目的名称,version 是项目的版本。

以上三个元素是一个pom.xml文件中最基本的元素,也是必须要有的。

什么是JdbcTemplate?他由Spring框架提供。了解JdbcTemplate 需要分为两个部分:JDBC 和 Template

  • JDBC 全拼 Java DataBase Connection,是一个使用java语言访问数据库的技术
  • Template 中文译作:模板。

何为模板?模板由两部分组成,一部分是固定的,一部分是可变的。如:做饭。固定的是:开火,关火。可变的是:放入青菜,还是肉,是爆炒,还是清蒸…… 反正不论如何,做饭就要开火、关火。我们很烦这个,开火、关火这个事情能不能智能自动化呢?

JdbcTemplate 就类似于做饭,而且他帮我们把开火,关火自动化了,再也不用程序员厨子关心了,程序员转行的厨子,上来就是甩锅炒鱿鱼……

JDBC暗黑时代

没有JdbcTemplate的时候,我们要执行一个SQL,得经过好几个一模一样的步骤

  1. 初始化驱动
    Class.forName("com.mysql.jdbc.Driver");
  2. 与数据库建立连接关系,获取Connection对象
    Connection conn = DriverManager.getConnection("jdbc:mysql:///dbname","root", "root");
  3. 创建Statement 对象
    Statement st = c.createStatement();
  4. 执行sql语句
    String sql="insert into user values(null,'rose')";st.execute(sql);
  5. 关闭资源
    st.close();

conn.close();
**以上那么多废物操作步骤,其实我们只关心第四步:执行sql语句

JdbcTemplate 的光明

有了JdbcTemplate,执行一个操作只需三步

  1. 获取JdbcTemplate对象
    JdbcTemplate jt = new JdbcTemplate(dataSource);
  2. 准备sql语句
    String sql="insert into user values(null,?)"
  3. 执行sql
    jt.update(sql,"rose")

持久化是做什么的?持久化的目的是将内存中的数据写入到磁盘中。

为什么需要持久化?因为内存中的数据是临时的,如果遇到服务器宕机或者断电,那么内存中的数据就彻底不见了。

什么宕机?宕机也叫死机,是指系统发生了不可恢复的错误。如常见的WINDOWS系统蓝屏。

RDB 与 AOF 全称

RDB Redis DataBase
AOF Append Only File

RDB 与 AOF 两种技术的区别

RDB又称快照模式(snapshot),在某个时间点,将内存中在所有redis数据以二进制形式保存到磁盘中,是一种全量模式
AOF又称追加模式,他是将Redis服务器所执行的命令,以追加的方式写入到文本文件中

RDB 自动触发策略

在配置文件redis.conf中,按照以下格式插入三条数据

save M N

以上格式代表,在 M 秒内,如果Redis数据发生了 N 次变化,则执行BGSAVE命令

save 900 1 # 900内,如果数据发生1次变化,则执行BGSAVE进行RDB
save 300 10
save 60 10000

为何是三条,为啥不能是五条、十条?因为Redis规定,最多可以同时配置三条

AOF 配置策略

在配置文件redis.conf中,开始AOF

#把no改为 yes
appendonly yes
#

在配置文件中,三种策略任选其一

#同步策略,只要redis数据发生变化,就开始AOF,性能差
appendfsync always

#每秒同步,每秒钟,AOF一次(推荐配置,兼顾了性能和数据的完整性)
appendfsync everysec

#非主动同步,操作系统决定何时AOF,脱离了程序员管控,充满了不确定因素(如,服务器断电了,Redis服务挂掉了)
appendfsync no

其他总结

RDB 以二进制保存,体积小,所以恢复数据速度快,但是容易大片数据
AOF 以文本形式保存,体积大,数据恢复速度相对慢,但是数据安全性相对更好

我们现代人看地图是:上北下南,左西右东;八卦定方位则是:上南下北,左东右西。不论怎么讲都符合一个规律,即:面向东方,左手所在的方位是北方。

乾 ☰ 为天,天在上,上南
坤 ☷ 为地,地在下,下北
离 ☲ 为日,日出东方,左东
坎 ☵ 为月,日落月出,右西
震 ☳ 为雷,其位东北
巽 ☴ 为风,其位西南
艮 ☶ 为山,其位西北
兑 ☱ 为泽,其位东南


八卦速记口诀

乾三连,坤六断
震仰盂,艮覆碗
离中虚,坎中江
况上缺,巽下断