- 博客(34)
- 收藏
- 关注
原创 手写SpringMVC框架(简易版)
SpringMVC简介SpringMVC是当前最优秀的MVC框架,自从Spring 2.5版本发布后,由于支持注解配置,易用性有了大幅度的提高。Spring 3.0更加完善,实现了对Struts 2的超越。现在越来越多的开发团队选择了Spring MVC。 - Spring为展现层提供的基于MVC设计理念的优秀的Web框架,是目前最主流的MVC框架之一 - Spring3.0后全面超越St...
2018-06-22 00:39:02 10499 16
原创 ZooKeeper笔记(2):ZooKeeper系统模型
1.数据模型(1)树形结构ZooKeeper的视图结构和标准的Unix文件系统非常类似,但没有引入传统文件系统中的目录和文件等概念,而是使用了数据节点ZNode。ZNode是ZooKeeper中数据的最小单元,每个ZNoe上都可以保在数据,同时还可挂载子节点,构成了一个层次化的命名空间,称之为树。ZNode的节点路径标识方式和Unix文件系统路径非常相似,都是由一系列使用斜杠(/)进行分割的路径表示,开发人员可以向这个节点中写入数据,也可以在节点下面创建子节点。(2)事务ID在ZooKeeper中
2020-11-18 23:36:43 373
原创 ZooKeeper笔记(1):ZooKeeper特性与基本概念
1、Zookeeper简介Zookeeper是一个典型的分布式数据一致性的解决方案,提一供了诸如统一命名服务、配置管理和分布式锁等分布式的基础服务。Zookeeper的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。随着分布式架构的出现,越来越多的分布式应用会面临数据一致性问题。除ZooKeeper之外,目前还没有一个成熟稳定且被大规模应用的解决方案,ZooKeeper无论从性能、易用性、稳定性上来说都已经达到了一个工业级产品的
2020-11-18 23:35:19 666
原创 Docker笔记(10):Docker安全防护与配置
Docker是基于 Linux操作系统实现的应用虚拟化。运行在容器内的进程,与运行在本地系统中的进程在本质上并无区别,因此,配置的安全策略不合适将可能给本地系统带来安全风险。Docker的安全性在生产环境中是十分关键的衡量因素。Docker容器的安全性,在很大程度上依赖于 Linux系统自身。目前,在评估 Docker的安全性时,主要考虑下面几个方面:Linux内核的命名空间机制提供的容器隔离安全;Linux控制组机制对容器资源的控制能力安全;Linux内核的能力机制所带来的操作权限安全;Dock
2020-11-17 16:56:59 427
原创 Docker笔记(9):容器的资源分配
1.内存分配内存限额与操作系统类似,容器可使用的内存包括两部分:物理内存和swap。Docker通过下面两组参数来控制容器内存的使用量。(1)-m或-memory:设置内存的使用限额,例如100MB,2GB。(2)-memory-swap:设置内存+swap的使用限额。默认情况下对容器内存和swap的使用没有限制。如果在启动容器时只指定-m而不指定–memory-swap,那么–memory-swap默认为-m的两倍。当我们执行如下命令:docker run -m 200M --memory-s
2020-11-17 16:56:28 1481
原创 Docker笔记(8):Docker网络
1.docker网络原理在安装 Docker时,会创建一个新的网络接口docker0,docker0是一个虚拟的以太网桥,用于连接容器和本地宿主网络。通过命令查看目前 Docker宿主机上这个网络接口的信息。ip a show docker0docker0接口有符合RFC1918规范的私有IP地址,范围是172.16~172.30。接口本身的地址172.17.0.1,是这个Docker网络的网关地址,也是所有 Docker容器的网关地址。Docker会默认使用172.17.x.x作为子网地址,如果
2020-11-16 10:18:08 391
原创 Docker笔记(7):Docker 存储
Docker为容器提供了两种存放数据的资源:(1)由storage driver管理的镜像层和容器层。(2)Data Volume。1.storage driver镜像的分层结构使镜像和容器的创建、共享以及分发变得非常高效,而这些都要归功于Docker storage driver。正是storage driver实现了多层数据的堆叠,并为用户提供一个单一的合并之后的统一视图。Docker支持多种storage driver,有AUFS、Device Mapper、Btfs、OverlayS、VFs
2020-11-16 10:17:50 164
原创 Docker笔记(6):镜像
本地镜像都保存在 Docker宿主机的/var/lib/docker目录下。1.镜像的分层结构(1)分层结构Docker镜像是由文件系统叠加而成,最底端是一个引导文件系统bootfs,这很像典型的 Linux/Unix的引导文件系统,Docker用户几乎永远不会和引导文件系统有什么交互。实际上,当容器启动后,引导文件系统则会被卸载,以留出更多的内存供initrd磁盘镜像使用。Docker镜像的第二层是root文件系统rootfs,它位于引导文件系统之上。rootfs可以是一种或多种操作系统(如 Deb
2020-11-16 10:17:38 661
原创 Docker笔记(5):Docker底层依赖的核心技术
1. 基础架构Docker采用了标准的C/S架构,包括客户端和服务端两大部分,同时通过镜像仓库来存储镜像,架构如下图。客户端和服务端既可以运行在一个机器上,也可通过 socket或者 RESTful API来进行通信。(1)服务端Docker服务端一般在宿主机后台运行,dockerd组件作为服务端接受来自客户的请求,并通过 containerd组件处理这些请求(创建、运行、分发容器)。服务端主要包括四个组件:dockerd:为客户端提供RESTful API ,响应来自客户端的请求,采用模块化的
2020-11-16 10:17:25 947
原创 Docker笔记(4):容器技术生态
围绕Docker有一个生态系统,Docker是这个生态系统的基石,完善的生态系统才是保障 Docker以及容器技术能够真正健康发展的决定因素,容器生态系统包含核心技术、平台技术和支持技术。1.容器核心技术容器核心技术是指能够让Container在主机上运行起来的那些技术,包括容器规范、容器runtime、容器管理工具、容器定义工具、Registry、容器OS等。(1)容器规范容器不止有Docker,还有其他容器,比如Cores的rkt。为了保证容器生态的健康发展,保证不同容器之间能够兼容,Docke
2020-11-16 10:17:12 191
原创 Docker笔记(3):Dockerfile
1.什么是DockerfileDockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。Dockerfile的作用包括:1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了; 3、对于运维人员:在部署时,可以实现应用的无缝移植。2.Dockerfile基本结构Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。一般的,Dock
2020-11-16 10:16:55 279
原创 Docker笔记(2):Docker的基本使用与配置
1、镜像、容器的相关命令1.镜像相关命令(1)镜像查找docker search NAME(2)镜像拉取用docker run命令从镜像启动一个容器时,如果该镜像不在本地,Docker会先从Docker hub下载该镜像。Registry默认为registry.hub.docker.com,TAG默认为latest。docker pull [Registry]/NAME:TAGdocker pull ubuntu:16.04(3)镜像信息查看# 查看已经拉取的镜像,存储在宿主机的/va
2020-11-16 10:16:36 143
原创 Docker笔记(1):Docker简介与安装
1、Docker简介1.虚拟化技术简介虚拟化(Virtualization)技术是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份不受现有资源的架设方式,地域或物理组态所限制,一般所指的虚拟化资源包括计算能力和资料存储。在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利
2020-11-16 10:16:22 112
原创 Redis笔记(14):AOF持久化
除了RDB持久化功能之外,Redis还提供了AOF(Append Only File)持久化功能。与RDB持久化通过保存数据库中的键值对来记录数据库状态不同,AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。被写入AOF文件的所有命令都是以Redis的命令请求协议格式保存的,因为Redis的命令请求协议是纯文本格式的。在这个AOF文件里面,除了用于指定数据库的SELECT命令是服务器自动添加的之外,其他都是我们之前通过客户端发送的命令。服务器在启动时,如果开启了AOF功能,可以通过载
2020-11-16 10:15:56 81
原创 Redis笔记(13):RDB持久化
Redis是内存数据库,它将自己的数据库状态储存在内存里面,一旦服务器进程退出,服务器中的数据库状态也会消失不见。为了解决这个问题,Redis提供了RDB持久化功能,将Redis在内存中的数据库状态保存到磁盘里面,避免数据意外丢失。RDB持久化既可以手动执行,也可以根据服务器配置选项定期执行。RDB持久化功能所生成的RDB文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时的数据库状态。1.RDB文件的创建与载入(1)创建RDB文件SAVE、BGSAVE可以用于生成RDB文件,SAVE命
2020-11-16 10:15:36 113
原创 Redis笔记(12):服务端实现
Redis服务器负责与多个客户端建立网络连接,处理客户端发送的命令请求,在数据库中保存客户端执行命令所产生的数据,并通过资源管理来维持服务器自身的运转。1.命令请求的执行过程(1)发送命令请求当用户在客户端中键入一个命令请求时,客户端会将这个命令请求转换成协议格式,然后通过连接到服务器的套接字,将协议格式的命令请求发送给服务器,过程如图所示。(2)读取命令请求当客户端与服务器之间的连接套接字因为客户端的写入而变得可读时,服务器将调用命令请求处理器来执行以下操作:1)读取套接字中协议格式的命令请
2020-11-15 12:37:23 154
原创 Redis笔记(11):客户端实现
Redis服务器是典型的一对多服务器程序,一个服务器可以与多个客户端建立网络连接,通过使用I/O多路复用技术实现的文件事件处理器,Redis服务器使用单线程的方式来处理命令请求,并与多个客户端进行网络通信。对于每个与服务器进行连接的客户端,服务器都为这些客户端建立redis.h/redisClient结构(客户端状态),保存了客户端当前的状态信息。Redis服务器状态结枃的clients属性是一个链表,这个链表保存了所有与服务器连接的客户端的状态结构,对客户端执行批量操作,或者査找某个指定的客户端,都可以
2020-11-15 12:35:03 227
原创 Redis笔记(10):事件
Redis服务器是一个事件驱动程序,服务器需要处理文件事件、时间事件两类事件。文件事件(file event): Redis服务器通过套接字与客户端(可以是其他Redis服务器)进行连接,文件事件就是服务器对套接字操作的抽象。服务器与客户端的通信会产生相应的文件事件,而服务器则通过监听并处理这些事件来完成一系列网络通信操作。时间事件(time event): Redis服务器中的一些操作(比如serverCron函数)需要在给定的时间点执行,而时间事件就是服务器对这类定时操作的抽象。1.文件事件Re
2020-11-15 12:33:42 172
原创 Redis笔记(9):Redis单机数据库的实现
1.数据库结构Redis服务器将所有数据都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个元素都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库,在初始化服务器时,程序会根据服务器状态的dbnum属性来决定应该创建多少个数据库。dbnum属性的值由服务器配置的database选项决定,默认为16。struct redisServer{ // 一个数组,保存着服务器中的 redisDb *db; // 服务器的数据
2020-11-15 12:31:59 121
原创 Redis笔记(4):字符串对象的结构与实现
1.字符串与SDS(1)字符串的实现方式Redis没有直接使用C语言的字符串表示(以空字符结尾的字符数组),而是自己构建了一种名为简单动态字符串(Simple Dynamic String,SDS)的抽象类型,并将SDS用作Redis的默认字符串实现,字符串的值最大不能超过512MB。。在Redis里面,C字符串只会作为字符串字面量用在一些无须对字符串值进行修改的地方,比如打印日志。当Redis需要的是一个可以被修改的字符串值时,Redis就会使用SDS来表示字符串值,比如在Redis的数据库里面,包
2020-11-15 12:28:17 116
原创 Redis笔记(5):列表对象的结构与实现
1.压缩列表压缩列表(ziplist)是列表键和哈希键的底层实现之一,当一个列表键只包含少量列表项,并且每个列表项要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做列表键的底层实现。当一个哈希键只包含少量键值对,并且每个键值对的键和值是小整数值或短字符串,那么Redis就会使用压缩列表来做哈希键的底层实现。(1)压缩列表的构成压缩列表是Redis为了节约内存而开发的,是一种由一系列特殊编码的连续内存块组成的顺序型数据结构。一个压缩列表可以包含任意多个节点(entry),每
2020-11-15 12:27:21 88
原创 Redis笔记(6):哈希对象的结构与实现
C语言并没有内置字典这种数据结构,因此Redis构建了自己的字典实现。Redis的哈希对象使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,而每个哈希表节点就保存了字典中的一个键值对。1.字典的结构(1)字典(dict)type属性和private属性是针对不同类型的键值对,为创建多态字典而设置的。type属性是一个指向dicType结构的指针,每个dicType结构保存了一簇用于操作特定类型键值对的函数,Redis会为用途不同的字典设置不同的类型特定函数。private属性则保存了需
2020-11-15 12:26:31 156
原创 Redis笔记(7):集合对象的结构与实现
1.整数集合整数集合(intset)是Redis用于保存整数值的集合抽象数据结构,它可以保存类型为int16_t、int32_t或者int64_t的整数值,并且保证集合中不会出现重复元素。整数集合的结构如下:encoding属性决定contents数组的具体类型。length属性记录了整数集合包含的元素数量,也即是contents数组的长度。contents数组是整数集合的底层实现,整数集合的每个元素都是contents数组的一个数组项,各个项在数组中按值的大小从小到大有序地排列,并且数组中不包
2020-11-15 12:25:23 88
原创 Redis笔记(8):有序集合对象的结构与实现
1.跳跃表跳跃表(skiplist)是一种有序数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问节点的目的。跳跃表支持**平均O(logN)、最坏O(N)**复杂度的节点查找,还可以通过顺序性操作来批量处理节点。在大部分情况下,跳跃表的效率可以和平衡树相媲美,并且因为跳跃表的实现比平衡树要来得更为简单,所以有不少程序都使用跳跃表来代替平衡树。跳表的查找:跳表的插入:先确定该元素要占据的层数K(由随机算法产生),然后在Level 1到Level K各个层的链表都插入元素。随机算
2020-11-15 12:24:15 277
原创 Redis笔记(2):Redis基础数据结构
Redis有5种基础数据结构,分别为:string(字符串)、list(列表)、set(集合)、hash(哈希)和zset(有序集合)。Redis所有的数据结构都是以唯一的key字符串作为名称,key的类型可以是整型、浮点型、字符串,然后通过这个唯一key值来获取相应的value数据。不同类型的数据结构的差异就在于value的结构不一样。1.string(字符串)字符串结构使用非常广泛,一个常见的用途就是缓存用户信息。我们将用户信息结构体使用JSON序列化成字符串,然后将序列化后的字符串塞进Redis来
2020-11-15 12:20:10 252
原创 Docker笔记(二):Docker原理
1、容器技术生态围绕Docker有一个生态系统,Docker是这个生态系统的基石,完善的生态系统才是保障 Docker以及容器技术能够真正健康发展的决定因素,容器生态系统包含核心技术、平台技术和支持技术。1.容器核心技术容器核心技术是指能够让Container在主机上运行起来的那些技术,包括容器规范、容器runtime、容器管理工具、容器定义工具、Registry、容器OS等。(1)容器规范容器不止有Docker,还有其他容器,比如Cores的rkt。为了保证容器生态的健康发展,保证不同容器之间能
2020-11-02 23:20:23 1113 2
原创 Docker笔记(一):Docker简介与使用
1、Docker简介1.虚拟化技术简介虚拟化(Virtualization)技术是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份不受现有资源的架设方式,地域或物理组态所限制,一般所指的虚拟化资源包括计算能力和资料存储。在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利
2020-10-18 11:20:59 326
原创 Redis笔记(3):Redis对象的结构与特性
1、Redis对象的结构与特性Redis基于SDS、双端链表、字典、压缩列表、整数集合等数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象,每种对象都用到了至少一种上述数据结构。通过这五种不同类型的对象,Redis可以在执行命令之前,根据对象的类型来判断一个对象是否可以执行给定的命令。使用对象的另一个好处是,可以针对不同的使用场景,为对象设置多种不同的数据结构实现,从而优化对象在不同场景下的使用效率。1.对象的结构Redis使用对象来表示数据
2020-10-17 14:40:37 132
原创 Redis笔记(1):Redis特性与安装
1、Redis简介Redis是互联网技术领域使用最为广泛的存储中间件,它是Remote Dictionary Service的首字母缩写,也就是远程字典服务,Redis使用C语言实现。Redis以其超高的性能、完美的文档、简洁易懂的源码和丰富的客户端库支持在开源中间件领域广受好评。
2020-10-13 10:10:59 117 1
原创 Hexo博客网站更换主题
前言: 上一篇博客介绍了如何从零开始搭建Hexo博客网站,Hexo网站默认加载的是landscape主题,如果想要更换自己喜欢的主题,可以继续阅读这一篇教程。本教程将讲述将landscape主题更换为扁平化、响应式设计Jacman主题。安装Jacman主题个人博客网站具有很强的展示性,一个炫酷的界面会很吸引人眼球,选择一个协调、美观的主题就很重要了。Hexo官方https://hexo.io/th...
2018-06-09 10:19:23 10350 1
原创 采用Hexo搭建静态博客网站
搭建博客网站的初衷序言:之前的博客是采用JPress搭建的,搭建过程很简单,可以参考上一篇博文:采用JPress搭建个人博客网站。由于JPress已经很久没有维护,用户群体较小,不便于交流。Hexo是一个静态网站,免去了动态网站需要安装或连接数据库的麻烦,备份或转移网站只需要拷走文件夹就可以了,且用户群体较大,主题也相当精美,因此,采用Hexo搭建博客网站是一个不错的选择。Hexo是一个基于nod...
2018-06-08 01:03:51 1210
原创 C++生成并调用dll
1、 创建一个Win32工程,工程名Generatedll,然后选择创建dll,如图:2、 工程自动生成的目录结构没有生成Generatedll.h文件,在头文件中添加Generatedll.h文件,并写好函数声明,如图:3、 在Generatedll.cpp文件中添加函数代码,不需要主函数,只写你需要动态调用的函数,如图:4、 建立模块定义文件Source.def,在此文
2017-03-22 21:51:12 1635
原创 C#中调用C++编写的Dll
本博文基于VS2013,实现了使用C#语言调用C++编写的DLL。并整理出C++函数的各项修饰参数extern ”C”、__declspec(dllexport)、__stdcall等,C#调用时需要引入的命名空间System.Runtime.InteropServices,DllImport的各项属性。
2017-03-16 18:58:11 3315
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人