Redis-6-原理篇-Redis数据结构
SDS
Why SDS
字符串是Redis中最常用的一种数据结构。不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题:
获取字符串长度的需要通过运算
非二进制安全
不可修改
SDS
Redis构建了一种新的字符串结构,称为简单动态字符串(Simple Dynamic String),简称SDS。
Redis是C语言实现的,其中SDS是一个结构体,源码如下:
SDS底层结构
例如,一个包含字符串“name”的sds结构如下:
SDS之所以叫做动态字符串,是因为它具备动态扩容的能力,例如一个内容为“hi”的SDS:
假如我们要给SDS追加一段字符串“,Amy”,这里首先会申请新内存空间:
如果新字符串小于1M,则新空间为扩展后字符串长度的两倍+1;
如果新字符串大于1M,则新空间为扩展后字符串长度+1M+1。称为内存预分配。
SDS优点
获取字符串长度时间复杂度 $O(1)$
支持动态 扩容
减少内存分配次数
二进制安全
intsetIntSet是Redis中set集合的一种实现方式,基于整数数组来实现,并且具备长度可变、有序等特 ...
JVM 内存与垃圾回收篇-3-运行时数据区
运行时数据区
内存是非常重要的系统资源,是硬盘和CPU 的中间仓库及桥梁承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。结合JVM虚拟机规范,来探讨一下经典的JVM内存布局。
Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。
灰色的为单独线程私有的,红色的为多个线程共享的。即:
每个线:独立包括程序计数器、栈、本地栈。
线程间共享:堆、堆外内存(永久代或元空间、代码缓存)
程序计数器
PC寄存器用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令。
它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。
在JVM规范中,每个线程都有它自己的程序计数器,是线程私有的,生命周期与线程的生命周期保持一致。
任何时间一个线程都只有一个方法在执行(当 ...
JVM 内存与垃圾回收篇-2-类加载子系统
内存结构
JVM 架构简图
类加载器
类加载子系统作用
类加载器子系统负责从文件系统或者网络中加载class文件,clap文件在文件开头有特定的文件标识
ClassLoader只负责class文件的加载,至于它是否可以运行,则由ExecutionEngine决定
加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是class文件中常量池部分的内存映射)
类加载器ClassLoader角色
class file 存在于本地硬盘上,而最终这个模板在执行的时候是要加载到JVM当中来根据这个文件实例化出n个一模一样的实例。
class file 加载到JVM中,被称为DNA元数据模板,放在方法区。
在.class文件-> JVM ->最终成为元数据模板,此过程就要一个运输工具(类装载器 class Loader)
类加载过程
Loading
通过一个类的全限定名获取定义此类的二进制字节流
将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
...
JVM 内存与垃圾回收篇-1-JVM与Java体系结构
虚拟机和JVM
虚拟机
虚拟机(Virtual Machine),就是一台虚拟的计算机,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。
Java虚拟机
JVM是一台执行字节码的虚拟机,拥有独立的运行机制,JVM平台的各种语言都可以共享Java虚拟机带来的跨平台性、优秀的垃圾回收器,以及可靠的即时编译器
Java虚拟机是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在哪里。
一次编译,到处运行
自动内存管理
自动垃圾回收
JVM位置JVM是运行在操作系统上,与硬件没有直接交互
JVM整体结构
Java代码执行流程
JVM的架构模型Java编译器输入的指令流基本上是一种基于栈的指令集架构,另外一种指令集架构则是基于寄存器的指令集架构。
基于栈式架构的特点
设计和实现更简单,适用于资源受限的系统
避开了寄存器的分配难题:使用零地址指令方式分配
指令流中的指令大部分是零地址指令,其执行过程依赖于操作栈。指令集更小,编 ...
数据结构-6-前缀树
问题引入一个字符串类型的数组arr1,另一个字符串类型的数组arr2,arr2中有哪些字符,是arr1中出现的?请打印。arr2中有哪些字符,是作为arr1中某个字符串前缀出现的?请打印。arr2中有哪些字符,是作为arr1中某个字符前缀出现的?请打印arr2中出现次数最大的前缀。
前缀树
前缀树介绍
这棵Trie树包含的字符串集合是{in, inn, int, tea, ten, to}。每个节点的编号是我们为了描述方便加上去的。树中的每一条边上都标识有一个字符。
比如上图中3号节点对应的路径0123上的字符串是inn,8号节点对应的路径0568上的字符串是ten。终结点与集合中的字符串是一一对应的。
前缀树操作
Trie树的创建是从只有根节点开始,通过依次将W1, W2, W3, … WN插入Trie中实现的Trie一般支持两个操作:
Trie.insert(W):第一个操作是插入操作,就是将一个字符串W加入到集合中。
Trie.search(S):第二个操作是查询操作,就是查询一个字符串S是不是在集合中。
插入操作原理
插入字符串in。 ...
MySQL高级篇-3-用户与权限管理
用户管理登录MySQL服务器123mysql –h hostname|hostIP –P port –u username –p DatabaseName –e "SQL语句"mysql -uroot -p -hlocalhost -P3306 mysql -e "select host,user from user"
参数
说明
-h
后面接主机名或者主机IP,hostname为主机,hostIP为主机IP
-P
后面接MySQL服务的端口,通过该参数连接到指定的端口。MySQL服务的默认端口是3306, 不使用该参数时自动连接到3306端口,port为连接的端口号。
-u
后面接用户名,username为用户名
-p
会提示输入密码
DatabaseName
指明登录到哪一个数据库中。如果没有该参数,就会直接登录到MySQL数据库 中,然后可以使用USE命令来选择数据库
-e
后面可以直接加SQL语句。登录MySQL服务器以后即可执行这个SQL语句,然后退出MySQL 服务器
创建用户
语法
1C ...










