从头开始学Redis
本专栏系统地梳理了Redis的各个核心知识点,并对其进行讲解和演示。
lwen.steven
学好Java,为公司“添砖加瓦”!
展开
-
9.4 缓存优化之无底洞
1.简介(1).问题描述2010年,Facebook有了3000个Memcache节点,但是发现一个问题,增加机器后性能没有提升反而下降了,这便是无底洞问题。(2).问题关键点执行一个命令,一次网络传输变成多次网络传输,增加了网络的开销。原创 2023-02-09 00:21:35 · 88 阅读 · 0 评论 -
9.3 缓存优化之雪崩
1.简介(1).问题描述由于cache服务承载大量请求,当cache服务异常或宕机时,流量直接压向储存层,导致存储层也无法提供服务,造成联级故障。原创 2023-02-09 00:21:26 · 55 阅读 · 0 评论 -
9.2 缓存优化之穿透
1.简介(1).问题描述当查询一个缓存和数据库库中都不存在的数据时(如书的编号从1到10000,但是请求的编号都是负数或者大于10000的数值),缓存层没有查询到数据将会查询存储层,而存储层也不存在并且不会将数据回写到缓存中,这将导致这个不存在的数据每次请求都要到存储层去查询,缓存层失去意义。当大流量流入时,可能因为频繁访问存储层导致DB宕机。原创 2023-02-09 00:20:43 · 55 阅读 · 0 评论 -
9.1 缓存优化之击穿
1.简介(1).问题描述如果有一个需求,需要查询数据库,这个查询比较耗时,且需要频繁的获取该内容(热点key),此时,可以利用Redis高QPS的特性,将查询结果设置一个满足业务需求的过期时间并写入Redis,来解决数据库查询慢的问题。但这也存在一个隐患,如果系统的并发很高,即在缓存失效的时间点,如果有大量请求打过来,由于Redis没有缓存数据,所有请求将会全部打到数据库上,此时数据库服务会面临非常大的风险,要么连接被占满,要么其他业务不可用,这就是Redis的缓存击穿问题。原创 2023-02-08 23:16:27 · 65 阅读 · 0 评论 -
8.7 Redis集群之故障自动转移
1.集群节点信息2.挂掉6375,观察6372是否会晋升为主节点继续提供服务。从上图中可以看到,6372晋升为主节点,并正常提供服务。可以看到,6375成为6372的从节点。4.重启6375节点,观察集群节点信息。6372是6375的从节点。3.6372节点日志变化。5.6375节点日志变化。原创 2023-02-01 23:15:44 · 276 阅读 · 0 评论 -
8.6 Redis集群之节点管理
当客户端向源节点发送一个命令,并且命令要处理的键恰好就属于正在转移的槽内,就会报ASK错误,解决方案为使用集群模式连接客户端。(1).将6377主节点上的哈希槽再放回6371。从6371节点取1000个槽给新节点6377。(2).将6378设置为6377的从节点。(3).将6377加入原集群。(2).杀死6378节点进程。(3).杀死6377节点进程。(1).非集群模式登录客户端。(2).查看原集群节点信息。(1).删除6378从节点。(2).删除6377主节点。(2).集群模式登录客户端。原创 2023-02-01 20:57:45 · 126 阅读 · 0 评论 -
8.5 Redis集群之检查命令和日志分析
如图所示,主节点6375有1个key,5461个solts(范围为10923-16383)和1个从节点。原创 2023-02-01 18:31:10 · 1215 阅读 · 0 评论 -
8.4 Redis集群之测试
连接6371,设置一个key username,可以看到key被运算到14315的槽上,14315槽位于121.4.191.137:6375节点,redis客户端直接重定向到121.4.191.137:6375节点。6376是6373的从节点,在从节点上执行READONLY命令,然后查询6375上的username信息,如果主从节点都没有key,还是会做转向。原创 2023-02-01 15:18:18 · 151 阅读 · 0 评论 -
8.3 Redis集群之搭建
这里只在121.4.211.73上创建2个节点,其它机器上操作一样,注意需要修改机器ip和端口,全局替换端口号使用“%s /6371/6372/g”命令。可以看到16384个槽的分配情况,以及三个master和slave节点的情况。(1).单台机器部署2个节点,在redis目录下创建如下文件。(2).创建集群配置文件。原创 2023-02-01 14:57:30 · 79 阅读 · 0 评论 -
8.2 Redis集群之数据分布
1.数据分布简介(1).分布式数据库的数据分区分布式数据库首先要解决把整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整体数据的一个子集。(2).常见的分区规则顺序分区哈希分区(Redis Cluster采用的分区规则)(3).常见分区规则的对比分区方法特点代表产品哈希分区离散度好;数据分布业务无关;无法顺序访问Redis Cluster;Cassandra;Dynamo顺序分区离散度易倾斜;数据分布业务相关;可顺序访原创 2021-03-26 00:50:57 · 1219 阅读 · 0 评论 -
8.1 Redis集群之简介
1.集群的历史并发量大了使用主从复制解决,主从稳定性使用哨兵解决,单节点存储能力和性能瓶颈使用Redis Cluster解决。Redis Cluster是Redis的分布式解决方案,在3.0版本正式推出,有效地解决了Redis分布式方面的需求。原创 2021-03-24 10:49:32 · 73 阅读 · 0 评论 -
7.4 Redis哨兵之实现原理
1.三个定时任务(1).每10秒infoSentinel每10秒会对master执行info操作,获取master的slave节点信息,Sentinel拿到slave信息之后,每10秒也会执行info操作,去发现slave的从节点。起到Sentinel感知Redis的作用。(2).每2秒发布订阅Sentinel之间通过master节点的_sentinel_:hello频道来交换信息,即每个Sentinel都会订阅_sentinel_:hello,然后向其发布信息以此来达到交换信息的目的。如果有新的原创 2021-03-24 00:51:09 · 836 阅读 · 0 评论 -
7.3 Redis哨兵之客户端连接
1.客户端实现基本原理(1).step1获取所有Sentinel节点和masterName,遍历Sentinel集合得到一个可用(即可以ping通)的Sentinel节点。(2).step2向可用的Sentinel节点发送Sentinel的get-master-addr-by-name的请求(参数masterName)来获取master节点信息。(3).step3客户端获取master节点后,会执行一次role或者role replication来验证其是否是master节点。(4).m原创 2021-03-23 19:11:56 · 2463 阅读 · 0 评论 -
7.2 Redis哨兵之安装配置
1.简介(1).流程配置开启主从节点配置开启Sentinel监控节点(Sentinel是特殊的Redis,默认端口26379)详细配置节点(2).服务器(三台服务器需要在同一网中)主节点:47.***.***.140从节点1:39.***.***.47从节点2:39.***.***.3(3).核心配置Sentinel的端口port 26379Sentinel的工作目录dir ./Sentinel的日志文件logfile "logfile.log"原创 2021-03-23 19:07:48 · 165 阅读 · 0 评论 -
7.1 Redis哨兵之简介
1.主从复制存在的问题(1).master故障对于master出现的故障,连接到master节点上的client将无法进行读写操作。连接到从节点上的只读客户端是正常的,对应的client服务可以正常使用。此时需要对这个故障进行手动处理,比较简单的方法是向一个slave执行slaveof no one命令,将其设为新的master,对另外的slave执行slaveof new master命令将其连接到新的master上。(2).存在的问题手动故障转移:处理故障是手动完成的,及时性低,另外如何去判原创 2021-03-21 01:05:26 · 132 阅读 · 0 评论 -
6.6 Redis主从复制之故障处理
1.无自动故障转移一主两从模型,当从节点1故障无法向Client提供服务时,无法将服务转移到从节点2上继续为Client提供服务。2.自动故障转移一主两从模型,当从节点1故障无法向Client提供服务时,将服务转移到从节点2上继续为Client提供服务。3.slave故障当一个slave出现故障,对于master来说没有太大的问题,除非maste的压力非常大,需要通过扩容再做一个新的slave来进行负载均衡。连接到故障slave节点上的client将无法读取到数据,此时需要将此client的请求连原创 2021-03-21 01:05:11 · 1100 阅读 · 0 评论 -
6.5 Redis主从复制之部分复制
1.简介全量复制除了上述的开销以外还存在一个问题,假如说master和slave之间的网络发生了抖动,那么一段时间内这些数据就会丢失,这段时间内master更新的数据slave是不知道的,最简单的方法是再做一次全量复制来拉取最新的数据。这样将大大消耗设备的性能,所以2.8版以后Redis提供了部分复制的功能。2.流程因为网络抖动导致master和slave断开连接master写命令时会向repl_back_buffer(复制缓冲区)写一份网络抖动结束,slave再次成功连上masterslav原创 2021-03-21 01:05:04 · 113 阅读 · 0 评论 -
6.4 Redis主从复制之全量复制
1.简介把一个存储了很多数据的主节点(master)数据全部同步给一个从节点(slave),在同步的过程中master写入的新数据也需要同步过来,这样才可以达到完整同步的效果。全量复制可以完成上述功能,首先将当前的RDB文件同步给slave,写入命令单独记录,当RDB文件加载完后,通过偏移量的对比将这期间产生的新数据命令同步给slave。2.流程首次同步时slave不知道master的runid和偏移量,slave将发送psync ? -1(psync是同步命令,可实现全量和部分复制的功能,这里有两原创 2021-03-21 01:04:57 · 354 阅读 · 0 评论 -
6.3 Redis主从复制之runid和偏移量
1.数据同步Redis在2.8及以上版本使用psync命令完成主从数据同步,同步过程分为全量复制和部分复制。(1).全量复制一般用于初次复制场景,Redis早期支持的复制功能只有全量复制,它会把主节点全部数据一次性发送给从节点,当数据量较大时,会对主从节点和网络造成很大的开销。(2).部分复制用于处理在主从复制中因网络闪断等原因造成的数据丢失场景,当从节点再次连上主节点后,如果条件允许,主节点会补发丢失数据给从节点。因为补发的数据远远小于全量数据,可以有效避免全量复制的过高开销。部分复制是对老版原创 2021-03-21 01:04:50 · 2953 阅读 · 0 评论 -
6.2 Redis主从复制之实现方式
1.命令方式(1).API设置为从节点(新增数据会同步)localhost:6379 > slaveof 127.0.0.1 6379查看节点主从属性(role的值)localhost:6379 > info replication取消复制localhost:6379 > slaveof no one(2).复制流程客户端执行slaveof命令从节点向客户端返回消息(异步过程)从节点从主节点复制数据(3).切主流程通过slaveof命令还可以实现切主原创 2021-03-21 01:04:41 · 393 阅读 · 0 评论 -
6.1 Redis主从复制之简介
1.单机存在的问题机器故障容量瓶颈QPS瓶颈2.什么是主从复制主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器,前者称为主节点(master),后者称为从节点(slave)。数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点,且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。3.主从复制的作用故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复。读写分离:可以用于实现读写分离,原创 2021-03-20 13:20:32 · 77 阅读 · 0 评论 -
5.3 Redis持久化之AOF
3.AOF(1).RDB存在的问题时间复杂度是O(n),比较耗时fork()操作需要需要消耗内存资源把内存数据写入磁盘,存在IO消耗不可控,出现宕机时会丢失数据(2).AOF简介AOF是指将执行的Redis命令保存在日志文件中,出现宕机后,通过重启操作可以将日志文件中的数据载入到Redis当中,以恢复数据。(3).策略alwayseverysecno(4).alwaysalways表示每条命令都执行fsync存到硬盘中,防止内容丢失。(5).everysecever原创 2021-03-20 01:12:15 · 133 阅读 · 0 评论 -
5.2 Redis持久化之RDB
1.简介(1).什么是RDBRDB持久化是指在指定的时间间隔内,使用命令的方式将内存中的数据写入磁盘RDB是默认的持久化方式,默认的文件名为dump.rdb。RDB文件还是一个复制媒介,可以使用RDB实现主从复制(2).恢复当Redis重新启动时,会从本地磁盘加载之前持久化的文件当恢复完成之后,再受理后续的请求操作(3).触发机制save(同步)bgsave(异步)自动生成2.save执行方式:客户端执行save命令,Redis将创建一个rdb文件同步:如果数据量较原创 2021-03-20 00:05:41 · 215 阅读 · 0 评论 -
5.1 Redis持久化之简介
1.持久化的作用Redis所有数据是保存在内存中的,对数据的更新将异步地保存到磁盘上,防止服务器宕机而引起的数据丢失。2.持久化的方式快照(如Mysql的Dump):某时某点数据的一个备份写日志(如Mysql的Binlog):数据库做了任何数据的更新,都记录在日志当中...原创 2021-03-20 00:05:01 · 84 阅读 · 0 评论 -
4.5 Redis之hyperloglog
1.简介基数统计的算法:在输入元素的数量或者体积非常大时,计算基数所需的空间总是固定的、并且是很小的。在Redis里面,每个hyperloglog键只需要花费12KB内存,就可以计算接近2^64个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。不返回输入的各个元素:hyperloglog只会根据输入元素来计算基数,而不会储存输入元素本身。误差:Redis中实现的HyperLogLog,只需要12K内存,在标准误差0.81%的前提下,能够统计2的64次方个数据,其本质上还是字原创 2021-03-20 00:04:41 · 135 阅读 · 0 评论 -
4.4 Redis之位图
1.简介如设置一个字符串的值为big,big是由三个字母b、i和g组成,每个字母都有一个ASCLL码,将ASCLL码值用对应的二进制表示,如下图所示,而Redis提供了可以操作位的功能。2.API给位图指定索引设置值setbit key offset value获取位图指定索引值getbit key offset获取位图指定范围位置为1的个数bitcount key [start end]3.使用案例-在线用户如果只是实时统计在线人数,直接用Redis中的incr原创 2021-03-20 00:02:13 · 64 阅读 · 0 评论 -
4.3 Redis之发布订阅
1.角色发布者(类似于Kafka的生产者)订阅者(类似于Kafka的消费者)频道(类似于Kafka的主题)2.API发布命令publish channel message订阅命令subcribe channel1,channel2......channelN取消订阅命令unsubcribe channel1,channel2......channelN3.消息队列消息队列发布消息后,只有一个订阅者能获取到这条信息。使用list数据结构来实现,并且使用阻塞的方原创 2021-03-20 00:01:40 · 73 阅读 · 0 评论 -
4.2 Redis之流水线
1.简介(1).什么是流水线(2).n个命令和pipeline操作对比命令n个命令操作pipeline时间n次网络 + n次命令1次网络 + n次命令数据量1条命令n条命令(3).注意点Redis的命令时间是微秒级别的。pipeline每次条数主要控制的是网络时间。2.客户端实现(1).非pipeline写法public class PipelineDemo { public static void main(String[] ar原创 2021-03-20 00:01:05 · 206 阅读 · 0 评论 -
4.1 Redis之慢查询
1.生命周期慢查询发生在第3阶段,是由命令引起的客户端超时不一定是慢查询,但慢查询是客户端超时的一个可能因素2.和慢查询相关的两个配置(1).showlog-max-len它决定slowlog最多能保存多少条日志, slowlog本身是一个FIFO队列,当队列大小超过slowlog-max-len时,最旧的一条日志将被删除,而最新的一条日志加入到slowlog。保存在内存内先进先出队列固定长度,慢查询长度默认值为128(2).showlog-log-slower-than它决原创 2021-03-20 00:00:34 · 213 阅读 · 2 评论 -
3.2 Jedis客户端之连接池
1.简介(1).为什么使用连接池首先Redis也是一种数据库,基于C/S模式的,因此如果需要使用必须建立连接,C/S模式本身就是一种远程通信的交互模式,因此Redis服务器可以单独作为一个数据库服务器独立存在。假设Redis服务器与客户端分处在异地,虽然基于内存的Redis数据库有着超高的性能,但是底层的网络通信却占用了一次数据请求的大量时间,因为每次数据交互都需要先建立连接。假设一次数据交互总共用时30ms,超高性能的Redis数据库处理数据所花的时间可能不到1ms,也即是说前期的连接占用了29ms,原创 2021-03-20 00:00:10 · 213 阅读 · 0 评论 -
3.1 Jedis客户端之直连
1.获取(1).简介Jedis是Redis官方首选的Java客户端开发包,是一个基于Java的redis-cli,遵循Redis提供的协议,对Redis进行操作。(2).Maven依赖<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.3.0</version></dependen原创 2021-03-19 23:51:01 · 303 阅读 · 0 评论 -
2.6 RedisAPI之zset
1.简介字符串键值结构(key score value)特点有序不重复支持集合间操作2.命令向集合内添加元素,element不可以重复但score是可以重复的zadd key score element时间复杂度为O(logN)删除元素zrem key element时间复杂度为O(1)返回元素的分数zscore key element时间复杂度为O(1)增加或减少元素的分数zincrby key increScore eleme原创 2021-03-19 23:49:55 · 167 阅读 · 0 评论 -
2.5 RedisAPI之set
1.简介字符串键值结构(key value)特点无序不重复支持集合间操作2.命令向集合内添加元素element,如果element已经存在则添加失败sadd key element时间复杂度为O(1)删除集合内的element元素srem key element时间复杂度为O(1)判断元素element是否在集合内sismember key element时间复杂度为O(1)返回集合长度scard key时间复杂度为O(1)原创 2021-03-19 23:49:27 · 100 阅读 · 0 评论 -
2.4 RedisAPI之list
1.简介字符串键值结构(key value)特点有序可重复左右两边都可插入和删除2.命令从列表右端插入值rpush key value1 value2 ......valueN时间复杂度为O(1~n)从列表左端插入值lpush key value1 value2 ......valueN时间复杂度为O(1~n)在list指定的值前|后掺入newValuelinsert key before|after value newValue时间复杂度原创 2021-03-19 23:48:45 · 124 阅读 · 0 评论 -
2.3 RedisAPI之hash
1.简介字符串键值结构(key field value)2.命令设置key对应的field的valuehset key field value时间复杂度为O(1)获取key对应的field的valuehget key field value时间复杂度为O(1)获取key对应的所有fieldhkeys key时间复杂度为O(n)返回key对应所有field的valuehvals key时间复杂度为O(n)返回key对应的所有field和原创 2021-03-19 23:47:57 · 129 阅读 · 0 评论 -
2.2 RedisAPI之string
1.简介字符串键值结构(key value)value的值小于512m,一般建议一个key-value的大小为100k使用场景缓存计数器分布式锁2.命令设置key-value不管key是否存在都设置set key valuekey不存在才设置setnx key valuekey存在才设置set key value xx时间复杂度为O(1)获取key对应的valueget key时间复杂度为O(1)key自增1,如果key不存在,原创 2021-03-19 23:47:20 · 137 阅读 · 0 评论 -
2.1 RedisAPI之简介
1.通用命令遍历所有keykeys *keys命令一般不在生产环境使用,主要原因是生产环境下通常有大量的key,列出所有key没有实际的意义并且会消耗很多内存资源。删除指定keydel key计算key的总数dbsize检查key是否存在exists keykey在seconds秒后过期expire key seconds查看key剩余的过期时间ttl key如果返回值为负数,说明该key已经过期,Redis会自动执行del key操作。原创 2021-03-19 23:45:35 · 114 阅读 · 0 评论 -
1.2 Redis之安装
1.版本解压(Linxu版)将Redis压缩包移动至/usr/local目录下,并命名为redis,通过以下命令进行安装。cd redismakecd srcmake install2.启动服务端打开一个命令行终端,在src目录下输入以下命令启动服务端。redis-server3.连接客户端另起一个命令行终端,在src目录下输入以下命令连接到服务端。redis-cli -h localhost -p 63794.远程连接注意点开放6379端口修改Redis配置localh原创 2021-03-19 23:45:03 · 95 阅读 · 0 评论 -
1.1 Redis之简介
1.简介Redis是一款开源免费的、基于内存的、高性能的、key-value型数据库。2.特点性能:Redis读的速度是110000次/s,写的速度是81000次/s数据持久化:可以将内存中的数据持久化到磁盘,重启时可再次加载使用数据类型:不仅支持简单的key-value类型的数据,还支持list、set、zset、hash等结构的数据类型功能:Redis还支持发布订阅、Pipeline、Bitmap和HyperLogLog等特性主从复制:支持master-slave模式的数据备份,为高可用原创 2021-03-19 23:44:27 · 104 阅读 · 0 评论 -
从头开始学Redis
第一章 概述1.1 Redis之简介1.2 Redis之安装第二章 API2.1 RedisAPI之简介2.2 RedisAPI之string2.3 RedisAPI之hash2.4 RedisAPI之list2.5 RedisAPI之set2.6 RedisAPI之zset第三章 客户端3.1 Redis客户端之直连3.2 Redis客户端之连接池第四章 特性功能4.1 Redis之慢查询4.2 Redis之流水线4.3 Redis之发布订阅4.4 Redis之位图原创 2021-03-19 23:43:52 · 87 阅读 · 0 评论