
Redis
文章平均质量分 87
damanchen
这个作者很懒,什么都没留下…
展开
-
Redis集群丢数据问题——机器宕机没有自动切库,手动takeover后,老主库重启又抢回master
文章目录背景事故描述问题分析日志记录关键日志疑惑与猜测原因排查查看资料集群间通信手动故障转移配置纪元的主要作用:同版本集群测试准备测试流程日志分析根据日志查看源码逻辑has old slots configurationis back online网络问题确认异常信息信息确认集群间通信问题排查通信端口连接情况抓包确认之前疑惑的解答总结后续操作急救措施反思改进措施背景机器发生了宕机,查看后发现有个节点没有自动切库成功,为了保证集群对外能正常服务,所以决定手动强制切库,保证集群对外的可用性。事故描述先使原创 2021-05-17 18:28:59 · 1572 阅读 · 0 评论 -
在MAC上使用CLion调试Redis源码和RedisBloom
环境说明CLion:Version 2020.2.5Redis:redis-4.0.12RedisBloom:最新版在MAC上使用CLion调试 Redis源码根据上一篇的摸索和实践,在MAC上使用CLion调试Redis源码可以归纳如下:参照这个文章,在下载好的redis-4.0.12版本的代码里配置好 CMakeLists.txt文件;下载好 Version 2020.2.5的CLion,并使用 New CMake Project from Sources这种方法打开配置好````C原创 2021-05-07 18:38:26 · 744 阅读 · 0 评论 -
MAC上用CLion调试Redis源码及报错排查
(本文仅作为记录,还有待完善的地方)问题点:Clion 使用了 cmake 来管理项目,所以我们需要在 Redis 源码根目录下为它创建好 CMakeLists.txt 才能进行构建。尝试调试最新版Redis报错排查刚开始参考 mac + CLion + redis5 本地调试/运行 进行调试,过程中遇到了一些新的问题,记录如下:deps/hiredis/CMakeLists.txtCMake Error at deps/hiredis/CMakeLists.txt:168 (add_librar原创 2021-05-07 18:34:56 · 1507 阅读 · 0 评论 -
Redis缓存命中率如何提高
一、缓存命中率命中:可以直接通过缓存获取到需要的数据,而不是从数据库中获取不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作。原因可能是由于缓存中根本不存在,或者缓存已经过期。通常来讲,缓存的命中率越高则表示使用缓存的收益越高,应用的性能越好(响应时间越短、吞吐量越高),抗并发的能力越强。由此可见,在高并发的互联网系统中,缓存的命中率是至关重要的指标。如何查看Redis缓存命中率redis-cli -h xx -p xx info stats可以看到keyspa原创 2021-02-23 22:38:54 · 3308 阅读 · 0 评论 -
Redis分布式锁的演进和局限性
分布式锁的由来分布式应用进行逻辑处理时经常会遇到并发问题。比如一个操作要修改用户的状态,修改状态需要先读出用户的状态,在内存里进行修改,改完了再存回去。如果这样的操作被多个线程同时执行了,就会出现并发问题,因为同一个线程读取和保存状态这两个操作不是原子的。所谓原子操作是指不会被线程调度机制打断的操 作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch 线程切换。)这个时候就要使用到分布式锁来限制程序的并发执行,保证同一时刻只能有一个进程在修改用户的状态。分布式锁原创 2021-01-29 20:06:59 · 294 阅读 · 0 评论 -
Redis重大版本整理(Redis2.6-Redis7.0)
Redis借鉴了Linux操做系统对于版本号的命名规则:node 版本号第二位若是是奇数,则为非稳定版本(例如2.7、2.9、3.1),若是是偶数,则为稳定版本(例如2.6、2.8、3.0、3.2)。当前奇数版本就是下一个稳定版本的开发版本,例如2.9版本是3.0版本的开发版本,因此咱们在生产环境一般选取偶数版本的Redis。下面是重大版本新功能的归纳:Redis6.0多线程 IO(Threaded I/O)众多新模块(modules)API更好的过期循环(expire cycle)支持SS原创 2020-12-01 22:18:38 · 17158 阅读 · 0 评论 -
Redis RDB文件的解析工具梳理(rdr/redis-rdb-tools)
前言目前关于Redis rdb文件解析的工具,目前了解到的主要有python写的 redis-rdb-tools 工具,和用golang写的 rdr 工具。https://github.com/sripathikrishnan/redis-rdb-toolshttps://github.com/xueqiu/rdrRDR(redis data reveal) is a tool to parse redis rdbfile. Comparing to redis-rdb-tools, RD原创 2020-11-29 18:00:47 · 4081 阅读 · 0 评论 -
Redis 3.0.7版不支持带密码的cluster rebalance操作
一、前言二、操作2.1 模拟和执行2.2 fix2.3 换5版本的redis-cli继续尝试2.4 查看源码三、总结一、前言因业务需要扩容,考虑到集群单实例容量已经超过10GB,算是比较大的情况了。所以不能直接调整maxmemory参数进行扩容,需要加节点动态扩容。业务集群版本是3.0.7版本的。二、操作2.1 模拟和执行在对3.0.7版带密码的集群加好新主从,模拟迁槽位没有问题:./redis-trib.rb rebalance --password "xxx" --use-empty-m.原创 2020-09-28 22:44:56 · 651 阅读 · 0 评论 -
优雅地删除 Redis bigkey
文章目录redis bigkey的定义直接删除大Key的风险如何优雅地删除各类大KeyHash KeySet KeyList KeySorted set keyredis bigkey的定义关于Redis大键(Key),我们从[空间复杂性]和访问它的[时间复杂度]两个方面来定义大键。前者主要表示Redis键的占用内存大小;后者表示Redis集合数据类型(set/hash/list/sorted set)键,所含有的元素个数。以下两个示例:1个大小200MB的String键(String Objec转载 2020-05-23 18:18:19 · 1042 阅读 · 0 评论 -
redis-trib功能实现详解(转)
文章目录一、概述1.1 redis-trib.rb的来源1.2 功能概览二、介绍2.1 ClusterNode对象2.2 简单用法三、功能实现介绍3.1 create创建集群3.2 check检查集群3.3 info查看集群信息3.4 fix修复集群3.5 reshard在线迁移slot3.6 rebalance平衡集群节点slot数量3.7 add-node将新节点加入集群3.7 del-nod...转载 2020-01-06 15:28:29 · 828 阅读 · 0 评论 -
redis client list实战记录
redis client list实战记录一、redis client list各参数的含义二、实战记录2.1 发现问题2.2 确定问题2.3 解决问题三、总结四、扩展思考4.1 为什么切库之后,主从不能正常建立连接,进行复制?4.2 从库挂了之后,主库内存突然升高,之后又回落一、redis client list各参数的含义连接一个测试的redis服务,执行client list命令,得到的...原创 2019-12-30 11:33:26 · 2809 阅读 · 0 评论 -
redis-cli 特殊参数的用法
redis-cli 特殊参数的用法1、--raw 参数的用法2、redis中的CSV是什么用法?3、其他参数的用法简介1、–raw 参数的用法按数据原有格式打印数据,不展示额外的类型信息[work@ ~]$ redis-cli -p 32495 -c set a 1OK[work@ ~]$ redis-cli -p 32495 -c incr 1(integer) 1[work@...原创 2019-11-30 17:39:20 · 1415 阅读 · 0 评论 -
RDB文件格式
RDB文件格式一、Redis RDB文件二、解析RDB的高级算法2.1 Magic Number2.2 RDB 版本号2.3 操作码2.3.1 数据库选择器2.3.2 Resizeb信息2.3.3 辅助字段2.3.4 键值对密钥到期时间戳值类型键值2.4 CRC64校验码三、编码方式3.1 Length Encoding 长度编码3.2 字符串编码3.2.1 长度前缀字符串3.2.2 整数作为字符...原创 2019-11-30 17:30:02 · 3436 阅读 · 0 评论 -
redis内存碎片率很低——下篇
redis内存碎片率很低——下篇一、问题复现二、分析2.1 查看redis源码关于redis集群的初始化定义2.2 分析导入配置文件的函数定义三、结,,,论接上篇讨论:https://blog.youkuaiyun.com/damanchen/article/details/102833201一、问题复现自己又测试,部署了一个redis-4.0.12版本的集群模式的单节点,其info memory信息如...原创 2019-10-31 10:50:58 · 437 阅读 · 0 评论 -
redis内存碎片率很低——上篇
redis内存碎片率很低——上篇一、起因二、分析2.1 自己分析2.2 搜索资料2.3 分析进程占用2.4 确认问题三、寻找问题的根源3.1 通过Address映像起始地址来找3.2 通过redis进程函数系统调用来找四、后续一、起因今天有业务找过来说,说自己就存了几十个string类型的数据,为什么集群上节点的内存使用率就占到了200多M。224MB按照redis的string...原创 2019-10-31 10:34:37 · 984 阅读 · 0 评论 -
RDB文件大小比看到的used_memory_human小很多
RDB文件大小比看到的used_memory_human小很多1、RDB文件大小2、used_memory_human 表示的大小3、RDB分析工具看到的大小4、总结1、RDB文件大小redis.server生成RDB文件时,会对各种数据类型进行编码(各种类型编码方式不一样)和压缩(LZF算法压缩),所以生成的RDB文件会比 used_memory_human 小很多。以字符串对象写入RDB...原创 2019-10-31 09:59:09 · 2778 阅读 · 0 评论 -
Redis学习——scan查找
scan查找一、scan的产生二、scan的特点三、scan的使用四、原理浅析字典扩容对比扩容缩容前后的遍历顺序渐进式rehash大 key 扫描一、scan的产生Redis 提供了一个简单暴力的指令 keys 用来列出所有满足特定正则字符串规则的 key这个指令使用非常简单,提供一个简单的正则字符串即可,但是有很明显的两个缺点:1、没有 offset、limit 参数,一次性吐出所有满足...原创 2019-04-15 16:39:48 · 1019 阅读 · 0 评论 -
Redis学习——压缩列表ziplist
压缩列表ziplist压缩列表的构成压缩列表节点的构成previous_entry_lengthencodingcontent连锁更新压缩列表(ziplist)是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是最小值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做列表键的底层实现当一个哈希键只包含少量键值对,并且每个键值对的键和值要么就是小整...原创 2019-04-04 16:45:12 · 1387 阅读 · 0 评论 -
Redis学习——内存消耗和内存回收机制
Redis的内存消耗和内存回收机制1、内存消耗1.1 查看内存消耗1.2 内存消耗划分2、内存回收机制2.1 内存使用达到maxmemory上限时候触发的溢出回收:2.2 删除过期时间的键对象1、内存消耗1.1 查看内存消耗通过 info memory命令,查看Redis内存消耗的相关指标,从而有助于更好的分析内存。执行命令之后有这么几个重要的指标:重点需要关注下mem_fragme...原创 2019-04-04 15:59:47 · 2272 阅读 · 0 评论 -
Redis学习——跳跃表
有序集合的“跳跃列表”跳跃表的原理与特点新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入跳跃表的原理与特点你...原创 2019-03-29 17:53:18 · 323 阅读 · 0 评论 -
Redis源码学习——Redis字典扩容问题
通过上一篇对dictScan函数的分析,我们引出了两个问题,就是Redis字典在进行扩容的时候,会从size=8直接扩容到size=64吗?那段代码块真的有用吗?下面我们就通过查看源码,逐步来探索一下这个问题。想要探索这个问题的答案,我们首先要看一下字典会在什么时候进行扩容,首先查看到的函数是: * 根据需要,初始化字典(的哈希表),或者对字典(的现有哈希表)进行扩展 * T = O(N)...原创 2019-04-23 14:41:33 · 1468 阅读 · 1 评论 -
Redis源码学习——安全迭代器和非安全迭代器(一)
安全迭代器和非安全迭代器一、字典迭代器是啥1.1 字典迭代器 dictIterator 的定义1.2 非安全迭代器的定义1.3 安全迭代器的定义二、字典迭代器用在哪在我之前的理解中,迭代器不就是指scan迭代器吗,但是后来又看到一些地方说字典迭代器,安全迭代器,,,再进一步了解之后,对其更加困惑了,所以进行了深入地学习,看明白了一些地方,但还是有一些疑惑,在此记下,望大家一起探讨。在进行源码的...原创 2019-04-23 16:03:34 · 985 阅读 · 0 评论 -
Redis源码学习——安全迭代器和非安全迭代器(二)
安全迭代器和非安全迭代器一、iterators 变量与单步rehash1.1 iterators 变量的定义1.2 单步rehash1.3 dictRehash() 函数的定义二、安全迭代器和非安全迭代器使用场景2.1 执行单步rehash更深层的原因是啥?2.2 dictNext(dictIterator *iter)函数的使用通过上一篇博客的分析,我们已经大概知道 字典迭代器 的定义和用处了...原创 2019-04-23 19:28:52 · 914 阅读 · 6 评论 -
redis cluster怎么保证键的均匀分配(crc16算法)
redis cluster怎么保证键的均匀分配(crc16算法)一、虚拟槽分区二、源码论证1、**keyHashSlot** 函数2、CRC16算法实现(crc16.c)三、结论一、虚拟槽分区Redis Cluser采用虚拟槽分区,所有的键根据哈希函数映射到0~16383个整数槽内,计算公式:slot=CRC16(key)&16383。由于采用高质量的哈希算法,每个槽所映射的数据通常...原创 2019-09-06 17:48:58 · 9790 阅读 · 0 评论 -
redis集群的密码信息存在哪?是如何更新的?关于requirepass和masterauth的问题
redis集群的密码信息存在哪?是如何更新的?一、关于requirepass和masterauth的问题二、查看源码2.1 requirepass的使用2.2 masterauth的使用三、总结*redis集群的密码信息存在哪?是如何更新的?*问题:redis集群的密码信息存在哪?是如何更新的?在使用redis集群做测试的时候,因为之前的集群加过密码,后面新加的节点没有加上密码,忘了之后又做了...原创 2019-09-06 18:02:29 · 18440 阅读 · 1 评论 -
redis-3.0.7内存碎片过高 mem_fragmentation_ratio >1.5
redis-3.0.7内存碎片过高 mem_fragmentation_ratio >1.5一、内存碎片率二、内存碎片率高的原因三、解决方法一、内存碎片率mem_fragmentation_ratio = used_memory_rss / used_memoryused_memory :Redis使用其分配器分配的内存大小used_memory_rss :操作系统分配给Redis实...原创 2019-09-14 10:25:55 · 6746 阅读 · 0 评论 -
redis 普通客户端请求超过client-output-buffer-limit限制,导致主从连接断开的问题
超过 client-output-buffer-limit 限制,导致主从连接断开的问题一、问题二、查看资料三、对比分析一、问题今天收到报警,两个节点之间连接断了,登录节点查看信息,发现已经恢复,好像并没有问题。但是查看这两个redis节点的日志如下:可以看出第一个节点收到主节点断开的消息,然后自己成为主库。之后又收到主节点好了的消息,就又把master让给了之前的主节点,开始复制主节点...原创 2019-09-20 19:54:41 · 17161 阅读 · 14 评论 -
redis主从频繁切换(老从节点成为新master之后又被老主节点起来抢回master)
老从节点成为新master之后又被老主节点起来抢回master老从节点成为新master之后又被老主节点起来抢回master一、查看之前的日志信息二、分析源码2.1 查找日志的来源2.2 查询函数调用三、如何验证究竟是以上什么原因导致老主节点抢回master呢?3.1 再次查看原主库日志3.2 再次查看原从库日志3.3 查看整理好的整体日志信息四、分析总结4.1 老主库“抢回”master的真相4...原创 2019-09-20 19:57:59 · 6719 阅读 · 0 评论 -
Redis源码学习——Scan迭代器dictScan函数
Scan迭代器dictScan函数一、dictScan函数1.1 dictScan() 函数的简单理解1.2 scan迭代器的缺点二、对函数代码的验证2.1 关于 依次遍历 时 槽位变化 的验证2.2 关于 rehashing 中 槽位迁移 的变化的验证思考在学习scan迭代器的时候,被其迭代算法的思想惊艳到了,忍不住大赞作者。(迭代所使用的算法是由 Pieter Noordhuis 设计的)...原创 2019-04-23 11:21:14 · 1192 阅读 · 2 评论