编译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
小于 1 分钟
编译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
服务上云,内网的redis集群,通过ip映射的方式把redis的端口映射到公网(白名单),公网的机器通过lettuce等客户端连接的时候,lettuce客户端的集群模式是先通过cluster nodes 获取节点拓扑 ,在操作key的时候先通过算法定位到key在哪个节点,获取key如果重定向到其它节点的话,就会从对应的节点获取。这就会导致获取到的ip是内网的ip,公网连接不上的问题,以下是通过iptables的方式解决。
同事在测试环境jedis cluster模式出现redis.clients.jedis.exceptions.JedisClusterMaxAttemptsException: No more cluster attempts left.
报错,找到我帮忙定位下问题
通过堆栈信息找到对应的源码位置redis.clients.jedis.JedisClusterCommand#runWithRetries
在阅读源码的时候,通过debug调试的方式逐行去理解代码的意思,不免是一个好的方式。
第一步:
在src
目录下新建一个文件learn.h
,在这里面定义入口
#ifndef REDIS_LEARN_H
#define REDIS_LEARN_H
int learn();
#endif //REDIS_LEARN_H
创建节点数据
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
ziplist是一个用一段特殊编码实现的双向链表,优势是占用内存小,可以存储字符串类型和整数类型。在内存布局中包含一下几个字段
整数集合的实现相对比较简单,我们看下它的数据结构
/* 整数集合的数据结构 */
typedef struct intset {
uint32_t encoding; /* 编码,该编码决定了contents数组的int类型,支持16位、32位、64位 */
uint32_t length; /* 元素长度 */
int8_t contents[]; /* 元素,元素的类型不是int8_t,而是根据encoding动态强制转换 */
} intset;