
Redis
专注Redis方面的分享
岚天逸剑
这个作者很懒,什么都没留下…
展开
-
以Docker方式安装Redis集群
以 Redis-6.0.6 为例,先从仓库将镜像拉下来:docker pull redis:6.0.6Redis 的配置文件和数据文件不能放在镜像中,这里选择容器中的目录和宿主机上一致,这样更方便管理。以 /data/redis 为 Redis 的主目录,配置文件放在目录 /data/redis/conf,数据文件放在目录 /data/redis/data。注意,需将容器的网络模式设置为主机(host)模式,而不能是默认的网桥(Bridge)等模式。主机模式下,不有用宿主机和容器间的端口原创 2020-09-03 10:26:09 · 271 阅读 · 0 评论 -
清空Redis集群数据工具
下载:https://github.com/eyjian/redis-tools/blob/master/clear_redis_cluster.sh#!/bin/bash# Batch to clear all nodes using FLUSHALL command# 用来清空一个redis集群中的所有数据,要求 FLUSHALL 命令可用,# 如果在 redis.conf 中使用 rename 改名了 FLUSHALL,则不能执行本脚本。# 可带两个参数:# 1)参数1 集群中的任一可用节原创 2020-09-03 09:30:16 · 907 阅读 · 0 评论 -
Redis之延迟监控
延迟监控参考官方文档https://redis.io/topics/latency-monitor启用 redis 延迟监控CONFIG SET latency-monitor-threshold 100单位:毫秒,100表示一百毫秒。如果将 latency-monitor-threshold 的值设置为 0,则表示关闭延迟监控。子命令1)LATENCY LATEST返回所有事件的最新延迟样本2)LATENCY HISTORY event返回最多1原创 2020-08-27 14:32:01 · 1334 阅读 · 0 评论 -
Redis的slot迁移工具
源码下载:https://github.com/eyjian/redis-tools/blob/master/move_redis_slot.sh支持迁移已有的keys。#!/bin/sh# 迁移 slot 工具,但一次只能迁移一个 slot## 使用时,需要指定如下几个参数:# 1)参数1:必选参数,用于指定被迁移的 slot# 2)参数2:必选参数,用于指定源节点(格式为:ip:port)# 3)参数3:必选参数,用于指定目标节点(格式为:ip:port)# 6)参数4:可选参数,用原创 2020-08-11 15:16:44 · 600 阅读 · 0 评论 -
Redis的slot迁移
官方参考:https://redis.io/commands/cluster-setslot。示例:将值为8的slot从源节点A迁移到目标节点B。1)在目标节点B上执行,从节点A导入slot到节点B:CLUSTER SETSLOT 8 IMPORTING src-A-node-id对于迁移的slot,正常访问返回MOVED;但如果在正常访问之前先执行ASKING,则能正常处理该slot。2)在源节点A上执行,将节点A上的slot迁移到节点BCLUSTER SETSLO原创 2020-08-11 15:12:12 · 1122 阅读 · 0 评论 -
如何保证最少消费一次redis的list队列数据
简使用pop,不能保证最少消费一次,比如pop超时可能中途丢失,或者消费者处理过程中异常而未能处理完。解决此问题有多种方法:方法一:使用rpoplpush替代pop这种方法相当于建立了一个回滚,由于操作是在redis端完成的,可保证数据不会丢,当消费者完成业务逻辑后,再清掉lpush的另一队列,这步有点类似于事务的commit提交。如果在处理过程中消费者异常重启,则在重启时先检查l...原创 2019-09-01 15:07:41 · 1253 阅读 · 0 评论 -
如何设置Redis客户端的超时时长?
客户端的超时时长分连接超时和读写超时,如果是基于hiredis的实现,则读写超时是合在一起的,同一参数控制。在hiredis中,读写超时调用函数redisSetTimeout设置,可以看到没有区分读和写: int redisSetTimeout(redisContext *c, const struct timeval tv); 而连接超时,则是在建立连接时指...原创 2019-08-29 10:02:11 · 6050 阅读 · 0 评论 -
REdis实用集锦
目录目录 11.前言 12.REdis队列应用 12.1.队列介绍 12.2.队列作用 12.3.应用原则 23.REdis大Key问题 24.AOF和RDB选择 35.repl-backlog-size大小设置 31.前言本文专注介绍REdis实践过程研究和总结出实用性技巧,以期帮忙更好的使用REdis。内容持续更新中,如有需要...原创 2019-07-08 15:57:35 · 456 阅读 · 0 评论 -
REdis主从复制之repl_backlog
目录目录 11.前言 12.配置项 13.redisServer 24.feedReplicationBacklog-写repl_backlog 35.addReplyReplicationBacklog-读repl_backlog 41.前言注意,repl_backlog只针对部分复制(PartialReplication),而非全量复制。...原创 2019-06-05 10:57:04 · 2786 阅读 · 4 评论 -
Redis-5.0.5集群配置
REdis技术交流QQ群:722564954。版本:redis-5.0.5参考:http://redis.io/topics/cluster-tutorial。集群部署交互式命令行工具:https://github.com/eyjian/redis-tools/tree/master/deploy集群运维命令行工具:https://github.com/eyjian/redis-t...原创 2019-05-24 09:53:07 · 3359 阅读 · 1 评论 -
REdis之maxmemory解读
redis.conf中的maxmemory定义REdis可用最大物理内存,有多种书写方式,以下均为合法: maxmemory1048576 maxmemory1048576B maxmemory1000KB maxmemory100MB maxmemory1GB maxmemory1000K maxmemory100M...原创 2019-05-22 17:24:36 · 4778 阅读 · 0 评论 -
REdis zset和double
平台:x86_64结论:Zset的最大分数不要超过18014398509481982(17位数字,54位二进制),否则不会得到期望的值。REdis:5.0.4Zset采用double存储分数值(score),而incrbyfloat和hincrbyfloat采用的是longdouble存储数值。double本身是可以存储比18014398509481982(17...原创 2019-04-25 17:31:59 · 1684 阅读 · 0 评论 -
REdis MASTER aborted replication NOAUTH Authentication required
对于REdis集群,如果设置了requirepass,则一定要设置masterauth,否则从节点无法正常工作,查看从节点日志可以看到哪下内容:19213:S 22 Apr 2019 10:52:17.389 * Connecting to MASTER 1.6.18.16:218119213:S 22 Apr 2019 10:52:17.389 * MASTER <-> REP...原创 2019-04-22 11:38:31 · 907 阅读 · 0 评论 -
REdis Asynchronous AOF fsync is taking too long
redis.conf中的no-appendfsync-on-rewrite默认值为no,表示在重写AOF文件或RDB文件时阻塞fsync。如果重写AOF或RDB文件时长过长,则在日志中可以看到如下信息:Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiti...原创 2019-04-22 11:40:06 · 4523 阅读 · 0 评论 -
REdis之RDB配置问题
RDB配置:save 900 1save 300 10save 60 10000stop-writes-on-bgsave-error nordbcompression yesrdbchecksum yesrepl-diskless-sync noaof-use-rdb-preamble nordb-save-incremental-fsync yes影响:易生成REdis...原创 2019-04-02 19:31:57 · 2605 阅读 · 0 评论 -
REdis命令处理流程处理分析
分析版本:REdis-5.0.4。REdis命令处理流程可分解成三个独立的流程(不包括复制和持久化):1)接受连接请求流程;2)接收请求数据和处理请求流程,在这个过程并不会发送处理结果给Client,而只是将结果数据写入响应缓冲,将由响应请求流程来发送;3)响应请求流程。上述三个流程均是异步化的,并且没有直接的联系。它们的共同点均是通过REdis的简单事...原创 2019-04-01 10:10:24 · 1291 阅读 · 0 评论 -
REdis主挂掉后复制节点才起来会如何?
结论:这种情况下复制节点(即从节点)无法提升为主节点,复制节点会一直尝试和主节点建立连接,直接成功。主节点恢复后,复制节点仍然保持为复制节点,并不会成为主节点。复制节点无法提升为主节点的原因是复制节点未发起成为主节点的选举。复制节点日志: 14304:S26Mar201915:42:01.158*ConnectingtoMASTER10.49.1...原创 2019-03-26 16:11:07 · 1955 阅读 · 0 评论 -
REdis CPU百分百问题分析
REdis版本:4.0.9运行环境:Linux3.10.107x86_64gcc_version:4.8.5结论:是一个BUG,在4.0.11版本中被作者antirez所修复现象:1)top显示2)执行REdisinfo命令直接卡住不动3)集群通讯端口大量的“CLOSE_WAIT”4)日志文件大量的“Badmessagelength...原创 2019-03-21 16:30:10 · 2281 阅读 · 0 评论 -
REdis AOF文件结构分析
REdis-4.0之前的AOF文件没有文件头,而从REdis-4.0开始AOF文件带有一个文件头,文件头格式和RDB文件头相同。REdis-4.0版本,如果开启aof-use-rdb-preamble(值为yes,5.0默认为yes,4.0默认为no),则AOF文件内容由三部分组成:1)文件头(和RDB文件头格式相同)2)RDB格式的二进制数据段3)AOF格式的文本数据段...原创 2019-03-14 12:37:33 · 2232 阅读 · 0 评论 -
redis的repl-ping-slave-period和repl-ping-replica-period
网上很多Redis方面的文章,会涉及到repl-ping-slave-period和repl-ping-replica-period这两个重要参数,从一些中文解释来看,意思差不多,即:SLAVE周期性的ping MASTER间隔,可直接理解成SLAVE -> MASTER间的心跳间隔(注意箭头方向)。 没有一篇文章同时提取这两者,总是分开出现在不同文章中。在官方的配置文件redis....原创 2019-01-06 17:05:12 · 8038 阅读 · 0 评论 -
使用Linux自带日志滚动工具logrotate滚动redis日志示例
截至到redis-5.0版本,redis仍然不会自动滚动日志文件,如果不处理则日志文件日积月累越来越大,最终将导致磁盘满告警: # ls -lh total 12G -rw-r--r-- 1 redis redis 8.5G Feb 18 10:26 redis-6379.log -rw-r--r-- 1 redis redis 1.5G Feb 18 10:26...原创 2019-02-18 10:48:07 · 2714 阅读 · 0 评论 -
Redis源码笔记-初步
目录目录 11. 前言 22. 名词 23. dict.c 23.1. siphash算法 23.2. 核心函数 33.3. 核心宏 33.4. 核心结构体 33.4.1. dictEntry 34. Redis命令 44.1. SELECT命令 44.1.1. redisCommand结构体 44.1.2. redisCommandTable变...原创 2018-09-19 09:22:45 · 9342 阅读 · 0 评论 -
Redis Cluster原理初步
目录目录 11. 前言 12. 槽(slots) 13. 路由配置(node.conf) 14. 总slots数(cluster.h:16384) 25. key的路由 26. 将key转成整数值(crc16.c:crc16) 27. 计算key所在slot(cluster.c:keyHashSlot) 28. Redis Cluster Client实现原创 2016-05-16 17:03:15 · 9649 阅读 · 0 评论 -
查看Redis集群所有节点内存工具
指定集群中任意一个节点,查看集群中所有节点当前已用物理内存、配置的最大物理内存和系统物理内存。源码(可从https://github.com/eyjian/redis-tools下载):#!/bin/bash# Query the memory of all nodes in a cluster## Output example:# $ ./query_redis_clust...原创 2018-09-02 22:45:51 · 10101 阅读 · 0 评论 -
Redis集群命令行部署工具
使用之前准备工作:1)配置好与端口无关的公共redis.conf文件,和工具放在同一目录下2)配置好与端口相关的模板redis-PORT.conf文件,也和工具放在同一目录下(部署时PORT会被替换成具体的端口号)3)配置好组成集群的节点文件redis_cluster.nodes,也和工具放在同一目录下redis_cluster.nodes的文件格式为每行一个组成Redis集群的节点,支持...原创 2018-09-02 22:04:14 · 7803 阅读 · 0 评论 -
查看Redis集群主从对应关系工具
工具的作用:1)比“cluster nodes”更为直观的显示结果2)指出落在同一个IP上的master3)指出落在同一个IP上的master和slave对 运行效果图:源代码(可从https://github.com/eyjian/redis-tools下载):#!/bin/bash# 源码位置:https://github.com/eyjian/redis-...原创 2018-09-02 21:53:40 · 13067 阅读 · 3 评论 -
Redis集群master选举时长测试
在一台物理机上启动6个Redis实例,组成3主3从集群,端口号依次为:1379 ~ 1384,端口号1379、1380和1384三个为master,端口1379的进程ID为17620。现将进程17620暂停(发送SIGSTOP信号),观察集群发现故障时长,和主从切换时长。# 暂停进程17620(端口1379),然后每秒查看一次集群状态$ kill -19 17620;for ((i=0;i<...原创 2018-05-09 14:41:43 · 8944 阅读 · 0 评论 -
redis-server进程CPU百分百问题
结论:待确认是否为redis的BUG,原因是进程实际占用的内存远小于配置的最大内存,所以不会是内存不够需要淘汰。(确认为BUG,4.0.11中修复,细节请参见:https://blog.youkuaiyun.com/Aquester/article/details/88718701)CPU百分百redis-server进程集群状态:slave临时解决办法:使用gdb将d.ht[0].used的值...原创 2018-03-29 20:08:56 · 9367 阅读 · 0 评论 -
redis for lack of backlog
版本:redis-3.2.9部署:5台64G内存的物理机,每台机器启动2个redis进程组成5主5备集群,每台机器1个主1个备,并且错开互备。问题:发现redis进程占用内存高达40G,而且全是备进程。尝试通过重启进程方式释放内存,但进入复制死循环,报如下所示错误:for lack of backlog (Slave request was: 5187515原创 2017-08-29 09:58:26 · 8010 阅读 · 0 评论 -
一种基于Redis的10行代码实现IP频率控制方法
基于IP频率限制是种常见需求,基于Redis可以十分简单实现对IP的频率限制,具体手段为利用Redis的key过期和原子加减两个特性。以IP作为key,频率为key过期时长,比如限制单个IP在2秒内频率为100,则key过期时长为2秒,基于r3c(a Redis Cluster C++ Client)的实现大致如下:// 增加访问次数int increse_access(con原创 2016-09-08 00:08:24 · 6227 阅读 · 4 评论 -
redis只加载AOF文件
如果同时配置写AOF和RDB两种文件,但在redis启动时,只会加载AOF,除非配置只写RDB,才会加载RDB文件,也因此AOF文件必须是全量数据,所以会越来越大,这缺点也将是redis优化的一个方向,即AOF只保存相对于RDB的增量,这样AOF文件将大大减小。相关源码如下所示:int main(int argc, char **argv) { 。。。 if (!server.原创 2016-06-08 17:55:24 · 2287 阅读 · 0 评论 -
Redis的appendfsync参数详解
redis.conf中的appendfysnc是对redis性能有重要影响的参数之一。可取三种值:always、everysec和no。设置为always时,会极大消弱Redis的性能,因为这种模式下每次write后都会调用fsync(Linux为调用fdatasync)。如果设置为no,则write后不会有fsync调用,由操作系统自动调度刷磁盘,性能是最好的。everysec为最多...原创 2018-12-07 08:58:24 · 18522 阅读 · 2 评论 -
Redis模块开发示例
实现一个Redis module,支持两个扩展命令:1) 可同时对hash的多个field进行incr操作;2) incrby同时设置一个key的过期时间在没有module之前,需要借助eval+lua实现相同的功能。有了module,不但可以实现逻辑复杂,且性能高的扩展,同时享受Redis的持久化和容灾能力。// Redis命令扩展module#include "redism...原创 2018-10-31 16:16:10 · 1040 阅读 · 0 评论 -
Redis-5.0.0集群配置
版本:redis-5.0.0参考:http://redis.io/topics/cluster-tutorial。集群部署交互式命令行工具:https://github.com/eyjian/redis-tools/tree/master/deploy集群运维命令行工具:https://github.com/eyjian/redis-tools/tree/master批量操作工具:...原创 2018-10-26 19:06:49 · 13365 阅读 · 5 评论 -
Redis基于eval的多字段原子增量计算
目录目录 11. 前言 12. 优点 13. 方法一:使用struct 23.1. 设置初始值(覆盖原有的,如果存在) 23.2. 查询k1的值 23.3. 设置初始值(覆盖原有的,如果存在) 23.4. 查询k1的值 23.5. 增量操作(增1) 23.6. 查询k1的值 33.7. 增量操作(增1) 33.8. 查询k1的值 33.9. pa...原创 2018-10-24 17:11:38 · 792 阅读 · 0 评论 -
Redis集群的主从切换研究
目录目录 11. 前言 12. slave发起选举 23. master响应选举 54. 选举示例 55. 哈希槽传播方式 66. 一次主从切换记录1 66.1. 相关参数 66.2. 时间点记录 66.3. 其它master日志 66.4. 其它master日志 76.5. slave日志 77. 一次主从切换记录2 87.1. 相关参数 ...原创 2019-01-06 16:59:12 · 13657 阅读 · 2 评论 -
redis.conf之save配置项解读
配置示例: save 900 1 save 300 10 save 60 3600 配置解读:1) “save 900 1”表示如果900秒内至少1个key发生变化(新增、修改和删除),则重写rdb文件;2) “save 300 10”表示如果每300秒内至少10个key发生变化(新增、修改和删除),则重写rdb文件;3) “save 60 ...原创 2019-01-07 16:18:43 · 15220 阅读 · 3 评论 -
如何安全地使用redis的pop命令
Redis的list经常被当作队列使用,左进右出,一般生产者使用lpush压入数据,消费者调用rpop取出数据。这是很自然的行为,然而有时会发现lpush成功,但rpop并没有取到数据,特别是一些客户端库封装了rpop操作,添加了调用者无感知的自动重试。数据凭空消失,找不到问题所在。实际上,这是所有网络类操作存在的共同的天生的问题,即网络超时,pop的数据实际已在对应的连接中,但因为...原创 2019-09-05 14:28:16 · 2292 阅读 · 0 评论 -
Redis之eval+lua实现初步
目录目录 11. 前言 12. 执行方式 13. 执行过程 34. 使用原则 3 前言Redis的实现保证eval的执行是原子的,即使eval执行的lua超时,Redis也不会自动终止执行。官方说明如下: When a script reaches the timeout it is not automaticallyterminated by Re...原创 2019-09-03 19:51:10 · 531 阅读 · 0 评论