Redis数据结构-压缩列表
压缩列表当一个列表键只包含少量列表项,并且每个列表项要么就是小整数,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做列表键的底层实现。
另外,当一个哈希键只包含少量键值对,比且每个键值对的键和值要么就是小整数值,要么就是长度比较短的字符串,那么Reids就会使用压缩列表来做哈希键的底层实现。
压缩列表的构成压缩列表是Redis为了节约内存而开发的,是由一系列特殊的编码的连续内存块组成的顺序型数据结构。一个压缩列表可以包含任意多个戒掉,每个节点可以保存一个字节数组或者一个整数值。
压缩列表的各个组成部分
压缩列表节点的构成每个压缩列表节点都由previous_entry_length、encoding、content三个部分组成
previous_entry_length节点的previous_entry_length属性以字节位单位,记录了压缩列表中前一个节点的长度。previous_entry_length属性的长度可以是字节或者5字节。
如果前一个节点的长度小于254字节,那么previous_entry_length属性的长度位1字节:前一个节点的长度就保存 ...
Redis数据结构-整数集合
整数集合当一个集合只包含整数值元素,并且这个集合的元素数量不多的时候,Redis就会使用整数集合张作伟集合键的底层实现
整数集合的实现12345678typedef struct intset { // 编码方式 uint32_t encoding; // 集合包含的元素数量 uint32_t length; // 保存元素的数组 int8_t contents[];} intset;
整数集合的每个元素都是contents数组的一个数组项。各个项在数组中按值的大小从小到大有序排列,并且不重复
length记录长度
虽然contents类型为int8_t,但实际上contents的真正类型有encoding属性来决定:
encoding为INTSET_ENC_INT16,那么contents就是一个int16_t类型的数组
encoding为INTSET_ENC_INT32,那么contents就是一个int32_t类型的数组
encoding为INTSET_ENC_INT64,那么contents就是一个int64_t类型的 ...
Redis数据结构-字典
字典字典,又称符号表(symbol table)、关联数组(associative array)或映射(map),是一种用于保存键值对(key-value pair)的抽象数据结构。
字典实现Redis的字典使用哈西表作为底层实现,一个哈希表里面可以由多个哈西表节点,而每个哈希表节点就保存了字典中的一个键值对
哈希表Redis字典所使用的哈希表由dict.h/dictht结构定义
12345678910111213141516/* * 哈希表 * * 每个字典都使用两个哈希表,从而实现渐进式 rehash 。 */typedef struct dictht { // 哈希表数组 dictEntry **table; // 哈希表大小 unsigned long size; // 哈希表大小掩码,用于计算索引值 // 总是等于 size - 1 unsigned long sizemask; // 该哈希表已有节点的数量 unsigned long used;} dictht;
table属性是一个数组 ...
Redis数据结构-链表
链表链表和链表节点的实现每个链表节点使用一个adlist.h/listNode结构来表示
1234567891011/* * 双端链表节点 */typedef struct listNode { // 前置节点 struct listNode *prev; // 后置节点 struct listNode *next; // 节点的值 void *value;} listNode;
多个listNode可以通过prev和next指针组成双端链表。
1234567891011121314151617/* * 双端链表结构 */typedef struct list { // 表头节点 listNode *head; // 表尾节点 listNode *tail; // 节点值复制函数 void *(*dup)(void *ptr); // 节点值释放函数 void (*free)(void *ptr); // 节点值对比函数 int (*match)(v ...
Redis数据结构-简单动态字符串(SDS)
简单动态字符串(SDS)简单动态字符串(simple dynamic string,SDS)作为Redis默认字符串表示。C字符串只会作为字符串常量(String literal)用在一些无需对字符串值进行修改的地方,如日志打印
包含字符串的键值对在底层都是由SDS实现的
如:
12redis> SET msg "hello world"OK
键值对的键是一个字符串对象,对象的底层实现是一个保存着字符串msg的SDS
键值对的值是一个字符串对象,对象的底层实现是一个保存着字符串hello world的SDS
12redis> RPUSH fruits "apple" "banana" "cherry"(integer) 3
键值对的键是一个字符串对象,对象的底层实现是一个保存着字符串fruits的SDS
键值对的值是一个列表对象,列表对象包含了三个字符串对象,这三个字符串对象分别由三个SDS实现,第一个SDS保存apple….
除了用来保存数据库中的字符串以外,SDS还被用作缓冲区( ...
网络虚拟化技术
网络虚拟设备Linux VethVeth是成对出现的虚拟网络设备,发送到Veth一端的虚拟设备请求会从另一端的虚拟设备中发出。在容器虚拟化中,经常会使用Veth连接不同的网络namespace
12345678910111213141516171819# 创建两个网络namespaceip netns add ns1ip netns add ns2# 创建一对Vethip link add veth0 type veth peer name veth1# 分别将两个Veth移到两个namespace中ip link set veth0 netns ns1ip link set veth1 netns ns2# 去ns1的namespace中查看网络设备ip netns exec ns1 ip link# 输出1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00: ...
CloudFlare的SSL证书不信任问题
我的域名由CloudFlare托管,主要看重它的解析特别快,几分钟就生效。我用的是CloudFlare签发的15年证书,一直套着CDN用,由于众所周知的原因,有时候突然会访问不了我的服务。有一天把CDN关了之后访问我的服务,浏览器就报证书不可信,查询之后才知道非CA机构颁发的证书是不被信任的,跟自己签发的没区别,除非套上CloudFlare的CDN。emm…
免费的如Let’s Encrypt,需要三个月更新一次证书,虽然可以写个脚本定时更新,但是据说规则也变化,也不想折腾了。另外一方面,套上CDN以后可以隐藏真实IP,减少不必要的麻烦。
基于这些考虑,我决定还是忍受一下时不时访问不了的问题,套上CDN,继续用15年的证书。
关于自己搭建图床
动机我之前使用的图床是SM.MS,一直相安无事,直到Gitee图床的外链问题,让我意识到我该做点什么了,虽然SM.MS是个老牌图床,但是自己搭建一个,数据掌握在自己手里比较安心,毕竟数据丢了后悔就来不及了
图床选择图床程序:lsky-pro
Docker镜像:halcyonazure/lsky-pro-docker
Docekr镜像地址:lsky-pro-docker
感谢各位开源老铁!
搭建使用docker搭建,我的图片不是很多,使用本地存储,数据库使用sqllite,并将数据目录映射出来,自己做备份
另外我的VPS只开放80和443端口,其他服务通过nginx反代处理,配置域名,这样即使以后迁移服务器,也不需要更改什么。
运行docker容器,将服务映射到1081端口,映射数据目录:
123456docker run -d \ --name lsky-pro \ --restart unless-stopped \ -p 1081:80 \ -v /opt/application/lsky:/var/www/html \ halcyonazure/lsky-pro-doc ...
Archlinux交换esc和CapsLock键
作为一个neovim重度用户,实在觉得ESC键太远了,而且CapsLock键没啥用还占了个黄金位置,所以就交换了两个键的位置。
我用的X11,设置如下
在用户目录下创建文件:
1vim ~/.Xmodmap
编辑如下:
123456remove Lock = Caps_Lockkeysym Escape = Caps_Lockkeysym Caps_Lock = Escapeadd Lock = Caps_Lock
保存重新登录即可
KDE系统设置后来发现KDE系统设置里可以设置两个键交换的选项:
System Settings > Input Devices > Keyboard > Advanced > Config keyboard options > caps lock behavior > Swap Esc and Caps Lock
Archlinux软件包制作
Archlinux软件包制作PKGBUILD 文件是为 Arch Linux 及其衍生版(如 Manjaro)构建和创建软件包的方式。
PKGBUILD 基础知识PKGBUILD 文件由变量和函数组成,所有这些都是用来定义软件包本身,以及如何构建它。
为了从 PKGBUILD 中创建一个软件包,需要使用 makepkg 命令行工具。在获得 PKGBUILD 文件后,你只需在包含 PKGBUILD 的目录中运行 makepkg,就可以得到一个可安装的软件包了。
制作软件包例子准备首先,你需要创建一个名为 PKGBUILD 的文件,它将作为构建你的软件包的“配方”。
你需要做的另一个文件是一个叫 hello-world.sh 的文件。
1touch PKGBUILD hello-world.sh
设置PKGBUILD文件pkgname首先是 pkgname 变量。这是安装时定义软件包名称的东西,也是 Arch Linux 的软件包管理器 pacman 跟踪软件包的方式。
这个变量(以及其他一些变量)的格式是 variable=value,变量名在左边,变量的值在右边,用等号隔开。
要设置 ...







