• Redis 强化之一


    目录

    缓存使用原则

    什么时候,什么样的数据能够保存在Redis中?

    缓存淘汰策略

    Redis持久化

    Redis实现持久化有两种策略:

    RDB:(Redis Database Backup)

    AOF(Append Only File):


    缓存使用原则

    什么时候,什么样的数据能够保存在Redis中?

    1.数据量不能太大(存在内存,所以数据量不能太大)

    2.使用越频繁(查询),越适合用Redis保存数据,来减轻数据库的压力

    3.保存在Redis中的数据一般不会是数据库中频繁修改的


    缓存淘汰策略

    Redis将数据保存在内存中, 内存的容量是有限的,如果Redis服务器的内存已经满了,还需要向Redis中保存新的数据,就需要缓存的淘汰策略,清除一些数据。

    • noeviction:返回错误,抛出一个异常(是默认的缓存淘汰策略)

    可以设置满足某些条件的信息删除后,再将新的信息保存

    • allkeys-random:所有数据中随机删除数据

    • volatile-random: 过期时间的数据中随机删除数据

    • volatile-ttl:删除剩余有效时间最少的数据

    • allkeys-lru:所有数据中删除上次使用时间距离现在最久的数据

    • volatile-lru有过期时间的数据中删除上次使用时间距离现在最久的数据

    • allkeys-lfu:所有数据中删除使用频率最少

    • volatile-lfu:有过期时间的数据中删除使用频率最少


    Redis持久化

    • Redis将信息保存在内存(内存的特征就是一旦断电,所有信息都丢失 ),所有数据丢失后,再重新加载数据,就需要从数据库从新查询所有数据,这个操作耗费时间,而且对数据库的压力也非常大。
    • 有些业务先将数据保存在Redis,隔一段时间和数据库同步的,如果Redis断电,这段时间的数据就完全丢失了。
    • Redis支持持久化的功能,可以防止Redis的重启对数据库带来额外的压力和数据的丢失,
    • 持久化是将Redis中保存的数据,以指定方式保存在Redis当前服务器的硬盘上(断电数据也不会丢失)。再启动Redis时,可以利用硬盘中的信息来恢复数据

    Redis实现持久化有两种策略:

    RDB:(Redis Database Backup)

    RDB本质上就是数据库快照(就是当前Redis中所有数据转换成二进制的对象,保存在硬盘上)

    默认情况下,每次备份会生成一个dump.rdb的文件,当Redis断电或宕机后,重新启动时,会从这个文件中恢复数据,获得dump.rdb中所有内容。

    实现这个效果我们可以在Redis的配置文件中添加如下信息

    save 60 5

    上面配置中:

    • 60表示秒
    • 5表示Redis的key被修改的次数

    配置效果:1分钟内如果有5个key以上被修改,就启动rdb数据库快照程序

    优点:

    • 因为是整体Redis数据的二进制格式,数据恢复是整体恢复的(最后一次生成的rdb中的数据包括之前的数据没有丢失)

    缺点:

    • 生成的rdb文件是一个硬盘上的文件,读写效率是较低的

    • 如果突然断电,只能恢复最后一次生成的rdb中的数据

    AOF(Append Only File):

    AOF策略是将Redis运行过的所有命令(日志)备份下来,保存在硬盘上

    这样即使Redis断电,我们也可以根据运行过的日志,恢复为断电前的样子

    我们可以在Redis的配置文件中添加如下配置信息

    appendonly yes

    经过这个设置,就能保存运行过的指令的日志了

    理论上任何运行过的指令都可以恢复

    但是实际情况下,Redis非常繁忙时,我们会将日志命令缓存之后,整体发送给备份,减少io次数以提高备份的性能和对Redis性能的影响

    实际开发中,配置一般会采用每秒将日志文件发送一次的策略,断电最多丢失1秒数据

    优点:

    相对RDB来讲,信息丢失的较少

    缺点:

    因为保存的是运行的日志,所以占用空间较大

    实际开发中RDB和AOF是可以同时开启的,也可以选择性开启

    Redis的AOF为减少日志文件的大小,支持AOF rewrite

    简单来说就是将日志中无效的语句删除,能够减少占用的空间

  • 相关阅读:
    Python面试题:如何在 Python 中解析 XML 文件?
    合并区间问题
    prometheus获取kubelet接口监控数据
    MyBatis-Plus 和swagger
    在线生产cron定时任务表达式
    appium+python自动化测试
    设计模式之状态模式
    多线程的创建
    Jackson ObjectMapper详解
    JavaScript模块化:提高代码可维护性和可重用性的利器
  • 原文地址:https://blog.csdn.net/qq_55112725/article/details/127280641