1. 1.1 Redishistorical

    1. Redis是什么 Redis是一个K、V型的内存型数据库。 相对于Memcached来说有两个特点,一个是丰富的数据结构,另一个是持久化 2. Redis安装 - Redis安装.md 3. Redis特性 3.1. 单线程 - Redis线程模型.md 3.2. 内存型数据库 Redis所有

  2. 1.2 Redis安装historical

    1. 源码安装 1. 下载源码 - Redis 2. 安装开发环境包 3. 编译 4. 安装 - redis 5. 配置 - 备份并且移除注释 - 最核心的配置 6. 启动并测试

  3. 1.3 Redis持久化historical

    1. 为什么要持久化 Redis数据存放在内存,一旦宕机那么内存中的数据全部丢失了。 因此需要把内存中的数据持久化到硬盘中以便挂了之后恢复 2. 持久化方式 2.1. RDB 2.1.1. 是什么 把当前内存中的数据做成一个二进制文件dump到磁盘中,就是一个快照 2.1.2. 触发时机 2.1.2

  4. 1.4 Redis事务historical

    1. Redis事务是什么 - 一步执行一组命令,有两点保证: - 事务中的所有指令是顺序执行的。也就是说执行这一组指令的过程中,其他客户端看不到中间状态 - 原子性。即所有命令要么都会执行,要么都不被执行。但是 如果中途有一个命令执行失败了,那么之前执行的命令不会回滚 2. Redis事务使用 2

  5. 1.5 Redis pipelinehistorical

    1. Redis pipeline是什么 - Redis的使用CS模型的,实现request/response协议的TCP服务器: - 客户端向服务器发送查询,并通常以阻塞的方式从套接字中读取服务器的响应。 - 服务器处理命令并将响应发送回客户端。 - 一次RTT(往返时间)大致250ms,即使服务

  6. 1.6 Redis pubsubhistorical

    1. Redis Pub/Sub是什么 publisher把消息丢给channel,有多个subcriber可以订阅这个channel。 类似于消息队列介绍.md的发布订阅模式,解耦了publisher和subcriber 2. Redis Pub/Sub使用 2.1. 基本使用 - 订阅者1订阅c

  7. 1.7 Redis Luahistorical

    1. Lua入门 Lua.md 2. Redis Lua使用 2.1. 执行Lua脚本 其中shop point和shop id list是KEYS,1和1600482998753是ARGV,KEYS和ARGV之间使用 , 分开 2.2. 调试Lua脚本 - 默认开启新的session,意味着服务器

  8. 1.8 使用Wireshark分析Redishistorical

    1. 选择localhost接口 2. 选择筛选6379端口 3. redis-cli发起命令 4. 追踪流 5. 分析包

  9. 1.9 Redis处理客户端连接historical

    1. 客户端连接处理过程 - 当客户端的连接被服务器accepted - 执行如下步骤 - 由于Redis使用multiplexing和non-blocking I/O,所以客户端socket处于非阻塞状态。 - 设置TCP NODELAY选项。这是为了确保我们的连接没有延迟。 - 创建可读文件事件

  10. 1.10 Redis信号处理historical

    1. 处理SIGTERM和SIGINT 告知redis优雅的关闭 - 如果有后台子进程在保存RDB或者执行AOF重写,那么kill掉这个子进程 - 如果AOF开启了,那么对AOF的文件描述符调用fsync以刷新磁盘buffer - 如果RDB开启了,那么按同步阻塞的方式保存RDB。 - 如果RDB无

  11. 1.11 Redis压测historical

    1. 压测Lua脚本 1. redis-cli加载Lua 2. redis-benchmark压测Lua 3. redis-benchmark压测pipeline 这个命令会把 evalsha d72ab028ab5ff319cf0979291745f98c099cecb2 1 test 10 5条

  12. 1.12 云Redishistorical

    1. 腾讯云Redis 基于VIP+LoadBalancer+Proxy+原生Redis-Cluster - VIP+LoadBalancer:就是北极星注册中心的寻址+负载均衡+健康检查+就近路由的功能 此 VIP 绑定了集群内部的所有数据节点,并提供负载均衡功能,用户所有请求会平均分布到集群的各

  13. 2.1 Redis BloomFilterhistorical

    1. Redis实现 - bit数组可以用redis的BitMaps实现 - 自动扩容可以使用一个cursor记录当前BitMaps的位置,达到饱和后再次创建一个同样大小的BitMaps。 - 如此get的逻辑就变成该元素是否在任意一个BitMaps中 - put的逻辑也是判断该元素不在任意一个Bi

  14. 2.2 Redis RateLimiterhistorical

    1. 是什么 - 基于Redis实现的限流 2. 计数器算法 2.1. 接口 2.1.1. 访问次数加一 - 参数:key - 返回: - 当前访问次数 - 访问次数重置的剩余时长 2.1.2. 获取当前访问次数 - 参数:key - 返回: - 当前访问次数 - 访问次数重置的剩余时长 2.2.

  15. 2.3 Redis数据结构historical

    1. Redis DB redisDb是Redis中表示Db的数据结构,里面包含了dict类型; dict是Redis中表示K、V的数据结构,里面包含了dictht类型; dictht是数组,数组中的每个元素是dictEntry;(即Redis用hash结构实现K、V) dictEntry的next

  16. 2.4 Redis异步队列historical

    1. 什么是异步队列 - 队列:先进先出 - 异步:有缓存区 - 说白了就是带缓冲区的生产者/消费者模型 2. 如何实现异步队列 2.1. rpush+lpop+sleep 一般使用 list 结构作为队列,rpush 生产消息,lpop 消费消息。当 lpop 没有消息的时候,要适当 sleep

  17. 2.5 Redis分布式锁historical

    1. Redis分布式锁是什么 基于Redis实现的分布式锁 2. Redis分布式锁实现 2.1. 单实例 2.1.1. 加锁 - 不存在的情况下set一个key - setnx用来保证原子性 - key用来保证互斥 - value用来保证加锁和解锁必须是同一客户端 - expx、time用来保证

  18. 2.6 Redis key 设计技巧historical

    1. MySQL- Redis 1.1. 单表 - 主键列 set 表名:主键名 主键值 - 其他列 set 表名:主键名:主键值:列名 列值 1.1.1. 用户表 根据primary key查询record - MySQL 用户表: userid username password email -

  19. 2.7 Redis命令historical

    1. Redis通用命令 - keys pattern 查询相应的key - 在redis里,允许模糊查询key,有3个通配符 , ? ,[] - : 通配任意多个字符 - ?: 通配单个字符 - []: 通配括号内的某1个字符 - redis-cli只能查出本节点的数据 - SCAN cursor

  20. 3.1 Redis线程模型historical

    1. Redis的Reactor模型 - 由四部分组成:多个socket、IO多路复用、文件事件分派器、事件处理器。 - 其中文件事件分派器消费队列是单线程的,所以Redis才叫单线程模型 - redis server打开了一个server socket监听客户端链接,并把这个socket注册到IO

  21. 3.2 Redis并发竞争问题historical

    1. 并发竞争问题是什么 假设price初始值为10,有两个连接需要对其执行+10操作,正确的结果应该是30 1. 连接1读取price为10 2. 连接2读取price为10 3. 连接1对price+10为20,写回 4. 连接2对price+10为20,写回 如上,最后的结果为20而不是30,

  22. 3.3 Redis慢查询historical

    1. Redis执行命令流程 - client发送命令给服务器 - 服务器将命令排队 - 服务器执行命令 - 慢查询统计的就是这个时间 - 服务器返回结果 2. 使用 2.1. 记录慢查询语句 2.2. 慢查询命令 2.3. 分析慢查询原因 - Redis bigkey.md 3. 实现 存储在内存

  23. 3.4 Redis阻塞historical

    1. 什么是Redis阻塞 - redis需要很长时间才能响应客户端请求 2. 为什么会发生阻塞 本质上是因为redis是单线程架构,命令执行在这个线程中完成 3. 如何发现阻塞 - 业务方的redis客户端连接redis服务器超时,触发监控告警 4. 原因分析 4.1. 内在 4.1.1. 使用了

  24. 3.5 Redis bigkeyhistorical

    1. 什么是big key - 针对value来说 - string类型:一般认为超过10KB - 其他类型:元素个数过多 2. big key的危害 - 超时阻塞:操作big key比较耗时 - 内存空间分配不均匀:比如redis cluster模式之下 - 大key读写瓶颈在CPU还是带宽?带宽

  25. 3.6 Redis hotkeyhistorical

    1. 什么是Redis hot key 某个key读写QPS超过了Redis单机QPS瓶颈,并且由于是一个key,无法用Redis Cluster分担压力 2. 如何发现Redis hot key - 业务服务metrics打点统计上报 - Redis proxy收集信息 每秒访问超过1W次的算作热

  26. 4.1 Redis Clusterhistorical

    1. 为什么需要redis cluster - 分布式系统分区.md 2. 什么是redis cluster - Redis的分布式方案,解决了主从复制写能力受到单机限制的问题和无法自动进行故障转移的问题 3. 如何搭建redis cluster 集群中可以有多个master,每个master可以由

  27. 4.2 Redis Sentinelhistorical

    1. 为什么需要Redis Sentinel - 主从复制无法自动进行故障转移 2. 什么是Redis Sentinel - Redis的高可用机制,解决了主从复制无法自动进行故障转移的问题 2.1. Redis Sentinel的功能 - Monitoring:持续地检查master或者repli

  28. 4.3 Redis Replicationhistorical

    1. 为什么需要Redis Replication - 分布式系统复制.md 2. 什么是Redis Replication - 把数据复制多个副本部署到其他机器 - 复制是Redis高可用(Redis Cluster/Redis Sentinel)的基础 2.1. Replication拓扑结构

  29. 5.1 Redis key过期策略historical

    1. Redis key过期什么 就是key设置了过期时间后什么时候会被真正删除 过期的精度是0-1ms 2. Redis key过期命令 - expire可以设置超时时间 - 如果key存在那么reply为1,如果key不存在那么返回0 - persist可以清除超时,将key变成永久的 - re

  30. 5.2 Redis内存管理historical

    1. 内存消耗划分 1.1. used memory - used memory=自身内存+对象内存+缓冲内存 1.1.1. 自身内存 redis进程,一般可以忽略 1.1.2. 对象内存 - sizeof(key)+sizeof(value) ,占用最大 - 解决 - 使用序列化缩减对象大小 -

  31. 5.3 Redis内存淘汰策略historical

    1. Redis内存淘汰策略是什么 Redis设置了最大内存之后, 如果空间满了,那么根据内存淘汰策略来处理。 2. 如何配置Redis内存淘汰策略 2.1. 淘汰策略 - noevicion - 禁止驱逐数据,新数据插入直接报错 - allkeys-lru - 从数据集中挑选最近最少使用的数据淘汰

  32. 5.4 Redis内存优化historical

    1. 聚合数据类型的底层编码 当hash、list、set仅由整数组成,zset的元素小于某个数量时会使用特殊编码。这个可以在 redis.conf 配置 2. 使用32bit实例 在32bit机器上编译的redis比在64bit上更省内存,并且32bit的实例能跑在64bit的机器上 3. 配置最