Redis知识整理-------保姆级教学

1.Redis介绍

redis是一个单线程的、开源的key-value存储的数据库,具有以下特点:

1.redis支持持久化,能够将数据存放在磁盘中,待下次开启时候再次加载。

2.redis具有丰富的数据结构:string,liist(双向),set,zset,hash

3.redis支持数据备份,即master-slave(主从模式)

Redis的优势

1.基于内存操作,读写速度快,

2.支持事务,操作具有原子性。

3.支持过期,发布订阅。

4.redis通过队列完成了串行访问,减少了传统数据库对串行访问的开销。

Redis为什么是单线程?
1.多线程会涉及到锁相关的问题。

2.多线程处理会涉及线程的切换从而导致CPU的消耗。这样我们会发现CPU不是redis的瓶颈(因为单线程不涉及CPU的线程切换),但是我们为了发挥多核CPU的性能,可以通过单机开多个redis实现。

Redis为什么这么快?
1.因为Redis是完全基于内存进行操作。
2.采用单线程,避免多线程的线程切换的时间损耗。
3.采用IO多路复用技术。
4.数据结构十分简单。

2.Redis的数据结构

redis有五大基本数据结构:String,List(双向),Hash(Map),Set,SortSet。

1.String类型
这是最常见、最普通的类型。使用的是(key,value)键值对的形式存储,一般是用于缓存和计数器(秒杀减库存)的场景。

#设置单个值
set key value
#获取单个值
get key
#删除单个值
del key

#设置多个值
mset key1 value1 key2 value2
#获取多个值
mget key1 key2

#为键值对设置过期时间
#如果key不存在则直接设置,如果key存在则会覆盖原来的值
setex key value timeout

#尝试设置键值对
#如果key不存在则设置返回1,如果存在则返回0(可以用于分布式锁)
setnx key value

2.List(双向)
Redis的链表结构,使用的是(key,list)的形式存储,因为其双向性,我们可以设计成一个队列,用于类似于评论的场景,也可以作为一个消息队列使用。

#从左边顺序插入elements元素(允许复数),key为链表名称
lpush key elements

#从右边顺序插入elements元素(允许复数),key为链表名称
rpush key elements

#获取[start,end]范围内的元素(闭区间),从左边开始计算(Index = 0)
#[0,-1]代表全部元素
lrange key start end

#弹出最左边的元素
lpop key
#弹出最右边的元素
rpop key

#从左边开始,删除count个element
lrem key count element

3.Hash结构(Map)
这个数据结构和Map类似,使用的是(key,hash(key,value))的形式进行一个存储,这个数据结构的使用场景是:比如一个对象拥有多个字段,我们可以将其缓存成一个hash结构,内层嵌套的key为字段,value为字段的值,这样我们在修改字段的时候就可以直接修改这个hash结构对应的key的value即可。

#设置一个hash结构
#key为外层key(用于查找对应的hash结构)
#field为内层key(用于查找设置对应字段的value)
hset key field value 

#获取一个hash结构对应的field的值
hget key field 

#获取一个hash结构的所有field对应的value(顺序和插入的顺序一致)
hvals key

#删除一个hash结构对应的field
hdel key field

#删除一个hash结构
del key

4.Set结构
Set是一个不允许重复元素的集合。(key, set)结构进行存储。该结构是用于需要不重复元素的情况,类似于两个好友的共同好友或者两个数组交集之类的场景。

#添加到set集合中elements个元素(会自动去重)
sadd key elements

#返回set集合中一共有多少个元素
scard key

#返回set集合中所有元素
smembers key

#查看set集合中有没有该元素,有返回1,没有返回0
sismember key value 

#删除set集合中元素elements(允许复数)
srem key elements

#随机弹出set集合中一个元素,并返回
spop key 

5.SortSet(有序集合)
该数据结构算是升级版的Set集合,该集合会基于分配的分数(权重)进行自动排序,score越低优先级越高,(key,zset)结构进行存储。该结构适用于排行榜或者带权队列的场景。

#往zset集合中添加分数(权重)为score的value
zadd key score value

#返回zset集合中的元素个数
zcard key

#查询zset集合中[start,stop]对应的value值(下标从0开始)
#[0,-1]代表查询全部zset集合元素
zrange key start stop

#查询指定元素对应的分数(权重)sroce
zscore key member

#查询分数(权重)score在[min,max]范围内对应的元素(闭区间)
zrangebyscore min max

#统计分数(权重)score在[min,max]的个数(闭区间)
zcount key min max

#删除zset集合中对应元素
zrem key member

#删除分数(权重)score在[min,max]范围内的元素
zremrangebyscore key min max

3.Redis的持久化

Redis有两种持久化的方式:RDB和AOF

1.RDB

RDB是把内存中的数据集以快照的形式写入磁盘,在某个时间点将数据写入一个临时文件,在持久化结束时将该临时文件替换掉原来的文件。(该操作是redis通过fork创建一个子进程来完成的)

优点

  1. 持久化文件只有一个.rdb文件,方便持久化。
  2. 容灾性好。把数据存储在一个磁盘文件中。
  3. 性能高。主进程通过fork一个子进程来完成RDB的IO操作,主进程仍然处理命令,保证了Redis的高性能。
  4. 在恢复大数据量数据时,启动速度优于AOF。

缺点

  1. 数据安全性较低。因为RDB是间隔一定时间后才会执行持久化操作,但是如果在这个间隔时间服务器宕机,那么就会导致企业损失这段时间的数据。

2.AOF
将所有对redis进行数据操作的命令行记录以redis命令请求协议的格式完全保存在.aof文件中。
优点

  1. 数据安全性高。我们可以对.conf文件进行修改,修改aof的记录配置,可以设置always,即每一次修改都会被记录一下,也可以设置间隔1s记录,这样就算服务器宕机损失的数据也只有1s。
  2. AOF的rewrite机制。当AOF文件过大时会对命令进行合并。(在没有rewrite之前如果我们存在误操作,例如flushall,可以在rewrite之前修改aof文件)
  3. AOF文件可读性较强。如果我们不小心使用flushall清空redis,我们可以在aof文件中删除该命令,之后再使用aof进行数据恢复。

缺点

  1. 针对于相同数据量时,通常AOF文件大小大于RDB文件大小。

4.Redis的淘汰策略

当redis存储的数据达到峰值时,redis就会进行对键值对的回收操作。

1.volatile-LRU
设置了过期时间的数据集中,选择最近最久未使用的数据集进行淘汰。

2.volatile-TTL

设置了过期时间的数据集中,选择将要过期的数据进行淘汰。

3.volatile-RANDOM
设置了过期时间的数据集中,随机选择一个数据集进行淘汰。

4.allkeys-LRU
所有数据集中,选择最近最久未被使用的数据集进行淘汰。

5.allkeys-RANDOM
所有数据集中,随机选择一个数据集进行淘汰。

6.no-enviction
禁止驱除数据集。

使用策略规则

  1. 如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用 allkeys-lru。
  2. 如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random。

5.Redis主从复制

只需要在.conf文件中添加 SLAVE OF ip:port,代表自己变成ip:port的从机。

  • 主从复制保证即使有服务器宕机,但仍可以向外提供服务。
  • 当进行主从复制的过程中,不会阻塞。
  • 一个slave也可能是其他服务器的master(链式关系)

主从复制原理
主从复制分为全量同步和增量同步。

  • 全量同步
    当slave第一次连接master时进行的同步,slave会像master发送一个SYNC,master接收到后就会创建快照发送给slave。
    当slave接收到RDB文件后,会将自己的旧数据清空,载入该RDB数据到内存。
    在同步期间如果master有写操作,这时候master会把这些操作放入缓存区,等待同步结束后在进行写操作。

  • 增量同步
    在执行完全量同步后,master每进行一个写操作,都会将该命令同步给slave。

主从复制缺点
当master服务器宕机时,无法自动将slave选举成master(需要手动,即 SLAVE OF NO ONE )。所以需要Sentinel(哨兵)机制来完成动态选举。

6.哨兵机制

作用
1.监视master或者slave是否存活(通过发送心跳)。
2.在master宕机之后完成动态选举。
在这里插入图片描述
Sentinel工作原理

哨兵机制是通过建立多个哨兵结点(每个哨兵结点都是一个redis实例,只不过不用于存储数据),哨兵们共同监测master和slave是否存活(Sentinel每秒都会对每个节点Ping),并且哨兵结点互相也会相互监测和通信(交换对主从节点的存活情况),哨兵对结点的判断分为了两个阶段:主观下线客观下线

Sentinel的工作过程
当Sentinel向master发送ping时,30s内没有收到回复, 则认定该master为主观下线,然后就会询问其他Sentinel该master是否存活,如果多数Sentinel认为该节点死亡,则哨兵认定该master为客观下线
此时会选择一个Sentinel作为Leader进行fail-over,并且选举一个slave作为master,并将其他的slave指向新的master。

6.Redis集群

集群架构图
在这里插入图片描述
Redis集群特点
1.各个master节点相互关联(通过Ping-Pong机制)。

2.当一个master节点fail时,只有超过半数的master节点判定fail才会生效。

3.客户端与redis直连(没有Proxy),客户端不需要连接redis集群的所有节点,只需要连接其中一个结点即可。

4.集群会将数据自动切分(分片),使其到达不同的master结点进行存储。

5.当集群的一部分节点失效时,仍然可以向外提供服务。

6.Redis集群将整个数据库分成16384个槽,通过hash算法,数据库的每个键都属于对应槽的一个位置(集群中每个master最大可以维护16384个槽)。在这里插入图片描述
主节点只会处理和属于自己槽部分的命令(slot),当主节点收到不属于自己槽的部分时,则会向客户端返回目标主节点地址,然后客户端会像该地址重新发送命令。

redis集群的投票机制:容错
投票过程是集群中的所有master参加,如果超过半数的master节点与该master(fail)节点超时,则判定该master已经fail了。

集群什么时候不可用?
1.当一个master节点fail,并且该master节点无slave节点,则此时集群进入fail状态。(集群的slot映射不完整,可能会导致数据缺失,所以直接集群不可用)
2.如果超过半数的master节点fail,则无论此时是否有slave节点,整个集群进入fail状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值