那些年你不能错过的之【Redis】
大家好,我是小菜,一个盼望在互联网行业做到蔡不菜的小菜。可柔可刚,点赞则柔,白嫖则刚!
死鬼~看完记住给我来个三连哦!

本文首要介绍
Redis相关内容
如有需求,可以参阅
如有协助,不忘点赞 ❥
创造不易,白嫖无义!} _ & 5 – p ? U D

1) 什么是 Redis
- Redis(Remote Dictionary Serve} x = _ & _ e tr)是一个运用C言语 编写的,开源的(BSD答应)高功用非联络型(NoSQL)Q J – S K 的键值对数据库
- Redis可以存储键和五种不同` J w H +类型) Z r 1的值之间的映射。
- Redis 支撑许多特D A 6 } C性,例如将内存中的数据耐久化到硬盘中,运用拷贝来扩展读功用,运用分片来扩展写功用。所以读写速度非常快,因而Redis被广泛运用于缓存方向M m H k Q W ^,每| A b – n c s秒可以处理逾越10万次读写操作,是已知功用最快的key-value 数据库。其他 Redis 也经常用来做分布式锁,而且 Redis 支撑事务,耐久化,LUA脚本,LRU驱动事情,多种集群计划等。
2)Redis为什么那么快
-
完全依据内存
,绝大部分央求是朴实的内存操作 -
数据结构简略
,对数据操作也简略,Redis中的数据结构是专门为各种场景设计的 -
选用单线程
,防止了不必要的上下文切换和竞1 3 H * V ) Q赛条件,也不存在多进 : A 7 n a B程或许多线程导致的切换而耗费CPU,不必去考虑各种锁的问题,不存在加锁开释锁操作,没有因为或许出现死锁而导致的功用耗费 -
运用多路 I/O 复用模型
,非阻塞 IO
3)Redis 的优缺点
利益:
- 读写速度快,因为数据存在内存中,类似于Hl L c d M { |ashMap
- 支撑丰富的数据类型,支撑 String,List,Hash,Set,SortSet(Zset)
- 支撑事务(共同性和阻隔性),运用好RDB和AOF也能完结耐久性
- 支撑主从拷贝,主机遇d o Y /自动将数据同步到从机,可以进行读写分离
缺点f R n w U Y F n P:
- 缓存和数据库双写共同性问题
- 缓存雪崩、穿透、击穿问题
- Redis 较难支撑在线扩容,在集群容量到达上限时扩容会变得很杂乱
- 主机宕机前会有部分数据未能及时同步 5 l , D C到从机$ % { } R 4 E { z,切换IP后还会引进数据不共同问题,降低了系统的可用性
- 缓存的并发比赛问题
4)Redis与Memcache& 5 l的区别
-
数据类型
- M8 R O & Y { 3 Qemcached仅支撑字符串类型
- Redis 支撑五种不同的数据类型,可以更活络地处理问题
-
数据耐久化
- M? * %emcached 不支撑耐久化
- Redis 支撑两种耐久化战略:RDB快照 和 AOF 日志
-
分布式
- MemcaI / ! Z D ^ # Fched 不支撑分布式,只能通过在客户端运用共同O 7 m } A ;性哈希来完结分布式存4 t x . 6 d –储,这种方法在存储和查询时都@ V j 5 8 ] ( G需求现在客户端核算一次H i i j h Q数据地址的节点
- Redis Cluster 支撑分布式
-
内存管理机制
- Redis 中,并不是全部数据都一贯存储5 H { i 5在内存中,可以将一些良久没用的 value 交换到磁盘
- Memcached 的数据一贯会在内存中,它将内存分割成特定长度的块来存储数据,以完全处理$ z # L内存碎片的问题,但是这种方法会使Q k s I t ^得内存的运用率不高,例如块的巨细为 128 bytes,只存储 100 bytes 的数据,那么剩下的 28 bytes 就浪费了
5)Redis有哪些数据类型
-
String(字符串)
- 简介: 二进制安全
- 可以存储的值: 字符串,整数或许浮点数,还有jpg图片或许序列化方针
- 操作: 对整个字符串或许字符串的其间一部分实行操作,对整数和浮点数实行自增或许自减操作
- 运用场景: 做简略的键值对缓存
- 实践运用:
>settestcbuc
ok
-----------------] : ~ 4 d q 9 :-----------
>gettestA [ ] & P 6 /
"cbuc"
-----------V G x 6 v u #-----------------
>deltest
(integer)1
----------------------------
>gettest
(nil)
-
List([ C r Y l / ~ c列表)
- 简介: 链表(双向链表)
- 可以存储的值: 列表
- 操作: 从两头压入B % L j Z u 6 n ]或) i : Z A a X F许弹出元素,对单个或许多个元素进行批改,~ [ * { h X只保存一个范围内的元素
- 运用场景: 最新消息排行;消息队伍
- 实践运用:
>rpushtestc1
(integer)1
--------------------w 3 G G 4 H K Z--------
>rpushtestc2
(integ~ ^ T @ 9 w - A ~er)2
----------------------------
>rpushtestc2
(inteb P vger)3
----------------------------
>lran0 N Tgetest0-1
1)"c1"
2)"c2"
3)"c3"
----------------------------
>lindextest1
"c2"
----` 2 @ N X G ^------------------T u 5 A 3 e A------
>lpoptest
"c1P B X p"
----------------i ^ t + s y B------------
>lrangetest0-1
"c2"
"c2"
-
Hash(字典)
- 简介: 键值对集结,即编程言语中的map类型
- 可以存储的值: 适合存储方针,而且可以像数据库中的update一样,– @ 0 o b M & @只批改某一项的特色值
- 操作: 添加、获取、移除单个键值对,获取全部键值对,查看某个键 C } w & 9是否存在
- 运用场景: 存储、读取、批改用户– % 1 = +特色
- 实践运 1 O用1 c w N:
>hsettestnamecbuc
(integ` p ` ? a 4er)1
----------------------------
>hsettestage23
(integer)1
----------------------------
>hZ m $ - !getalltest
1)"name"
2)"cbuc"
3)"age"
4)"23% H L a G `"
----------------------------
>hdeltestage
(integer)1
----------------------------
>hgettm % o Restname
"cbuc"
-------k V X U--d / E-------------------
>hgetalltest
1)"name"
2)"cbuc"
-
Set(调4 x 7 6 a ) U R Q集)
- 简介: hasY C a l 8h表完结,元素不重复
- 可以存储的值: 无N ] F ; D E K w序集结
- 操作: 添加、获取、移除单个元素,查看一个元素是否现已存在于集结中,核算交集、并集、差集从集结里边随机获取元素
- 运用场景: 共同老友;运用唯一性,核算拜访网站的全部IP
- 实践o 5 Q 7 $ l运} O x C f $用:
>saddtestc1
(integer)1
>saddtestc2
(integer)1
>saddtestc1
(integer)0
----------------------------
>smemberstest
1)"c1"
2)"c2"
----------------Z r . } 1 ? U Q 8------------
>sismembertestc3
(integer)0
>sismembertest2 D w h k Gc1
(integer)1
------h j B g----------------------
>sr* ? 0 ^ c | u Jemtestc1
(integer)1
----------------------------
>w R i ? w t nsm+ 7 6 $ I . v S uembe, e + } 2 0 8rstest
1)# 9 Z D - @ n L c"c2"
-
ZSet(有序集结)
- 简介: 将 setg ! y 中的元素添加一个权重参数s4 m 3 y 1 } *core3 N,元素按score有序摆放
- 可以存储的值: 有序集结
- 操作: 添加、获取、删去元素,依据分值范围或许成员来获取元素,# E ^核算一个键的排名
- 运用场景: 排行榜;带权重的消息队伍
- 实践运用:
>za6 | g q c L A : iddtest92math
(integer)1
>zaddtest88english
(integer)1
>zaddtest92score
(integer)1
--------------------; 1 9 ? h % d--------
>zrang? ~ 5 N ~ Wetest0-1withscores
1)"english"
2)"88"
3)"math"
4)U y 1 i j H 6 q O"92F N M S D ! Q"
--------X 3 J 8 x 8 r & :--------------------
>zrangebyscoretest8090withscores
1)"english"
2)"88"
----------------------------
>zremtestenglish
(integer)1
----------9 U 1 o l |-----------------9 d ) j-
>zrangetest0-1withscorer # J Xs
3)"math"
4)"9j ~ = D : 8 u y2"
高档用法:
-
BitMap
位图是支撑按 bit 位来存储信息,可以用来完结 布隆过滤器(BloomFilter) -
HyperLogw J H K 3 ) V ! [Log
供不精确的去重计数功用,比较适合用来Z _ N N M做大规模数据的去重核算,例如核算 UV -
Geospatial
可以用来保存地理方位,并作方位间隔核算或许依据半径核算方位等。可以用来完结附近的人,或许核算最优地图途径
6)什么是Redis耐久化
耐久化就是把内存中的数据写到磁盘中去,防止服务宕机了内存数据丢掉。
7)Redis的耐久化机制
Redis供应两种耐久化机制:RDB快照(默许)和AOp I h v lF(机制2 o w)
RDB
RDB(Redit Z C Ss DataBase)是Redis中默许的耐久化方法。依照必定的时间将内存的数据以快照的方式保存到磁盘中,会发生
dump.rdb
数据文件,可以通过配备文件中的save参数来定义快照的n ( – k s T 3 K周期。

原理: fork
和cow
。fork 是指k e 7 redis间隔一段时间会 fork 一个子进程,子线程将数据写到磁盘上一e f N f Z ;个临时RDB文件中,当子进程写o 4 – V完临时文件后,将原本的RDB替换掉,这样的好处是t c 5 ? L r q可以 cow(copy-on-wirte– D W N)
利益:
-
便利耐久化
,只需一个文件 dump.rdb -
容灾性好
,一个` V s文件可以保存到安全的磁盘中 -
功用最大化
,fork 子进程来完结写操作,让主进程继续处理N Z ;指令,所以是IO最大化。运用独自子进程来进行耐久化,主进程不会进行任何IO操作,确保 redis 的高功用
缺点:
-
数据安全性低
,RDB是间隔一段时间来进行耐久化,假设耐久化之间 redn R k X j 3is 发生缺点,会发生数据丢掉,所以这种办T h F s x 6 j法更适合数据要求不谨慎的时分用 -
保存时间长
,假设数据量很大,保存快照的时间会很长
AOF
AOF(Append-Only-File),是将 Redis 实行的每次写指令记载到独自的日志文件中,当重启 Redis 会从头将耐久化的日志中文件恢复数据

原理: 将写指令添加到 AOF 文件(Append Only File)的结束。运用AOF耐久化需求设置同步选项,然后确保写指令同步到磁盘文件上的机遇s [ J @。这是因为对文件进行写入并不会马大将内容同步到磁盘上,而是先存储到缓冲区,然后由操作系统抉择什么时分同步到磁盘。
同步选项:
选项 | 同步频率 |
---|---|
no | 让操作系统抉择何时同步 |
always | 每个写指令都同步 |
everysec | 每秒同步一次 |
-
no:
并不能给服务c E ] ) q $器功用带来多大的提高,而且也会添加系统奔溃时数据丢掉的数| ) # z y 0 * 0量 -
alwaysY V U:
严峻减低服务器功用 -
es W . Q N s /verysec:
这个选项比较适宜,可以确保系统奔溃时只会丢掉一秒左右的数据,而且 Redis 每秒实行一次同步对服务器功用几乎没有任何影响
跟着服务器写央求的增多,AOT v | [ ? o KF文件会越来越大。Redis供应了= e } _ 8 !一种将AOF重- ( q F写的特性
auto-aof-p – Q u drewrite,可以去除AOF文件中的冗余写指令
利益:
-
数据安全
,AOF 耐久化可以配备 appendfc G @ Usync 特色中d 9 l q的always,没进I C y G a 5 ] V l行一次写指令操作就记载到 AOF 文件中一次、 -
共同性
,通过 append 方式写文件,即便半途服务器宕机,可以通过 redis-check-aof 工具处理数3 * u ^ W a据共同性问题
缺点:
- AOF 文件比RDB文件大,而且恢复速度慢
- 数据集大的时分比 RDB 发动功率低
两者比较
- AOF 文件( G Z $ l {比 RDB 更新频率高,优先运用 AOF 恢复数据
- AOF 比 RDB 更安全也更健壮
- RDB 功用比 AOF 好
- 假设两个e j ] i @ i N 1 z都配了优先加载 AOF
8)怎么选择适宜的耐久化方法
一般来说两者都会配备。假设独自用 RDB 的话你会丢掉很大都u 0 i b r c !据,独自用 AOF,你数据恢复没有 RDB 来的快,假设系统出现问题的时分咱M t x X E ~ l c !们可以先用 RDB 恢复,然后用 AOF 补全数据。冷热备份一重用,才能确保高健壮性的系统。
9)Redis的过期键删去战略
-
守时删去F 0 n 8 h k G X %
每个设置过期时间的 key 都需求创建一个守时器,到过期时间就会当即根除。该战略可以当即根除过期的数据,对内存很友爱;但是会占用许多的CL 6 d ] r g b B hPU资源来处理过期的数据,然后影响r / D 7 _缓存的照应时间和吞S + ~ 8吐量 -
慵懒删去
只需当拜访一个 key_ L 2 ? 时,才会判别该 key 是否已过期,是则删去。该战略可以最0 q V $ –大化节省CPU资源,却对内存非常不友爱。极点情况下或许出现许多的过期 key 没有再次被拜访,然后不会被根除,占用许多内存 -
定时删去
每隔必守时间,会扫描必定数量的 expires 字典中的 key,并根除其间已过期的 key。C ] Z % 8 { R该战略是前两者的一个折中方法。通过调整守时扫描的时间间隔和每次扫描的限定耗时,能E y t *够在不同情况下使得CPUn m 6 * h b j和内存资源到达最优的平衡作用。
Redis 一般一同运用 慵懒过期 和 定时过期 两种过期战略
10)Redis 内存筛选战略
设置过期时间的键空间选择性移除
-
volatile-Z i B m V X ilru:
检验回收最少运用的键使得新添加的数据有空间寄存。 -
volatile-ran} M J ( Y e ! f 5dom:
回收随机的键使得新添加的数据有空间寄存 -
volatile-[ | yttl:
优先回收存活时间较短的键使得新m d h 3 : r z 添加的数据有空间寄存
全局的键空间选择性移除
-
allkeys-lru:
检验回收最少运用的键使得新添加的数据有空间寄存。 -
allkeys-random:
回收随机的键使得新添加的数据有空间寄8 Y L x t q 8 R存 -
noeviction:
当内存到达约束而且客户端检验实行,会回来错误
11)Redis 事务
Redis 事务的本质是通过 MULTI、EXEC、WATCH、DISCARD四个原语完结的。事务支撑一次实行多个指令,一个事务中全部指令都会被序列化。在事务实行进程,会依照次序串行化实行队伍中的指令,其他客户端提交的指令恳[ * g P V D 4求不会刺进到事务实行指令序列中。总结:
Redis 事务就是一次性、次序性、L q + 2排他性的实行一个队伍l b A中的一系列指令。
- Redis 不~ 7 z 8 / u q z支撑回滚,Redis 在事务失利时不进行回滚,而是继续实行余下的指令,所以 Redis 的内部可以保持简略且快速。
- 假设在一个事务中的指令出现错误,那么全部的指令都不会实行
- 假设在一个事务中出现工作错误,那么正确的指令会被实行
四个原语
- WATCH: 是一个7 Y % e $ L达观锁,可以为 Redis 事务供应 check-an! Y ^ F l } Rd-set(CAS)行为0 / Z %,可以监控一个或多个键。一旦其间有一个键被批改(或删去),之后的事务就不~ Z C s 6 A u 3 !会实行,监控一贯继续到EXEC指令
- MULTI: 用于开启一个事务,它总是回来OK。MULTI实行之后,D M ~ e 4 b : 客户端可以继续向服务器发送恣意多条指令,这些指令不会当即被实行,而是被放到一个队伍中,当 EXEC指令被调用时,全部队伍中的指令才会被实行
- EXEC: 实行全部事务块内( . )的指Z d v令,回来事务块内全部指令的回来值,按指令实行的先后次序摆放,当操作被打断时,回来操控 nil
- DISCARD: 调用 DISCARD ,客户端可以清空事务队伍,并扔掉实行b A +事务,而且客户端会从事务情况中退出
12z c D c i + y I p)Redis设置过期o R @ * k p时间和永久有用
EXPIRE 和 PERSIST 指令
13)缓存雪崩
缓存雪崩
是指缓存同一时间大面积的失效,所以,后边的央求都会落到数据库上,构成数据库短时间内接受许多央求而崩掉处理方法:
- 缓E K + t p存数据的过期时间设置随机,防止同一时间很大都据过期现象发生
- 一般并发量不是特别多的时分,运用最多的处理计划是加锁排队
- 建立集群,假设一台 Redis 挂掉之后,还有Z j K其他的可以继续作业
14)缓存击穿
缓存击穿
是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时因为并发用户特别多,一同读缓存没读到数据,又一同去` ; 2 y g b数据库去取数据,引起数据库压力瞬间增大处理方法c ^ 4 7 _ k:
- 设置热点数据永久不过期
- 可以运用互斥锁更新,确保同一个进程中针# T J对同一个数据不会并发央求到 DB,减小 DB 压力
- 运用随机退避方法,失效时随机d 9 n sleep 一个很短的时间,再次查询,假设失利再实行更新? w :
15)缓存穿透
缓存穿透
是指缓E X u 3 V d q J存和数据库中都没有的数据,导致全部的央求[ L Z +都落到数据库上,构成数据库短时间内接受许多央求而崩掉处理方法:
- 对于不存在的数据,在缓存中保$ p , O ! {存一个数据进行符号,并设置上过期时间,防止相同的V x T _ 5 – ? ) C数据央求再次拜访 DB。
- 运用 BloomFilter 过滤器,布隆过滤器的特色是存在性检测,假设布隆过滤器中不存在,那么数据必定不存在;假设布隆过滤器中存在,实践数据也有或许会不存在。
16)Redis主从架构
单机的 Redis,可以承载的 QPS 大概在上万到几万不等,对于缓存来说,一般都是用来支撑读高并I V } % 4 B发的。假设一台机器读写合一的那会很简单发生问题。因而会选用主从架构,让 mY $ +aster 去处理写操作,然后把数据同步到 slave 上,slave 担任读操作。这样就会分发掉许多的央求,而且在扩容的时分还可以轻松w Y 3 u y完结水平扩容。

当发n # z g X O T动一台 slu s C l Qave 的时分,它会发送一个 psync
指令到 master ,假设是第一次同步,主节点会做一次bgsave,并一同将后续批改操作V A b G ` d o !记载到内存buffer,待完结后将RDB文件全量同步; I / / F T Y到拷贝节点,拷贝节点接收完结后将RDB镜像加载到内存然后写入本地磁盘。处理完结后,再告知主节点将期间批改的操作记载同步1 ? B到拷贝节点进行重* 8 U n % [ 5放就完结了同步进程f l u , ~ { ] s。后续的增量数据通过AOF日志同步即可,类似于数据库的binlog。
17)Rei Z ! cdis完结分布式锁
简略来说就是先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了开释
SETNX 是【SET if Not eXists】(假设不存在,则M E . J / u q SET)的简写。当且仅当 key 不存在,将 key 的值设为 value。 若给定的 key 现已存在,则 SETNX 不做任何动作。回来值:设置成功,回来 1 。设置失h 0 3利,回来 0 。
18)Redis的同步机制
Redis可以运用主从同步,从从同步。第一次同步时,主节点会做一次bgsave,并一j | t f ? [起将后续批改操作记载到内存buffer,待完结后将RDB文件全量同步到拷贝节点^ ; O,拷贝节点接收完结后将RDB镜像加载到内存然后写入本地磁盘。处理完结后,再告知主节点将期间批改的操作记载同步到拷贝节点进行重放就完结了同步进程。后续的增量数据通过AOF日志同步即可,类似于数据库的binlog。
19o s _ ] a ? } 7)Redis集群P g o C v原理
Redis SentC c – m L n r xinel(岗兵)着眼于高可用,在master 宕机时会自动将slave提高为master,继续供应服务。
Redis Cluster(集群)着眼于扩展性,在单个redis内存不足 t 9 * H – D e +时,运用Cluster进行分片存储。
选主战略:
- slave 的 priority 设置的越低,优r @ s – U 9 n先级越高
- 平等情况下,slave 拷贝的数据越多优先级越高
- 相同的条件下,runid 越小越简单被选中
20)Redis 岗兵方式

岗兵必须用三个实例去确保自己的健壮性,岗兵 + 主从 并不能确保数据不丢掉 ,但是可以确保集群的高可用。作业原理= 3 | o Z c:
- 每个 Sentinel 节点以每秒一次的频率向它所知的主服务器、从服务器和其他 SentineT % ) Jl 节点发送8 r 6 W Y M一个 PING 指令
- 假设 一个实例举例最终一次有用回复 PING 指令的时间逾越 down-av : & ^ 0fter-milliseconds 所指定的值,那么这个实例就会被符号为片面下线
- 假设一个主服务器被符号为片面下线,那么正在监督这个服务器的全部 Sentinel 节点会以每秒一次的频率确认主服务器确实进S s * c & e入了片面下线情况
- 假设有满足数量的 Sentinel (至少要到达配备文件中指定的数量)在指定的时间范围内赞同这一判别,那么这个主服务器就会被符号为客观下线
- 当主服务器被符号为客观下线后,W X z t e * o I SSentinel 节点会向下线主服务器的全部从服务器发送 INFO 指令的频率从 10 秒一次改为每秒一次
- Sentinel 节点会洽谈客观下线主服务器的情况,假设处于 SDOWN 情况,则投票自动选出新的主[ , P 2 k R节点,将剩下从节点指向新的主节点进行数据拷贝。
- 当没有满足数量的 Sentinel 节点泳衣主服务器下线是,主服务器的客观下线情况就会被移除。或许当) 4 W b ^ Q主服务器从头向 Sentinel 的 PING 指令回来有用回复是,主服务器的片面下线状, g Z H {况就会被移除
21)脑裂问题及处理
何为脑裂:
Reg h Fdis 的集群脑裂是指因为网络问题,导致 redis master 节点跟 redis slave 节点和 sentinel 集群处于不必的网络分区,此时因为 sentinel 集群无法感知到 master 的存在,所以将 slave 节点提高为 master 节点。此时存在两个不同的 master 节点,就像是一个大脑分裂成了两个。F s & W O这时假设客户端还在依据原本的 master 节点继续写入数据,那么新的 master) k ) h 节点将无法同步这些数据,当网络问题处理之后,sentinel集群就会将原先的 master 节点降为 slave 节点,此时再重新的 master 中同步数据,将会构成许多的数据丢掉

处理:1 M h @
- 通常选用阻隔(Fencing)机制
- 同享存储Fencing:确保只需一7 1 r $个 Master 往同享存储中写数据
- 客户端Fencing:确保只需一个 Master 可以照应客户端的央求
- Slave Fencing:确保只需一个 Master 可以向 Slave 下发指令
- 配备文件中批改参数
min-replicas l 6s-to-write3#标明连接到master的最少sU k ` t Q T flave数量
min-replicas-max-lag10#标明slave连接到master的最大延迟时间
依P d J Q p f T照上面配备,要求至少3个slave节点,且数据拷贝和同步的延迟不能逾越10秒S B /,否则的话 master 就会拒绝写央求,配备了这两个参数之后,假设发生集群脑裂,原先的 master 节点接收到客户端的写入央求会拒绝,就可以减少数据同步之后的数据丢掉

本文较长,能看到这里的都是好样的,成长之路学无止境
今日的你多尽力一点,明日的你就能少说一句求人的话!* X o良久良久之前,有个传说,听说:
看完不赞,都是坏蛋