redis:链表|青训营笔记

50 阅读2分钟

二:链表

当一个列表键包含了数量比较多的元素或者列表中包含的元素都是比较长的字符串时,redis就会使用链表作为列表键的底层实现。 除了链表键之外,发布与订阅、慢查询、监视器等功能也用到了链表,redis服务器本身还用链表来构建客户端输出缓冲区。 链表的实现:

  • 每个链表节点使用一个adlist.h/listNode结构来表示:
typedef struct listNode {
	//前置节点
    struct listNode *prev;
    //后置节点
    struct listNode *next;
    //节点的值
    void *value;
} listNode;
  • 多个listNode组成双端链表,通过adlist.h/list来持有链表
typedef struct list {
	//表头节点
    listNode *head;
    //表尾节点
    listNode *tail;
    //节点复制函数
    void *(*dup)(void *ptr);
    //节点释放函数
    void (*free)(void *ptr);
    //节点对比函数
    int (*match)(void *ptr, void *key);
    //链表所包含的节点数量
    unsigned long len;
} list;
  • Redis的链表实现的特性:
    • 双端: 有prev和next指针,获取某个节点的前置节点和后置节点的负责的均为O(1)
    • 无环:表头节点的prev和表尾结点的next均指向null,对链表的访问以NULL为终
    • 带表头和尾指针:通过list的head和tail指针,获取表头表尾复杂度尾O(1)
    • 带链表长度计数器:list里的len,对list持有节点数量进行统计。
    • 多态:链表节点使用void* 指针保存节点值,可以通过list结构中的dup、free、match三个属性为节点值设置类型特定函数,所以链表可以用于保存各种不同类型的值

linux操作

1、开放端口

firewall-cmd --zone=public --add-port=5672/tcp --permanent # 开放5672端口 firewall-cmd --zone=public --remove-port=5672/tcp --permanent #关闭5672端口 firewall-cmd --reload # 配置立即生效

2、查看防火墙所有开放的端口

firewall-cmd --zone=public --list-ports

3、关闭防火墙

如果要开放的端口太多,嫌麻烦,可以关闭防火墙,安全性自行评估

systemctl stop firewalld.service

4、查看防火墙状态

firewall-cmd --state

5、查看监听的端口

使用命令 nmap ip地址

或者命令 netstat -lnpt PS:centos7默认没有 netstat 命令,需要安装 net-tools 工具 yum install -y net-tools

6、检查端口被哪个进程占用

netstat -lnpt |grep 5672

7、中止进程

kill -9 6832 # 6832是进程id

systemctl status firewalld.service(查看防火墙状态)

active表示当前防火墙处于开启状态 inactive表示关闭状态 systemctl stop firewalld.service (关闭防火墙) systemctl start firewalld.service (开启防火墙) systemctl disable firewalld.service (禁止防火墙自启动) systemctl enable firewalld.service (防火墙随系统开启启动)