自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(3517)
  • 资源 (3)
  • 论坛 (1)

原创 Redis中的Sentinel 连接使用

Jedis 连接Sentinel(gupao-jedis:JedisSentinelTest.java)master name 来自于sentinel.conf 的配置。private static JedisSentinelPool createJedisPool() { String masterName = "redis-master"; Set<String> sentinels = new HashSet<String>(); sentinels.add("

2020-10-24 11:51:40 2

原创 Redis中的Sentinel 验证

启动Redis 服务和Sentinelcd /usr/local/soft/redis-5.0.5/src# 启动Redis 节点./redis-server ../redis.conf# 启动Sentinel 节点./redis-sentinel ../sentinel.conf# 或者./redis-server ../sentinel.conf --sentinel查看集群状态:redis> info replication203204 和205模

2020-10-24 11:46:20 1

原创 Redis中的Sentinel 配置

为了保证Sentinel 的高可用,Sentinel 也需要做集群部署,集群中至少需要三个Sentinel 实例(推荐奇数个,防止脑裂)。hostname IP 地址 节点角色&端口 master 192.168.8.203 Master:6379 / Sentinel : 26379 slave1 192.168.8.204 Slave :6379 / Sentinel : 26379 Slave2 192.168.8.205 Sla

2020-10-24 11:43:02 1

原创 Redis中的Sentinel 的功能总结

Monitoring. Sentinel constantly checks if your master and slave instances are working as expected.Notification. Sentinel can notify the system administrator, another computer programs, via an API, that something is wrong with one of the monitored Redis i

2020-10-24 11:37:52 1

原创 Redis中的Sentinel故障转移

问题:怎么让一个原来的slave 节点成为主节点?1、选出Sentinel Leader 之后,由Sentinel Leader 向某个节点发送slaveof no one命令,让它成为独立节点。2、然后向其他节点发送slaveof x.x.x.x xxxx(本机服务),让它们成为这个节点的子节点,故障转移完成。问题:这么多从节点,选谁成为主节点?关于从节点选举,一共有四个因素影响选举的结果,分别是断开连接时长、优先级排序、复制数量、进程id。如果与哨兵连接断开的比较久,超过了某个阈值,

2020-10-24 11:35:31 1

原创 Redis中的可用性保证之Sentinel的Ratf 算法

在分布式存储系统中,通常通过维护多个副本来提高系统的可用性,那么多个节点之间必须要面对数据一致性的问题。Raft 的目的就是通过复制的方式,使所有节点达成一致,但是这么多节点,以哪个节点的数据为准呢?所以必须选出一个Leader。大体上有两个步骤:领导选举,数据复制。Raft 是一个共识算法(consensus algorithm)。比如比特币之类的加密货币,就需要共识算法。Spring Cloud 的注册中心解决方案Consul 也用到了Raft 协议。Raft 的核心思想:先到先得,少数服从

2020-10-24 11:28:10 5

原创 Redis中的可用性保证之Sentinel故障转移

如果master 被标记为下线,就会开始故障转移流程。既然有这么多的Sentinel 节点,由谁来做故障转移的事情呢?故障转移流程的第一步就是在Sentinel 集群选择一个Leader,由Leader 完成故障转移流程。Sentinle 通过Raft 算法,实现Sentinel 选举。...

2020-10-24 11:11:08 2

原创 Redis中的可用性保证之Sentinel服务下线

Sentinel 默认以每秒钟1 次的频率向Redis 服务节点发送PING 命令。如果在down-after-milliseconds 内都没有收到有效回复,Sentinel 会将该服务器标记为下线(主观下线)。# sentinel.confsentinel down-after-milliseconds <master-name> <milliseconds>这个时候Sentinel 节点会继续询问其他的Sentinel 节点,确认这个节点是否下线,如果多数Senti

2020-10-24 11:10:13 3

原创 Redis中的可用性保证之Sentinel 原理

如何实现主从的自动切换?我们的思路:创建一台监控服务器来监控所有Redis 服务节点的状态,比如,master 节点超过一定时间没有给监控服务器发送心跳报文,就把master 标记为下线,然后把某一个slave变成master。应用每一次都是从这个监控服务器拿到master 的地址。问题是:如果监控服务器本身出问题了怎么办?那我们就拿不到master 的地址了,应用也没有办法访问。那我们再创建一个监控服务器,来监控监控服务器……似乎陷入死循环了,这个问题怎么解决?这个问题先放着。Redis

2020-10-24 11:07:38 9

原创 Redis中的主从复制的不足

主从模式解决了数据备份和性能(通过读写分离)的问题,但是还是存在一些不足:1、RDB 文件过大的情况下,同步非常耗时。2、在一主一从或者一主多从的情况下,如果主服务器挂了,对外提供的服务就不可用了,单点问题没有得到解决。如果每次都是手动把之前的从服务器切换成主服务器,这个比较费时费力,还会造成一定时间的服务不可用。...

2020-10-24 10:59:16 8

原创 Redis中的主从复制原理

连接阶段1、slave node 启动时(执行slaveof 命令),会在自己本地保存master node 的信息,包括master node 的host 和ip。2、slave node 内部有个定时任务replicationCron(源码replication.c),每隔1秒钟检查是否有新的master node 要连接和复制,如果发现,就跟master node 建立socket 网络连接,如果连接成功,从节点为该socket 建立一个专门处理复制工作的文件事件处理器,负责后续的复制工作,如

2020-10-24 10:50:00 2

原创 Redis 主从复制(replication)

主从复制配置例如一主多从,203 是主节点,在每个slave 节点的redis.conf 配置文件增加一行slaveof 192.168.8.203 6379// 在主从切换的时候,这个配置会被重写成:# Generated by CONFIG REWRITEreplicaof 192.168.8.203 6379或者在启动服务时通过参数指定master 节点:./redis-server --slaveof 192.168.8.203 6379或在客户端直接执行slav

2020-10-24 10:36:32 4

原创 为什么需要Redis 集群

为什么需要集群?性能Redis 本身的QPS 已经很高了,但是如果在一些并发量非常高的情况下,性能还是会受到影响。这个时候我们希望有更多的Redis 服务来完成工作。扩展第二个是出于存储的考虑。因为Redis 所有的数据都放在内存中,如果数据量大,很容易受到硬件的限制。升级硬件收效和成本比太低,所以我们需要有一种横向扩展的方法。可用性第三个是可用性和安全的问题。如果只有一个Redis 服务,一旦服务宕机,那么所有的客户端都无法访问,会对业务造成很大的影响。另一个,如果硬件发生故障,而

2020-10-24 10:26:39 6

原创 RDB 文件的优势和劣势

一、优势1.RDB 是一个非常紧凑(compact)的文件,它保存了redis 在某个时间点上的数据集。这种文件非常适合用于进行备份和灾难恢复。2.生成RDB 文件的时候,redis 主进程会fork()一个子进程来处理所有保存工作,主进程不需要进行任何磁盘IO 操作。3.RDB 在恢复大数据集时的速度比AOF 的恢复速度要快。二、劣势1、RDB 方式数据没办法做到实时持久化/秒级持久化。因为bgsave 每次运行都要执行fork 操作创建子进程,频繁执行成本过高。2、在一定间隔时间

2020-10-18 18:05:25 37 1

原创 Redis的持久化机制

https://redis.io/topics/persistenceRedis 速度快,很大一部分原因是因为它所有的数据都存储在内存中。如果断电或者宕机,都会导致内存中的数据丢失。为了实现重启后数据不丢失,Redis 提供了两种持久化的方案,一种是RDB 快照(Redis DataBase),一种是AOF(Append Only File)。RDBRDB 是Redis 默认的持久化方案。当满足一定条件的时候,会把当前内存中的数据写入磁盘,生成一个快照文件dump.rdb。Redis 重启.

2020-10-18 17:58:45 40

原创 Redis LRU 淘汰原理

思考(作业):基于一个数据结构做缓存,怎么实现LRU——最长时间不被访问的元素在超过容量时删除?问题:如果基于传统LRU 算法实现Redis LRU 会有什么问题?需要额外的数据结构存储,消耗内存。Redis LRU 对传统的LRU 算法进行了改良,通过随机采样来调整算法的精度。如果淘汰策略是LRU,则根据配置的采样值maxmemory_samples(默认是5 个),随机从数据库中选择m 个key, 淘汰其中热度最低的key 对应的缓存数据。所以采样参数m 配置的数值越大, 就越能精确的查

2020-10-18 17:51:05 24

原创 Redis中的淘汰策略

Redis 的内存淘汰策略,是指当内存使用达到最大内存极限时,需要使用淘汰算法来决定清理掉哪些数据,以保证新数据的存入。最大内存设置redis.conf 参数配置:# maxmemory <bytes>如果不设置maxmemory 或者设置为0,64 位系统不限制内存,32 位系统最多使用3GB 内存。动态修改:redis> config set maxmemory 2GB到达最大内存以后怎么办?淘汰策略https://redis.io/..

2020-10-18 17:45:06 24

原创 Redis中的过期策略

Reids 所有的数据都是存储在内存中的,在某些情况下需要对占用的内存空间进行回收。内存回收主要分为两类,一类是key 过期,一类是内存使用达到上限(max_memory)触发内存淘汰。过期策略要实现key 过期,我们有几种思路。定时过期(主动淘汰)每个设置过期时间的key 都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU 资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。惰性过期(被动淘汰)只有当...

2020-10-18 17:39:56 19

原创 Redis中的I/O 多路复用(I/O Multiplexing)

I/O 指的是网络I/O。多路指的是多个TCP 连接(Socket 或Channel)。复用指的是复用一个或多个线程。它的基本原理就是不再由应用程序自己监视连接,而是由内核替应用程序监视文件描述符。客户端在操作的时候,会产生具有不同事件类型的socket。在服务端,I/O 多路复用程序(I/O Multiplexing Module)会把消息放入队列中,然后通过文件事件分派器(File event Dispatcher),转发到不同的事件处理器中。多路复用有很多的实现,以select 为

2020-10-18 17:32:34 21

原创 传统I/O 数据拷贝

以读操作为例:当应用程序执行read 系统调用读取文件描述符(FD)的时候,如果这块数据已经存在于用户进程的页内存中,就直接从内存中读取数据。如果数据不存在,则先将数据从磁盘加载数据到内核缓冲区中,再从内核缓冲区拷贝到用户进程的页内存中。(两次拷贝,两次user 和kernel 的上下文切换)。I/O 的阻塞到底阻塞在哪里?Blocking I/O当使用read 或write 对某个文件描述符进行过读写时,如果当前FD 不可读,系统就不会对其他的操作做出响应。从设备复制数据到内核缓冲区是阻

2020-10-18 17:29:31 24 1

原创 文件描述符FD

Linux 系统将所有设备都当作文件来处理,而Linux 用文件描述符来标识每个文件对象。文件描述符(File Descriptor)是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有执行I/O 操作的系统调用都通过文件描述符;文件描述符是一个简单的非负整数,用以表明每个被进程打开的文件。Linux 系统里面有三个标准文件描述符。0:标准输入(键盘);1:标准输出(显示器);2:标准错误输出(显示器)。...

2020-10-18 17:19:50 54

原创 进程的阻塞

正在运行的进程由于提出系统服务请求(如I/O 操作),但因为某种原因未得到操作系统的立即响应,该进程只能把自己变成阻塞状态,等待相应的事件出现后才被唤醒。进程在阻塞状态不占用CPU 资源。...

2020-10-18 17:18:13 47

原创 进程切换(上下文切换)

多任务操作系统是怎么实现运行远大于CPU 数量的任务个数的?当然,这些任务实际上并不是真的在同时运行,而是因为系统通过时间片分片算法,在很短的时间内,将CPU 轮流分配给它们,造成多任务同时运行的错觉。为了控制进程的执行,内核必须有能力挂起正在CPU 上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换。什么叫上下文?在每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好CPU 寄存器和程序计数器(Program Counter

2020-10-18 17:14:45 44

原创 用户user空间和内核kernel空间

为了避免用户进程直接操作内核,保证内核安全,操作系统将虚拟内存划分为两部分,一部分是内核空间(Kernel-space)/ˈkɜːnl /,一部分是用户空间(User-space)。内核是操作系统的核心,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的权限。内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们都处于虚拟空间中,都是对物理地址的映射。在Linux 系统中, 内核进程和用户进程所占的虚拟内存比例是

2020-10-18 17:06:06 14

原创 虚拟存储器(虚拟内存Vitual Memory)

因为Redis 是基于内存的操作,我们先从内存开始说起。虚拟存储器(虚拟内存Vitual Memory)名词解释:主存:内存;辅存:磁盘(硬盘)计算机主存(内存)可看作一个由M 个连续的字节大小的单元组成的数组,每个字节有一个唯一的地址,这个地址叫做物理地址(PA)。早期的计算机中,如果CPU 需要内存,使用物理寻址,直接访问主存储器。这种方式有几个弊端:1、在多用户多任务操作系统中,所有的进程共享主存,如果每个进程都独占一块物理地址空间,主存很快就会被用完。我们希望在不同的时刻,不同的

2020-10-18 16:59:00 23

原创 Redis 为什么是单线程的?

不是白白浪费了CPU 的资源吗?https://redis.io/topics/faq#redis-is-single-threaded-how-can-i-exploit-multiple-cpu--cores因为单线程已经够用了,CPU 不是redis 的瓶颈。Redis 的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且CPU 不会成为瓶颈,那就顺理成章地采用单线程的方案了。...

2020-10-18 16:52:12 29

原创 Redis为什么这么快?

总结:1)纯内存结构、2)单线程、3)多路复用内存KV 结构的内存数据库,时间复杂度O(1)。第二个,要实现这么高的并发性能,是不是要创建非常多的线程?恰恰相反,Redis 是单线程的。单线程单线程有什么好处呢?1、没有创建线程、销毁线程带来的消耗2、避免了上线文切换导致的CPU 消耗3、避免了线程之间带来的竞争问题,例如加锁释放锁死锁等等异步非阻塞异步非阻塞I/O,多路复用处理并发连接。...

2020-10-18 16:44:15 27 1

原创 Redis 到底有多快?

https://redis.io/topics/benchmarkscd /usr/local/soft/redis-5.0.5/srcredis-benchmark -t set,lpush -n 100000 -q结果(本地虚拟机):SET: 51813.47 requests per second —— 每秒钟处理5 万多次set 请求LPUSH: 51706.31 requests per second —— 每秒钟处理5 万多次lpush 请求redis-benchmark

2020-10-18 16:41:52 15

原创 Redis中的Lua脚本超时

Redis 的指令执行本身是单线程的,这个线程还要执行客户端的Lua 脚本,如果Lua脚本执行超时或者陷入了死循环,是不是没有办法为客户端提供服务了呢?eval 'while(true) do end' 0为了防止某个脚本执行时间过长导致Redis 无法提供服务, Redis 提供了lua-time-limit 参数限制脚本的最长运行时间,默认为5 秒钟。lua-time-limit 5000(redis.conf 配置文件中)当脚本运行时间超过这一限制后,Redis 将开始接受其他命令但

2020-10-18 16:39:09 18

原创 Redis中缓存Lua 脚本

为什么要缓存在脚本比较长的情况下,如果每次调用脚本都需要把整个脚本传给Redis 服务端,会产生比较大的网络开销。为了解决这个问题,Redis 提供了EVALSHA 命令,允许开发者通过脚本内容的SHA1 摘要来执行脚本。如何缓存Redis 在执行script load 命令时会计算脚本的SHA1 摘要并记录在脚本缓存中,执行EVALSHA 命令时Redis 会根据提供的摘要从脚本缓存中查找对应的脚本内容,如果找到了则执行脚本,否则会返回错误:"NOSCRIPT No matching scri

2020-10-18 16:26:29 19

原创 Redis中的Lua 脚本

Lua/ˈluə/是一种轻量级脚本语言,它是用C 语言编写的,跟数据的存储过程有点类似。使用Lua 脚本来执行Redis 命令的好处:1、一次发送多个命令,减少网络开销。2、Redis 会将整个脚本作为一个整体执行,不会被其他请求打断,保持原子性。3、对于复杂的组合命令,我们可以放在文件中,可以实现程序之间的命令集复用。在Redis 中调用Lua 脚本使用eval /ɪ'væl/ 方法,语法格式:redis> eval lua-script key-num [key1 .

2020-10-18 16:01:45 35

原创 Redis事务

https://redis.io/topics/transactions/http://redisdoc.com/topic/transaction.html为什么要用事务我们知道Redis 的单个命令是原子性的(比如get set mget mset),如果涉及到多个命令的时候,需要把多个命令作为一个不可分割的处理序列,就需要用到事务。例如我们之前说的用setnx 实现分布式锁,我们先set,然后设置对key 设置expire,防止del 发生异常的时候锁不会被释放,业务处理完了以后再de

2020-10-18 15:40:17 25

原创 Redis中的发布订阅模式

列表的局限前面我们说通过队列的rpush 和lpop 可以实现消息队列(队尾进队头出),但是消费者需要不停地调用lpop 查看List 中是否有等待处理的消息(比如写一个while 循环)。为了减少通信的消耗,可以sleep()一段时间再消费,但是会有两个问题:1、如果生产者生产消息的速度远大于消费者消费消息的速度,List 会占用大量的内存。2、消息的实时性降低。list 还提供了一个阻塞的命令:blpop,没有任何元素可以弹出的时候,连接会被阻塞。blpop queue 5基于

2020-10-18 15:27:04 15

原创 Redis中的zset 存储结构(实现)原理

同时满足以下条件时使用ziplist 编码:元素数量小于128 个所有member 的长度都小于64 字节在ziplist 的内部,按照score 排序递增来存储。插入的时候要移动之后的数据。对应redis.conf 参数:zset-max-ziplist-entries 128zset-max-ziplist-value 64超过阈值之后,使用skiplist+dict 存储。问题:什么是skiplist?我们先来看一下有序链表:在这样一个链表中,如果我们要查找

2020-10-18 12:41:48 47

原创 Redis中的zset 有序集合

存储类型sorted set,有序的set,每个元素有个score。score 相同时,按照key 的ASCII 码排序。数据结构对比:数据结构 是否允许重复元素 是否有序 有序实现方式 列表list 是 是 索引下标 集合set 否 否 无 有序集合zset 否 是 分值score 操作命令添加元素zadd myzset 10 java 20 php 30 r...

2020-10-18 12:28:14 11

原创 Redis中的set应用场景

抽奖随机获取元素spop myset点赞、签到、打卡这条微博的ID 是t1001,用户ID 是u3001。用like:t1001 来维护t1001 这条微博的所有点赞用户。点赞了这条微博:sadd like:t1001 u3001取消点赞:srem like:t1001 u3001是否点赞:sismember like:t1001 u3001点赞的所有用户:smembers like:t1001点赞数:scard like:t1001比关系型数据库简单许多。.

2020-10-18 12:16:21 59

原创 Redis张工的set存储结构(实现)原理

Redis 用intset 或hashtable 存储set。如果元素都是整数类型,就用inset 存储。如果不是整数类型,就用hashtable(数组+链表的存来储结构)。问题:KV 怎么存储set 的元素?key 就是元素的值,value 为null。如果元素个数超过512 个,也会用hashtable 存储。配置文件redis.confset-max-intset-entries 512127.0.0.1:6379> sadd iset 1 2 3 4 5 6(int

2020-10-18 12:04:02 12 1

原创 Redis中的set 集合

存储类型String 类型的无序集合,最大存储数量2^32-1(40 亿左右)。操作命令添加一个或者多个元素sadd myset a b c d e f g获取所有元素smembers myset统计元素个数scard myset随机获取一个元素srandmember key随机弹出一个元素spop myset移除一个或者多个元素srem myset d e f查看元素是否存在sismember myset a...

2020-10-18 11:58:06 12

原创 list-应用场景

用户消息时间线timeline因为List 是有序的,可以用来做用户时间线消息队列List 提供了两个阻塞的弹出操作:BLPOP/BRPOP,可以设置超时时间。BLPOP:BLPOP key1 timeout 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。BRPOP:BRPOP key1 timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。队列:先进先出:rpush blpop,左头右

2020-10-18 11:52:51 6

原创 List-存储原理(quicklist)

在早期的版本中,数据量较小时用ziplist 存储,达到临界值时转换为linkedlist 进行存储,分别对应OBJ_ENCODING_ZIPLIST 和OBJ_ENCODING_LINKEDLIST 。3.2 版本之后,统一用quicklist 来存储。quicklist 存储了一个双向链表,每个节点都是一个ziplist。127.0.0.1:6379> object encoding queue"quicklist"quicklistquicklist(快速列表)是ziplis

2020-10-18 11:45:16 5

score.csv (score.csv)

load data local inpath '/export/servers/hivedatas/score.csv' into table score2 partition(year='2018',

2020-02-29

teacher.csv

load data local inpath '/export/servers/hivedatas/student.csv' overwrite into table student;

2020-02-29

student.csv

load data local inpath '/export/servers/hivedatas/student.csv' into table student;

2020-02-29

Leon_Jinhai_Sun的留言板

发表于 2020-01-02 最后回复 2020-04-10

空空如也
提示
确定要删除当前文章?
取消 删除