摘要:Redis是典型的单线程架构,所有的读写操作都是在一条主线程中完成的。当Redis用于高并发场景时, 这条线程就变成了它的生命线。 如果出现阻塞,哪怕是很短时间 对于我们的应用来说都是噩梦。导致阻塞问题的场景大致分为内在原因和外在原因:·内在原因包括: 不合理地使用API或数据结构、 CPU饱和、
阅读全文
随笔分类 - Redis开发与运维读书记录
摘要:建立复制 配置复制的方式有以下三种: 1) 在配置文件中加入slaveof{masterHost}{masterPort}随Redis启动生效。 2) 在redis-server启动命令后加入--slaveof{masterHost}{masterPort}生效。 3) 直接使用命令: slaveo
阅读全文
摘要:原理 从Redis 4版本之后,redis新增了混合持久化模式。 混合持久化同样也是通过bgrewriteaof完成的,不同的是当开启混合持久化时,fork出的子进程先将共享的内存副本全量的以RDB方式写入aof文件, 然后在将aof_rewrite_buf重写缓冲区的增量命令以AOF方式写入到文件
阅读全文
摘要:fork操作 当Redis做RDB或AOF重写时, 一个必不可少的操作就是执行fork操作创建子进程, 对于大多数操作系统来说fork是个重量级错误。 虽然fork创建的子进程不需要拷贝父进程的物理内存空间, 但是会复制父进程的空间内存页表。 例如对于10GB的Redis进程,需要复制大约20MB的
阅读全文
摘要:AOF( append only file) 持久化 以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的。 AOF的主要作用是解决了数据持久化的实时性, 目前已经是Redis持久化的主流方式。 理解掌握好AOF持久化机制对我们兼顾数据安全性和性能非常有帮助。 AOF
阅读全文
摘要:RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。 触发机制 手动触发 手动触发分别对应save和bgsave命令: ·save命令: 阻塞当前Redis服务器,直到RDB过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用。 ·bg
阅读全文
摘要:客户端通信协议 Redis制定了RESP(REdis Serialization Protocol, Redis序列化协议) 实现客户端与服务端的正常交互, 这种协议简单高效, 既能够被机器解析, 又容易被人类识别。 示例:客户端发送一条set hello world命令给服务端。按照RESP的标准
阅读全文
摘要:增加地理位置信息 geoadd key longitude latitude member [longitude latitude member ...] longitude、 latitude、 member分别是该地理位置的经度、 纬度、 成员 示例:geoadd cities:location
阅读全文
摘要:Redis提供了基于“发布/订阅”模式的消息机制,此种模式下,消息发布者和订阅者不进行直接通信, 发布者客户端向指定的频道(channel) 发布消息, 订阅该频道的每个客户端都可以收到该消息,如下图所示。 常用命令: 发布消息 publish channel message 示例: 127.0.0
阅读全文
摘要:HyperLogLog并不是一种新的数据结构(实际类型为字符串类型),而是一种基数算法, 通过HyperLogLog可以利用极小的内存空间完成独立总数的统计,数据集可以是IP、 Email、 ID等。 命令 添加 pfadd key element [element …] 向HyperLogLog添
阅读全文
摘要:Bitmaps本身不是一种数据结构,实际上它就是字符串 ,但是它可以对字符串的位进行操作。 Bitmaps单独提供了一套命令,所以在Redis中使用Bitmaps和使用字符串的方法不太相同。 可以把Bitmaps想象成一个以位为单位的数组,数组的每个单元只能存储0和1,数组的下标在Bitmaps中叫
阅读全文
摘要:为了保证多条命令组合的原子性, Redis提供了简单的事务功能以及集成Lua脚本来解决这个问题。 事务事务表示一组动作, 要么全部执行, 要么全部不执行。 Redis提供了简单的事务功能, 将一组需要一起执行的命令放到multi和exec两个命令之间。 multi命令代表事务开始, exec命令代表
阅读全文
摘要:Redis提供了批量操作命令(例如mget、 mset等) , 有效地节约RTT。 但大部分命令是不支持批量操作的, 例如要执行n次hgetall命令, 并没有mhgetall命令存在, 需要消耗n次RTT。 Pipeline(流水线) 机制能改善上面这类问题, 它能将一组Redis命令进行组装,
阅读全文
摘要:redis-cli 常用参数: -r (repeat) 选项代表将命令执行多次 -i(interval) 选项代表每隔几秒执行一次命令(单位是秒), 但是-i选项必须和-r选项一起使用 -x 代表从标准输入(stdin) 读取数据作为redis-cli的最后一个参数(示例: echo "world"
阅读全文
摘要:所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间, 当超过预设阀值, 就将这条命令的相关信息(例如: 发生时间, 耗时, 命令的详细信息) 记录下来。 一条客户端命令的生命周期 注:慢查询只统计步骤3的时间, 所以没有慢查询并不代表客户端没有超时问题。 慢查询的两个配置参数 slowlog
阅读全文
摘要:单个键管理 键重命名 rename key newkey newkey存在时会被强制覆盖 renamenx key newkey 只有newkey不存在时候才能执行成功 注意: ·由于重命名键期间会执行del命令删除旧的键, 如果键对应的值比较大, 会存在阻塞Redis的可能性, 这点不要忽视。 ·
阅读全文
摘要:有序集合保留了集合不能有重复成员的特性,但不同的是,有序集合中的元素可以排序。 有序集合和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个分数(score) 作为排序的依据。 列表、 集合、 有序集合三者的异同点 常用命令 集合内 添加成员 zadd key score member [s
阅读全文
摘要:集合(set) 类型也是用来保存多个的字符串元素, 但和列表类型不一样的是, 集合中不允许有重复元素, 并且集合中的元素是无序的, 不能通过索引下标获取元素 一个集合最多可以存储232-1个元素。 Redis除了支持集合内的增删改查,同时还支持多个集合取交集、 并集、 差集,合理地使用好集合类型,能
阅读全文
摘要:列表(list) 类型是用来存储多个有序的字符串 列表中的每个字符串称为元素(element) , 一个列表最多可以存储232-1个元素。 列表是一种比较灵活的数据结构, 它可以充当栈和队列的角色, 在实际开发上有很多应用场景 列表类型有两个特点: 第一、 列表中的元素是有序的,这就意味着可以通过索
阅读全文
摘要:几乎所有的编程语言都提供了哈希(hash) 类型, 它们的叫法可能是哈希、 字典、 关联数组 相关命令 设置值 hset key field value 获取值 hget key field 删除field hdel key field [field ...] 计算field个数 hlen key
阅读全文