Redis-事务
Redis事务机制
Redis事务生命周期
开启事务:使用MULTI开启一个事务
命令入队列:每次操作的命令都会加入到一个队列中,但命令此时不会真正被执行
提交事务:使用EXEC命令提交事务,开始顺序执行队列中的命令
Redis事务的原子性
**原子性:**一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
官方文档对事务的定义:
事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。EXEC 命令负责触发并执行事务中的所有命令:如果客户端在使用 MULTI 开启了一个事务之后,却因为断线而没有成功执行 EXEC ,那么事务中的所有命令都不会被执行。另一方面,如果客户端成功在开启事务之后执行 EXEC ,那么事务中的所有命令都会被执行。
官方认为Redis事务是一个原子 ...
Redis-哨兵模式(Sentinel)
参考文献
《Redis开发与运维》
极客时间专栏: Redis核心技术与实战
为什么要引入哨兵模式?
Redis 的主从复制模式下,一旦主节点由于故障不能提供服务,需要手动将从节点晋升为主节点,同时还要通知客户端更新主节点地址,这种故障处理方式从一定程度上是无法接受的.
Redis 2.8 以后提供了 Redis Sentinel 哨兵机制来解决这个问题.
Redis Sentinel 是 Redis 高可用的实现方案.Sentinel 是一个管理多个 Redis 实例的工具,它可以实现对 Redis 的监控、通知、自动故障转移.
基本概念
名词
逻辑结构
物理结构
主节点(master)
Redis主服务/数据库
一个独立的Redis进程
从节点(slave)
Redis从服务/数据库
一个独立的Redis进程
Redis数据节点
主节点和从节点
主节点和从节点的进程
Sentinel节点
监控Redis数据节点
一个独立的Sentinel进程
Sentinel节点集合
若干Sentinel节点的抽象组合
若干Sentinel节点进程 ...
Redis-面试题
Redis 面试题
参考文献
分布式系统架构面试题汇总(万字总结)
一张图搞懂Redis缓存雪崩、缓存穿透、缓存击穿
精选 21道 Redis 最常问面试题!收藏一波 !
Redis雪崩(大量失效)问题
描述
现象:大量key同一时间点失效,同时又有大量请求打进来,导致流量直接打在DB上,造成DB不可用.
缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,请求直接落到数据库上,引起数据库压力过大甚至宕机.和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库.
简单的雪崩过程
Redis集群产生了大面积故障;
缓存失败,此时仍有大量请求去访问Redis缓存服务器;
在大量Redis请求失败后,这些请求将会去访问数据库;
由于应用程序的设计依赖于数据库和Redis服务,很快就会造成服务器集群的雪崩,最终导致整个系统的瘫痪;
解决方案:
加互斥锁 :跟缓存击穿解决思路一致,同一时间只让一个线程构建缓存,其他线程阻塞排队.
缓存永不过期:设置key永不失效(热点数据);
均匀过期:设置key缓 ...
Redis-持久化
Redis持久化
持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在数据库中,或者存储在磁盘文件中、XML数据文件中等等。
还可以从如下两个层面简单的理解持久化:
应用层:如果关闭(shutdown)你的应用然后重新启动则先前的数据依然存在。
系统层:如果关闭(shutdown)你的系统(电脑)然后重新启动则先前的数据依然存在。
Redis为什么要持久化
Redis是内存数据库,为了保证效率所有的操作都是在内存中完成。数据都是缓存在内存中,当你重启系统或者关闭系统,之前缓存在内存中的数据都会丢失再也不能找回。因此为了避免这种情况,Redis需要实现持久化将内存中的数据存储起来。
Redis如何实现持久化?
Redis官方提供了不同级别的持久化方式:
RDB持久化:能够在指定的时间间隔能对你的数据进行快照存储。
AOF持久化:记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾。Redis还能对 ...
Redis-主从复制
参考文献
极客时间专栏: Redis核心技术与实战
Redis主从复制
参与复制的Redis实例划分为主节点(master)和从节点(slave).
主从复制的开启,完全是在从节点发起的;不需要我们在主节点做任何事情.
默认情况下,Redis都是主节点.每个从节点只能有一个主节点,而主节点可以同时有多个从节点.
复制的数据流是单向的,只能由主节点复制到从节点;
Redis主从复制的作用
数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式.
故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余.
负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务,分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量.
高可用基石:主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础.
Redis 的同步机制
Redis 可以使用主从同步,从从同步.第一次同步时,主节点做一次 bgsave,并同时将后续修改操作记录到内 ...
Redis-数据结构以及使用场景
参考文献
一口气说出Redis 5种数据结构及对应使用场景,面试要加分的
《Redis开发与运维》
3w字深度好文|Redis面试全攻略,读完这个就可以和面试官大战几个回合了
极客时间专栏: Redis核心技术与实战
Redis数据结构以及使用场景
数据结构和内部编码
对外常用的数据结构: string(字符串),hash(哈希),list(列表),set(集合),zset(有序集合);
Redis底层的数据结构: 简单动态数组SDS、链表、字典、跳跃链表、整数集合、压缩列表、对象.
查看内部编码:object encoding key
数据结构
结构源码位置
内部编码
raw
string
src/sds.h和src/sds.c
int
embstr
hash
src/dict.h
hashtable
ziplist压缩列表
list
linkedlist双端队列表
ziplist压缩列表
quicklist
set
hashtable
intset
sorted set
src/t_z ...
Redis-特性以及运维操作
Redis特性以及使用场景
Redis的特性
速度快
Redis所有数据都放在内存中;
Redis是用C语言实现的,一般来说C语言实现的程序离操作系统更近,执行速度相对会更快;
Redis使用了单线程架构,预防了多线程可能产生的竞争问题;
基于键值对的数据结构服务器
Redis 全称为REmote Dictionary Server,它主要提供了5种数据结构:字符串、哈希、列表、集合、有序列表,同时在字符串的基础上演变出了位图(Bitmaps)和HyperLogLog,随着(LBS[Location Based Service 基于位置服务]的发展,Redis3.2版本中加入了有关**GEO(地理信息定位)**的功能.
丰富的功能
提供了键过期功能,可以用来实现缓存;
提供发布订阅功能,可以实现消息系统;
支持Lua脚本,可以利用Lua创造新的Redis命令;
提供了简单的事务功能,能在一定程度上保证事务特性;
提供了**流水线(Piepeline)**功能,客户端可以将一批命令一次性传到Redis中,减少了网络的开销;
简单稳定
客户端语言多
Redis提供了简 ...