08 2021 档案
摘要:前言 在分布式系统中为了解决单点问题,通常会把数据复制多个副本部署到 其他机器,满足故障恢复和负载均衡等需求。Redis也是如此,它为我们提 供了复制功能,实现了相同数据的多个Redis副本。复制功能是高可用Redis 的基础,后面章节的哨兵和集群都是在复制的基础上实现高可用的。 正文 参与复制的R
阅读全文
摘要:前言 Redis持久化功能一直是影响Redis性能的高发地,简单介绍一下持久化的问题定位和优化。 正文 当Redis做RDB或AOF重写时,一个必不可少的操作就是执行fork操作创 建子进程,对于大多数操作系统来说fork是个重量级错误。 虽然fork创建的 子进程不需要拷贝父进程的物理内存空间,但
阅读全文
摘要:前言 简单介绍一下AOF。 正文 AOF(append only file)持久化:以独立日志的方式记录每次写命令, 重启时再重新执行AOF文件中的命令达到恢复数据的目的。 AOF的主要作用 是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式。理解 掌握好AOF持久化机制对我们兼顾数据
阅读全文
摘要:前言 简单介绍一下redis的持久化。先来整理一下RDB。 正文 redis 支持RDB 和 AOF两种持久化机制,他们能达到的效果不一致。 那么先来看一下RDB吧。 RDB 是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和主动触发。 那么这里就有两个关键字了,一个是是保
阅读全文
摘要:前言 简单整理一下客户端案例分析。 正文 现象一: 服务端现象:Redis主节点内存陡增,几乎用满maxmemory,而从节点 内存并没有变化。 客户端现象:客户端产生了OOM异常,也就是Redis主节点使用的内存 已经超过了maxmemory的设置,无法写入新的数据. 2.分析原因 1)确实有大量
阅读全文
摘要:前言 这个还是比较常见的,也就是比较对开发有用的部分。 正文 1.无法从连接池获取到连接 JedisPool中的Jedis对象个数是有限的,默认是8个。这里假设使用的默 认配置,如果有8个Jedis对象被占用,并且没有归还,此时调用者还要从 JedisPool中借用Jedis,就需要进行等待(例如设
阅读全文
摘要:前文 简单介绍一下CEO。 正文 Redis3.2版本提供了GEO(地理信息定位)功能,支持存储地理位置信 息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能,对于需 要实现这些功能的开发者来说是一大福音。 longitude、latitude、member分别是该地理位置的经度、纬度、成员
阅读全文
摘要:前言 简单介绍一下客户端的通信协议。 正文 第 一,客户端与服务端之间的通信协议是在TCP协议之上构建的。 第二, Redis制定了RESP(REdis Serialization Protocol,Redis序列化协议)实现客户端与服务端的正常交互,这种协议简单高效,既能够被机器解析,又容易 被人
阅读全文
摘要:前言 简单介绍一下客户端管理。 正文 Redis提供了客户端相关API对其状态进行监控和管理,这个一般有很多工具了,看看就好,没有必要去细看。
阅读全文
摘要:前言 简单介绍一下java客户端jedis。 正文 Java有很多优秀的Redis客户端(详见:http://redis.io/clients#java),这 里介绍使用较为广泛的客户端Jedis,本节将按照以下几个方面对Jedis进行 介绍: ·Jedis的基本使用 ·Jedis连接池使用 ·Je
阅读全文
摘要:前言 简单介绍一下redis的发布与订阅。 正文 Redis提供了基于“发布/订阅”模式的消息机制,此种模式下,消息发布 者和订阅者不进行直接通信,发布者客户端向指定的频道(channel)发布消 息,订阅该频道的每个客户端都可以收到该消息. 命令 Redis主要提供了发布消息、订阅频道、取消订阅以
阅读全文
摘要:前言 简单介绍一下HyperLogLog. 正文 HyperLogLog并不是一种新的数据结构(实际类型为字符串类型),而 是一种基数算法,通过HyperLogLog可以利用极小的内存空间完成独立总数 的统计,数据集可以是IP、Email、ID等。HyperLogLog提供了3个命令: pfadd、
阅读全文
摘要:前言 简单介绍一下bitmaps这个东西。 正文 我们都知道bitmaps 翻译过来就是二进制。 那么二进制可以存一些什么呢? 图片、视频,还可也存些什么呢? 现代计算机用二进制(位)作为信息的基础单位,1个字节等于8位,例 如“big”字符串是由3个字节组成,但实际在计算机存储时将其用二进制表 示
阅读全文
摘要:前言 简单介绍一下Lua。 正文 为了保证多条命令组合的原子性,Redis提供了简单的事务功能以及集 成Lua脚本来解决这个问题。 前面提及到pipline,也提及到pipline 并不是原子性的,如果多条命令想达到一定的原子性怎么破呢? 多条语句达到原子性,一般而言,我们想到的会是事务。 简单地说
阅读全文
摘要:前言 简单整理一下pipeline。 正文 1)发送命令 2)命令排队 3)命令执行 4)返回结果 其中1)+4)称为Round Trip Time(RTT,往返时间)。 pipeline它能将一组Redis命令进 行组装,通过一次RTT传输给Redis,再将这组Redis命令的执行结果按顺序返回给
阅读全文
摘要:前言 简单介绍一下redis的shell命令。 正文 redis 提供了一些工具,如redis-cli、redis-server、redis-benchmark等。 redis-cli -r 对redis服务ping3次。 -i 每一秒ping一次。 -x选项代表从标准输入(stdin)读取数据作为
阅读全文
摘要:前言 简单整理一下redis的慢查询。 正文 什么是慢查询呢? 一般存储系统就是系统在命令执行前后计算每条命令的执行时间,当超出预设阀值,就将这条命令的相关信息记录下来。 但是有人可能没有看到慢查询日志,就以为服务是正常得到。 实际上客户端超时访问有很多情况,起码有个网络,但是现在一般不会出现这种情
阅读全文
摘要:前言 简单整理一下redis的键管理。 正文 单个键管理 键重命名 rename key newkey 为了防止被强行rename,Redis提供了renamenx命令,确保只有newKey 不存在时候才被覆盖,例如下面操作renamenx时,newkey=python已经存在, 返回结果是0代表没
阅读全文
摘要:前言 简单介绍一下集合的基本结构和命令。 正文 集合(set)类型也是用来保存多个的字符串元素,但和列表类型不一 样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过 索引下标获取元素。 一个集合最多可以存储232-1个元 素。Redis除了支持集合内的增删改查,同时还支持多个集合取交
阅读全文
摘要:前言 简单整理一下redis的列表。 正文 列表(list)类型是用来存储多个有序的字符串,如图2-18所示,a、 b、c、d、e五个元素从左到右组成了一个有序的列表,列表中的每个字符串 称为元素(element),一个列表最多可以存储232-1个元素。 在Redis中,可 以对列表两端插入(pus
阅读全文
摘要:前言 简单介绍一下redis的有序集合的基本结构和命令。 正文 有序集合相对于哈希、列表、集合来说会有一点点陌生,但既然叫有序 集合,那么它和集合必然有着联系,它保留了集合不能有重复成员的特性, 但不同的是,有序集合中的元素可以排序。 但是它和列表使用索引下标作为 排序依据不同的是,它给每个元素设置
阅读全文
摘要:前言 简单介绍一下哈希基本结构和命令。 正文 什么是hash呢? hash也可以叫做字典、关联数组。 哈希类型是键本身又是一个键值对结构: value={{field1,value1},...{fieldN,valueN}} 哈希类型中的映射关系叫作field-value,注意这里的value是指f
阅读全文
摘要:前言 简单介绍一下redis的基本结构和命令。 正文 redis有5种基本结构: 字符串 哈希 列表 集合 有序集合 那么就来看下其基本命令吧。 通用命令键: keys * 查看全部键,一般不怎么用。 dbsize 查看有多少键 dbsize 效率比较高,直接读取的redis内部缓存的值。 exit
阅读全文
摘要:前言 简单整理一下redis。 正文 为什么使用redis? 速度快 1.1 内存执行 1.2 c语言编写,速度相对快一些 1.3 单线程,比较符合这种存储模式 2 丰富的数据结构 3 丰富的功能机制 -3.1 提供键过期机制,提供了缓存功能。 -3.2 提供发布订阅功能,用来实现消息系统。 -3.
阅读全文
摘要:前言 简单介绍一下swarm。 正文 前提,docker 安装。 有3台机器,全部按照了docker。 现在开始搭建集群。 首先需要初始化: 然后需要注入: 注入之后,那么需要就是启动节点加入进来,那么怎么加入进来呢? To add a worker to this swarm, run the f
阅读全文
摘要:前言 简单介绍一下docker compose。 正文 首先进行下载一下。 sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)"
阅读全文
摘要:前言 看下如何自定义网络。 正文 在了解自定义网络之前呢? 需要明白一件事。 就是其实我们在启动docker的时候是有默认参数的。 docker run -d -p --name tomcat01 --net bridge tomcat 也就是默认使用bridge网络。 这个bridge 网络是什么
阅读全文
摘要:前言 简单介绍一下docker 网络。 正文 使用ip addr。 可以看到网络。 有一个虚拟网卡: 那么基本上容器就处于这样的模式了。 那么也就是所有容器都在同一网关下面了。 那么问题来了,理论上容器之间应该是可以互相访问的。 启动容器: docker run -d -p 8081:8080 --
阅读全文
摘要:前言 简单介绍一下多个容器间容器卷共享。 正文 先启动上一节的test:2.0 这个镜像。 docker run --name test01 -it test:2.0 /bin/bash 然后 ctrl+p+q进行不中断容器退出。 docker run --name test02 --volumes
阅读全文
摘要:前言 简单介绍一下dockerfile。 正文 dockerfile就是docker image的构建文件。 然后来运行一下。 然后就产生了test:1.0 这个镜像。 然后启动一下你就发现了这个镜像没有启动成功。 这是为什么呢? 使用docker ps -a。 很简单,因为启动后容器就退出了,因为
阅读全文
摘要:前言 简单整理一下具名挂载和匿名挂载。 正文 来看一下匿名挂载。 这里-v指定了容器内部的路径,但是没有指定容器外部的路径,那么挂载到了什么地方。 用inspect 查看一下。 挂载到这个位置了。 然后看下具名挂载: docker run -d --name nginx02 -v juming-ng
阅读全文
摘要:前言 简单介绍一下mysql容器。 正文 这里简单介绍一下mysql的容器。 hub.docker.io给了我们一个启动的示例。 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag 那么我们填上信
阅读全文