当前位置: 首页 > news >正文

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

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

相关文章:

  • 打印设备电磁泄露信息提取和还原技术的matlab仿真实现
  • 【C++】类和对象(中)—— 日期类的实现 | const成员函数
  • 树莓派视频监控项目总结
  • datax与多种数据库间数据类型映射
  • Redis哨兵模式与Redis缓存穿透、击穿和雪崩
  • Ubuntu Budgie 22.04 设置中文语言并安装拼音输入法
  • 4K Star , Github上照片转漫画最强项目
  • Matlab 创建YOLO v2目标检测网络(仅仅是网络)
  • Java集合04:Collection子接口二:Set接口
  • 查看CPU核数、内存使用情况【一文读懂】
  • 【 java 多线程】死锁的问题
  • 全网都在说一个错误的结论
  • 免杀实战之面向PHP的WebShell免杀
  • LeetCode刷题复盘笔记—一文搞懂有序数组/链表转成二叉搜索树 二叉搜索树变平衡
  • Leetcode257. 二叉树的所有路径 Binary Tree Paths - Python递归法/回溯法
  • .pyc 想到的一些问题
  • 《剑指offer》分解让复杂问题更简单
  • 2017届校招提前批面试回顾
  • Next.js之基础概念(二)
  • Rancher-k8s加速安装文档
  • 阿里云购买磁盘后挂载
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 对象管理器(defineProperty)学习笔记
  • 实现简单的正则表达式引擎
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 一文看透浏览器架构
  • ​TypeScript都不会用,也敢说会前端?
  • #define
  • $.ajax中的eval及dataType
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (二)斐波那契Fabonacci函数
  • (二)换源+apt-get基础配置+搜狗拼音
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (学习日记)2024.02.29:UCOSIII第二节
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转) Face-Resources
  • (转)EXC_BREAKPOINT僵尸错误
  • .bashrc在哪里,alias妙用
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET轻量级ORM组件Dapper葵花宝典
  • .so文件(linux系统)
  • @Autowired多个相同类型bean装配问题
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @基于大模型的旅游路线推荐方案
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [Android]Tool-Systrace
  • [asp.net core]project.json(2)
  • [bzoj1912]异象石(set)
  • [C#] 我的log4net使用手册
  • [C#基础]说说lock到底锁谁?
  • [go 反射] 进阶
  • [Head First设计模式]策略模式
  • [HTTP]HTTP协议的状态码