跳至主要內容
解决redis编译找不到siginfo_t

编译redis出现

server.h:2757:30: error: unknown type name ‘siginfo_t’
 2757 | void sigsegvHandler(int sig, siginfo_t *info, void *secret);

打开Makefile找到FINAL_CFLAGS在后面追加-D_POSIX_C_SOURCE=199309L


DHB小于 1 分钟Redis源码Redis
解决redis集群内部ip问题

背景

服务上云,内网的redis集群,通过ip映射的方式把redis的端口映射到公网(白名单),公网的机器通过lettuce等客户端连接的时候,lettuce客户端的集群模式是先通过cluster nodes 获取节点拓扑 ,在操作key的时候先通过算法定位到key在哪个节点,获取key如果重定向到其它节点的话,就会从对应的节点获取。这就会导致获取到的ip是内网的ip,公网连接不上的问题,以下是通过iptables的方式解决。


DHB大约 3 分钟RedisRedisIptables
Jedis cluster模式连接出现No more cluster attempts left

同事在测试环境jedis cluster模式出现redis.clients.jedis.exceptions.JedisClusterMaxAttemptsException: No more cluster attempts left.报错,找到我帮忙定位下问题

通过堆栈信息找到对应的源码位置redis.clients.jedis.JedisClusterCommand#runWithRetries


DHB小于 1 分钟JavaJavaJedisRedis
源码-调试Redis

在阅读源码的时候,通过debug调试的方式逐行去理解代码的意思,不免是一个好的方式。

第一步:

src目录下新建一个文件learn.h,在这里面定义入口

#ifndef REDIS_LEARN_H
#define REDIS_LEARN_H

int learn();

#endif //REDIS_LEARN_H


DHB大约 3 分钟Redis源码Redis
redis-cli创建集群流程
  1. 先通过CLUSTER INFO获取节点是否开启集群模式
  2. cluster addslots为每个master添加槽点
  3. CLUSTER REPLICATE为每个replicate节点与master关联
  4. cluster set-config-epoch为每个节点设置不同epoch
  5. cluster meet把节点关联起来

DHB小于 1 分钟RedisRedis
Docker搭建redis集群

脚本

创建节点数据

for port in $(seq 1 6); \
do \
mkdir -p ./node-${port}/conf
touch ./node-${port}/conf/redis.conf
cat << EOF > ./node-${port}/conf/redis.conf
port 800${port}
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 10.8.46.98
cluster-announce-port 800${port}
cluster-announce-bus-port 1800${port}
appendonly yes
EOF
done

DHB大约 2 分钟RedisDockerRedis
数据结构02-压缩链表-ziplist

总览

img

作用于

  • 数量比较少的hash、zset

ziplist数据结构

ziplist是一个用一段特殊编码实现的双向链表,优势是占用内存小,可以存储字符串类型和整数类型。在内存布局中包含一下几个字段

  • zlbytes:(4 bytes)整个链表占的内存字节数
  • zltail:(4 bytes)链表尾部节点的偏移量,存储这个信息的作用是实现反向遍历,因为需要知道尾部的地址才能从尾部向前遍历节点
  • zllen:(2 bytes)节点长度
  • entry:(n bytes)数据节点,数据节点包含3个结构,下面详细讲解
  • zlend:(1 bytes)结束标识符,固定是0xFF

DHB大约 8 分钟RedisRedis算法
数据结构06-整数集合-intset

数据结构

整数集合的实现相对比较简单,我们看下它的数据结构

/* 整数集合的数据结构 */
typedef struct intset {
    uint32_t encoding; /* 编码,该编码决定了contents数组的int类型,支持16位、32位、64位 */
    uint32_t length; /* 元素长度 */
    int8_t contents[]; /* 元素,元素的类型不是int8_t,而是根据encoding动态强制转换 */
} intset;

DHB大约 4 分钟RedisRedis