Redis数据库进阶

Redis数据库进阶
强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码

主从备份

在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制(replicate)另一个服务器,我们称呼被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),如图所示。

在这里插入图片描述
127.0.0.1:12345> SLAVEOF 127.0.0.1 6379
从服务器 主服务器

持久化及原理(原生持久化&结合mysql数据库持久化)

方式一:快照
RDB(默认) 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。
以下设置会让 Redis 在满足“ 60 秒内有至少有 1000 个键被改动”这一条件时, 自动保存一次数据集:

save 60 1000

方式二:同步到数据文件
AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。
在配置文件中启动AOF

appendonly yes

方式三:使用虚拟内存的方式

缓存失效策略(即淘汰过期数据)
即数据超过内存如何处理?
在设置文件中配置最大内存

server.maxmemory

三种主要算法

  • FIFO:First In First Out,先进先出。判断被存储的时间,离目前最远的数据优先被淘汰。
  • LRU:Least Recently Used,最近最少使用。判断最近被使用的时间,目前最远的数据优先被淘汰。
  • LFU:Least Frequently Used,最不经常使用。在一段时间内,数据被使用次数最少的,优先被淘汰。

redis 提供 6种数据淘汰策略(maxmemory-policy):

  • volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
  • volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
  • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
  • allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
  • allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
  • no-enviction(驱逐):禁止驱逐数据 默认

三种过期策略

  • 定时删除:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除
  • 惰性删除: key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null。
  • 定期删除: 每隔一段时间执行一次删除过期key操作

宕机如何处理

  • 创建一个定期任务(cron job), 每小时将一个 RDB 文件备份到一个文件夹, 并且每天将一个 RDB 文件备份到另一个文件夹。
  • 确保快照的备份都带有相应的日期和时间信息, 每次执行定期任务脚本时, 使用 find 命令来删除过期的快照: 比如说, 你可以保留最近
    48 小时内的每小时快照, 还可以保留最近一两个月的每日快照。
  • 至少每天一次, 将 RDB 备份到你的数据中心之外, 或者至少是备份到你运行 Redis 服务器的物理机器之外。

事务与分布式锁机制

redis事务是一组命令的集合。
事务开始的时候先向Redis服务器发送 MULTI 命令,然后依次发送需要在本次事务中处理的命令,最后再发送 EXEC 命令表示事务命令结束。
在这里插入图片描述
命令并不会立刻马上执行,只有在执行EXEC命令才会逐一执行命令。

乐观锁和分布式锁
Redis的WATCH、MULTI和EXEC命令,只会在数据被其他客户端抢先修改的情况下,通知执行这些命令的客户端,让它撤销对数据的修改操作,并不能阻止其他客户端对数据进行修改,所以只能称之为乐观锁(optimistic locking)。

乐观锁可能因为事务执行失败,而长期占有资源,产生死锁。
分布式通过互斥来防止彼此干扰来保证事务的一致性
Redis实现分布式锁主要用到命令是SETNX命令(SET if Not eXists)。
  语法:SETNX key value
  功能:当且仅当 key 不存在,将 key 的值设为 value ,并返回1;若给定的 key 已经存在,则 SETNX 不做任何动作,并返回0。

在这里插入图片描述

本文来源蹊源的奇思妙想,由架构君转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/14685