脑图下载地址:https://mm.edrawsoft.cn/mobile-share/index.html?uuid=cf5bf135744412-src&share_type=1
事务
定义
事务是一个单独的隔离操作,事务中的所有操作都将序列化,有顺序的执行,事务执行的过程中不会被其他客服端发来的命令打断
作用
串联多个命令防止其他命令插队
命令
key [key …]
key1 [key2],可以监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
Multi
输入的命令都会进入命令队列,但是不会执行,将等待Exec命令执行,然后依次执行
Exec
执行命令队列
discard
丢弃命令队列
事务的错误处理
组队成功,执行成功,所有的命令都将有序执行
组队成功,选择discard,所有的命令都不会执行
组队中某个命令出错,执行时整个队列的命令都会被取消
组队成功,执行时某个命令出错,除了出错的命令,其他的命令都将执行
Redis事务没有原子性
Redis事务的三大特性
单独的隔离操作
事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
没有隔离级别的概念
队列中的命令没有提交之前都不会实际被执行,因为事务提交前任何指令都不会被实际执行
不保证原子性
事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚
Redis事务与Mysql事务的区别(围绕ACID)
持久化
RDB
核心配置
dbfilename 配置文件名称
save
- 多少秒内进行了多少次操作
触发RDB
自动触发save
会阻塞主进程,直到完成RDB持久化
手动保存: bgsave
Redis会在后台异步进行快照操作, 快照同时还可以响应客户端请求。
通过lastsave可以获取最后一次执行快照的时间
不会阻塞主进程
执行flushall命令
执行flushall命令,也会产生dump.rdb文件,但里面是空的,没有意义
flushdb命令不会产生dump.rdb文件
正常退出Redis
redis.conf中更多配置
stop-writes-on-bgsave-error
当Redis无法写入磁盘的话,直接关掉Redis的写操作。推荐yes
rdbcompression 压缩文件
如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能。推荐yes.
rdbchecksum 检查完整性
在存储快照后,还可以让redis使用CRC64算法来进行数据校验
持久化流程(内存快照)
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到 一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。 整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能 如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失
Fork的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量、环境变量、程序计数器等) 数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程
优势
的数据恢复
更适用
节省磁盘空间
恢复速度快
劣势
快照所有的修改
AOF
介绍
的形式记录每一次写操作,只可以追加文件但不能改写文件
默认不开启
appendonly no
AOF和RDB同时开启会优先选择AOF
持久化流程
客户端的请求写命令会被追加到AOF缓冲区
AOF缓冲区根据AOF持久化策略将操作同步到磁盘的AOF文件中
AOF文件超过重写策略或手动重写时,会对AOF文件rewrite重写,压缩AOF文件容量
Redis服务器重启时,会load加载AOF文件中的写操作
同步频率设置
appendfsync always
始终同步,每次Redis的写入都会立刻记入日志;性能较差但数据完整性比较好
appendfsync everysec
每秒同步,先将日志写到AOF文件的内存缓冲区,每隔一秒再把缓冲区的内容写入磁盘,如果宕机,本秒的数据可能丢失
appendfsync no
redis不主动进行同步,把同步时机交给操作系统。
优势
备份机制更稳健,数据不容易丢失
,可以处理错误操作
劣势
占用更多的磁盘空间
速度慢
性能有压力
,造成不能恢复
Redis过期键删除策略
Redis采用的是定期删除和惰性删除两种结合的策略
抽取设置了过期时间的key,检查是否过期,过期删除
每1秒重复10次,随机抽取20个key检查是否过期,如果25%的key过期了,就重复该行为
会漏掉很多的过期键
惰性删除:数据过期时,先不处理,当过期键被访问时,在进行删除
用空间换时间
如果漏掉了很多的过期键,并且没有去检查,也就不会走惰性删除,大量的过期键堆积在内存中,导致Redis内存耗尽,此时就要走内存淘汰机制
主从复制
是什么
主机数据更新后,根据策略,自动将数据同步到master/slave机制.master负责写,slave负责读
能干嘛
读写分离,性能扩展
容灾快速恢复,提高可用性
怎么玩
启动多个redis服务
配置从库
执行 slaveof IP port
查询主从信息
info replication
常见情况
一主二仆
从机是否可以写?set可否?
不可以写,set也不行
主机shutdown后情况如何?从机是上位还是原地待命?
从机原地待命
主机又回来了后,主机新增记录,从机还能否顺利复制?
可以
其中一台从机down后情况如何?依照原有它能跟上大部队吗?
可以
薪火相传
master和slave双重身份的机器是否可以写数据呢??
不可以,只要有从机的身份,就不能写数据
反客为主
主机宕机了,可以手动使从机变为主机
复制原理
slave启动成功连接到master后会发送一个sync命令
Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令, 在后台进程执行完毕之后,master将传送整个RDB数据文件到slave,以完成一次完全同步
:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
:Master继续将新的所有收集到的修改命令依次传给slave,完成同步
但是只要是重新连接master,一次完全同步(全量复制)将被自动执行
哨兵模式
哨兵就是一个运行在特性模式下的Redi进程,主要有三个任务
监控
给所有的主从库发送PING命令,检查是否存活,没有在规定的时间内响应判定为下线
主观下线
- 为“主观下线
客观下线
- 如果 N/2+1 的哨兵都将该主库标记为主观下线,那么该主库就会被标记为 “客观下线”
只有主库被标记为客观下线,哨兵才会去选举新的主库
选主
主库挂了将在从机中选出新的主库
选举新的主库过程
-
筛选
- 从库的当前在线状态,还要判断它之前的网络连接状态
-
打分
-
从库优先级
-
从库复制进度
-
从库ID号
-
通知
将新的主库信息发送给其他的从库,让其他的从库和新的主库建立连接,进行数据复制
是什么
反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库
怎么玩
新建sentinel.conf文件,名字绝不能错
配置哨兵,填写内容
sentinel monitor mymaster 127.0.0.1 6379 1
其中mymaster为监控对象起的服务器名称, 1 为至少有多少个哨兵同意迁移的数量。
启动哨兵
/usr/local/bin
执行redis-sentinel /myredis/sentinel.conf
当主机挂掉,将在从机中选新的主机
选举规则
优先级
- 在redis.conf中默认:replica-priority 100,值越小优先级越高
偏移量
- 偏移量是指获得原主机数据最全的
runid
- 每个redis实例启动后都会随机生成一个40位的runid(通过info server获取查看)
集群
什么是集群
对Redis的水平扩容
集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。
主机宕机,从机自动提升为Master
配置
redis cluster配置修改
cluster-enabled yes 打开集群模式
cluster-config-file nodes-6379.conf 设定节点配置文件名
cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换。
启动
redis-cli --cluster create --cluster-replicas 1 192.168.11.101:6379 192.168.11.101:6380 192.168.11.101:6381 192.168.11.101:6389 192.168.11.101:6390 192.168.11.101:6391
不要用127.0.0.1, 请用真实IP地址
什么是slots
一个 Redis 集群包含 16384 个插槽(hash slot), 数据库中的每个键都属于这 16384 个插槽的其中一个
不在一个slot下的键值,是不能使用mget,mset等多键操作。
集群的不足
多键操作是不被支持的
多键的Redis事务是不被支持的。lua脚本不被支持
复杂度较大
为什么集群需要至少三个节点
一个节点挂了,有一半以上的节点通过ping-pong方式的投票机制认为它挂了,那么这个集群就挂了.如果只有两个节点,一个节点挂了,另外一个节点投票.只有50%,不过半数,这个集群就不会挂,所以至少需要三个节点
为什么集群至少需要六台服务器
因为一个集群至少需要三个节点,而每一个节点需要一个备份机,所以一个集群需要至少六台服务器
JAVA连接开发 Jedis
依赖: jedis
JedisPool 连接池
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="100"/>
<property name="maxIdle" value="100"/>
<property name="testOnBorrow" value="true"/>
<property name="testOnReturn" value="true"/>
</bean>
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
<constructor-arg name="host" value="192.168.11.222" />
<constructor-arg name="port" value="6379" type="int" />
<constructor-arg name="timeout" value="30000" type="int" />
</bean>
setBlockWhenExhausted
/连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
setTestOnBorrow
从连接池中取连接的时候检查是否失活
自动装配JedisPool对象
@Autowired
private JedisPool jedisPool;
五大数据类型
五大数据类型