redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销
String :常用,不讲
hash:存放对象 ,便于修改,存放多级的数据,比如说购物车,用户id为key,商品id 为filed 商品数量为calue
list:用于消息的队列,排行榜,最新列表
rpush添加字符串元素到对应 list 的尾部
rpop从list 的尾部删除元素,并返回删除元素
llen获取list的元素个数
lrange获取列表指定范围内的元素
lindex获取列表中指定位置的元素
消息队列 :lpop和rpush(或者反过来,lpush和rpop)能实现队列的功能(有了mq不推荐使用这个)
排行榜:lrange获取列表指定范围内的元素,每隔一段时间计算一次的排行榜存储在list类型
最新列表:每次通过lpush命令往列表里插入新的元素,然后通过lrange命令读取最新的元素列表
set:其特点是集合元素无序且不重复 ,比如说,好友,关注,感兴趣的人,sinter命令可以获得A和B两个用户的共同好友,sismember命令可以判断A是否是B的好友,scard命令可以获取好友数量
sorted set:游戏排名、微博热点话题等使用场景。
rdb 和 Aof
rdb的执行策略
父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中
的临时文件RDB;
当子进程写入完所有数据后会用该临时文件RDB替换旧的RDB文件,至此一次快照操作完
成。
AOF的执行策略
aof和rdb的优缺点
RDB持久化机制的优点
RDB持久化机制的缺点
AOF持久化机制的优点
AOF持久化机制的缺点
Redis的哨兵(sentinel) 系统用于管理多个 Redis 服务器,该系统执行以下三个任务:
主观下线和客观下线:
1)每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令。
2)如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被当前 Sentinel 标记为主观下线。
3)如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
4)当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线 。
5)当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次 (在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有Master,Slave发送 INFO 命令 )。
6)若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会变成主观下线。 若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。
7)sentinel节点会与其他sentinel节点进行“沟通”,投票选举一个sentinel节点进行故障处理,在从节点中选取一个主节点,其他从节点挂载到新的主节点上自动复制新主节点的数据。
会进行configuraiton配置信息传播。
哨兵完成切换之后,会在自己本地更新生成最新的master配置,然后通过pub/sub消息机制同步给其他的哨兵
执行切换的那个哨兵,会从要切换到的新master(salve->master)那里得到一个configuration epoch,这就是一个version号,每次切换的version号都必须是唯一的。
如果第一个选举出的哨兵切换失败了,那么其他哨兵,会等待failover-timeout时间,然后接替继续执行切换,此时会重新获取一个新的configuration epoch 作为新的version号。
这个version号就很重要了,因为各种消息都是通过一个channel去发布和监听的,所以一个哨兵完成一次新的切换之后,新的master配置是跟着新的version号的,其他的哨兵都是根据版本号的大小来更新自己的master配置的
----------------------------详细的可以到https://www.cnblogs.com/ibigboy/p/12205889.html去看看,我很喜欢-----------------------------
1、完全基于内存,
2、使用多路I/O复用模型,非阻塞IO;这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程
复制是高可用Redis的基础,哨兵和集群都是在复制基础上实现高可用的。复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。缺陷:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制。
redis主从复制的特点:
redis采用异步方式复制数据到slave节点,从redis2.8开始,slave节点会周期性地确认自己每次复制的数据量;
一个master节点可以配置多个slave节点;
slave节点可以连接其他的slave节点;
slave节点做复制的时候,不会阻塞master节点的正常工作;
slave节点做复制的时候,也不会阻塞对自己的查询操作,它会用旧数据集来提供服务,但在复制完成时,需要删除旧数据集,加载新数据集,这时会暂停对外服务;
slave节点主要用来横向扩容,做读写分离,扩容的slave节点可以提高读的吞吐量;
如果采用主从架构,必须开启master节点的持久化,不建议用slave节点作master节点的数据热备,因为如果一旦关掉master的持久化,可能在master宕机重启时数据是空的,然后一经复制,slave节点也会随之丢失
Redis主从复制分为全量复制和增量复制。
全量复制的步骤
从服务器连接主服务器,发送psync命令;
主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
增量复制的步骤
如果全量复制过程中,master-slave 网络连接断掉,那么 slave 重新连接 master 时,会触发增量复制。
master 直接从自己的 backlog 中获取部分丢失的数据,发送给 slave node,默认 backlog 就是 1MB。
master 就是根据 slave 发送的 psync 中的 offset 来从 backlog 中获取数据的。
用的redis.setnx()命令,记得设置过期时间,finally里面是释放锁,锁的时间考虑一下,业务的执行时间即可没如果执行完毕,未执行完毕,锁的时间到期了,可以考虑在数据库层面加上乐观锁,
本文地址:https://blog.csdn.net/qq_37368570/article/details/107199220
如对本文有疑问, 点击进行留言回复!!
厉害!俩月吃透阿里P8架构师推荐608页kafka源码,成功入职蚂蚁
性能 1.84 倍于 Ceph!网易数帆开源分布式存储系统 Curve
荐 面试半年,上个月成功拿到阿里P7offer,全靠我啃烂了这份2020最新面试题!
高并发高可用复杂系统中的缓存架构(十五) 缓存架构讲解,如何保证缓存数据库一致性
网友评论