Redis进阶使用
在日常工作中,使用Redis有什么需要注意的?
- 设置合适的过期时间。
- 尽量避免大key问题,避免用字符串存储过大的数据;避免集合的数据量太大,要定期清除。
常用的数据结构有哪些?用在什么地方?
按照使用的频率排序。
- 字符串类型,用作常规的缓存,比如缓存token;存储点赞数、库存等需要增减的数字类型,自带自增自减API。
- zset类型,支持去重和排序,可以用来实现排行榜,使用热度作为分数值,每次插入数据的时候记得删除排行榜之外的数据,还可以随机获取数据。
- 哈希类型,对于符合对象结构类型的数据,可以考虑使用哈希类型存储。例如一个班有多个学生。可以用班级id作为哈希的key,使用学员id作为键,存储学生信息JSON数据。
- set类型,需要去重又不需要排序的时候可以使用set结构,速度比zset要快一点。
- list类型,存储集合数据,支持随机取值。
如何保证数据库和缓存的一致性?
首先明确一点,使用了缓存了,就基本会存在延迟,因此在能接受一点延迟的情况下才使用缓存。
需要保持数据库和缓存一致性的数据都会设置合适的过期时间,这个过期时间是保持一致性兜底。
更新缓存方案
该方案就是在数据更新完成之后就去更新缓存。如果事务尚未提交就更新,可能事务回滚了导致缓存和数据库不一致。事务提交之后更新缓存失败,也会导致缓存和数据库不一致。
但也有优势,特别是现在很多项目的数据库都采用主从架构,主动更新可以直接拿到最新的数据。
如果缓存的过期时间设置得比较短,并且可以接受短时间不一致,可以考虑使用该方案。
删除缓存方案
该方案就是在数据更新完成之后就去删除缓存。下次查询的时候检测到没有缓存就会去数据库查缓存。
存在缓存删除失败问题。还有一个更致命的问题,因为更新缓存的时候一般查的是从库,有可能主从同步尚未完成就将旧值更新到了缓存导致缓存和数据库不一致。
延时双删方案
该方案是基于上述的方案的改进版,先删除缓存,延时之后再删除一次。这样可以防止第一次删除失败,也可以防止主从同步完成之前将旧值更新到缓存。
但也会引入新的问题,延时时间难以精准控制。不同数据库的主从复制时间差不同。
并且延时需要引入新的中间件,增加了不确定性,可能中间件故障导致消息丢失而第二次删除失败。
容易引发缓存击穿,两次删除缓存会导致大量请求进入数据库。
实际企业开发中使用较少。
订阅binlog方案
通过订阅binlog来更新缓存,该方案可以确保更新的是最新变更的数据。大厂一般用该方案。
通过监听binlog的变化来异步更新缓存,该方案防止了读取到旧数据的问题。
分布式锁+版本号方案
该方式通过对比版本号来防止更新到旧数据。在数据库存储数据的版本号,并且在缓存缓存数据的版本号。在更新的时候加分布式锁防止并发更新,查询缓存中的版本号和查到的数据的版本号进行对比,如果缓存的版本号小于数据库的版本号则更新吗,这样也可以防止更新旧数据到缓存。
什么是Redis的大key问题?
Redis的大key问题本质上是Redis的key对应的值太大了,比如字符串类型的值到了5M或者集合类型数量集合内元素量达到了5000.
大key问题有什么影响?
- 内存占用高,容易引发OOM;
- 大key数据操作延迟高,像持久化、迁移等;
- 读取的大key时候会阻塞其他操作。
出现Redis大key问题该如何处理?
处理Redis大key问题可以分成两部分,一部分是处理已经产生的大key,一部分是预防。
对于已经产生的大key,首先可以通过一些工具来找出这些大key,比如使用redis-cli --bigkeys结合MEMORY USAGE key可以查看某个key对应的值的大小。
- 拆分大key,将大key的值拆分来降低单个值的大小。字符串类型可以通过固定_后缀拆分成子key存储,哈希类型可以按照字段哈希进行分片,集合类型可以按照数量进行分片。
- 拆分之后的值可能还是大,可以存储值之前使用压缩算法压缩值,进一步降低值的大小。
- 采用异步删除来删除key,这样可以防止阻塞,采用unlink,不要采用del。
- 设置合适的过期时间,特别是临时性大key
- 针对集合类型的数据结构,记得要清除无用数据,避免集合越来越大。
预防方面,在设计初期就预测key的大小,如果可能发展成大key的键,在设计上可以直接采用上述设计。
相关文章:
Redis进阶使用
在日常工作中,使用Redis有什么需要注意的? 设置合适的过期时间。尽量避免大key问题,避免用字符串存储过大的数据;避免集合的数据量太大,要定期清除。 常用的数据结构有哪些?用在什么地方? 按…...
Python常见面试题的详解6
1. 按字典 value 值排序 要点:对于给定字典,使用 sorted() 函数结合 items() 方法,依据 value 进行排序,也可以定义一个通用函数,支持按 value 升序或降序排序。示例: python d {a: 1, b: 2, c: 3, d: …...
Linux基础之文件权限的八进制表示法
1. Linux 文件权限概述 在 Linux 中,每个文件或目录都有三种基本权限,分别是: 读权限 - r:允许查看文件内容。写权限 - w:允许修改文件内容。执行权限 - x:允许执行文件或进入目录。 每个文件或目录的权…...
数据结构与算法面试专题——堆排序
完全二叉树 完全二叉树中如果每棵子树的最大值都在顶部就是大根堆 完全二叉树中如果每棵子树的最小值都在顶部就是小根堆 设计目标:完全二叉树的设计目标是高效地利用存储空间,同时便于进行层次遍历和数组存储。它的结构使得每个节点的子节点都可以通过简…...
《On Java进阶卷》阅读笔记(五)
第7章 IO系统 I/O流: IO有很多不同的来源和去处,如文件、控制台网络连接等,而且还涉及需求以很多种方式,如顺序读取、随机访问、缓冲、字符、按行读取、按字读取等。 Java8的函数式流相关的类和IO流之间并无关联。 IO流隐藏了…...
《代码随想录》刷题笔记——回溯篇【java实现】
文章目录 组合组合总和 III电话号码的字母组合组合总和组合总和II思路代码实现 分割回文串※思路字符串分割回文串判断效率优化※ 复原 IP 地址优化版本 子集子集 II使用usedArr辅助去重不使用usedArr辅助去重 递增子序列※全排列全排列 II重新安排行程题意代码 N 皇后解数独直…...
数值积分:通过复合梯形法计算
在物理学和工程学中,很多问题都可以通过数值积分来求解,特别是当我们无法得到解析解时。数值积分是通过计算积分区间内离散点的函数值来近似积分的结果。在这篇博客中,我将讨论如何使用 复合梯形法 来进行数值积分,并以一个简单的…...
AcWing——3624. 三值字符串
双指针解法 #include<iostream> #include<unordered_map> using namespace std; int main() {int n; cin >> n;while(n--){unordered_map<char, int> tree;string s; cin >> s;int ans 0x7fffffff; for(int i 0, j 0; j < (int)s.size();…...
【JavaEE进阶】验证码案例
目 🌲实现说明 🎄Hutool介绍 🌳准备工作 🌴约定前后端交互接口 🚩接口定义 🚩实现服务器后端代码 🚩前端代码 🚩整体测试 🌲实现说明 随着安全性的要求越来越⾼…...
Uniapp 短视频去水印解析工具开发实现
最近搞了一个有意思的小工具——短视频去水印解析器!这玩意儿可以把短视频中的水印给抹掉,还能提取视频、封面等资源。整个项目用了 Uniapp 开发,做完后体验了一下,发现还挺顺手。今天就来跟大家聊聊实现思路和代码细节~ 需求分析…...
计算机网络-八股-学习摘要
一:HTTP的基本概念 全称: 超文本传输协议 从三个方面介绍HTTP协议 1,超文本:我们先来理解「文本」,在互联网早期的时候只是简单的字符文字,但现在「文本」的涵义已经可以扩展为图片、视频、压缩包等&am…...
编程速递-庆祝Delphi诞生30周年!
庆祝Delphi 30周年纪念是一个特别的时刻。 回到1995年,也就是30年前,在微软Windows和互联网时代的曙光初现之时,Borland Delphi的创建者们无法想象,当时使用Borland Delphi构建的应用程序至今仍在运行——为全世界数十亿人服务。…...
每天五分钟深度学习框架pytorch:搭建谷歌的Inception网络模块
本文重点 前面我们学习了VGG,从现在开始我们将学习谷歌公司推出的GoogLeNet。当年ImageNet竞赛的第二名是VGG,而第一名就是GoogLeNet,它的模型设计拥有很多的技巧,这个model证明了一件事:用更多的卷积,更深的层次可以得到更好的结构 GoogLeNet的网络结构 如图所示就是Go…...
性能测试流程、主流性能工具
性能测试流程 性能测试流程 测试测试需求分析 性能测试计划和方案 测什么: 测试背景 测试目的 测试范围 谁来测: 进度和分工 交付清单 怎么测: 测试策略 性能测试用例设计 性能测试测试执行 性能分析和调优 性能测试报告 测试报告是…...
DeepSeek4j 已开源,支持思维链,自定义参数,Spring Boot Starter 轻松集成,快速入门!建议收藏
DeepSeek4j Spring Boot Starter 快速入门 简介 DeepSeek4j 是一个专为 Spring Boot 设计的 AI 能力集成启动器,可快速接入 DeepSeek 大模型服务。通过简洁的配置和易用的 API,开发者可轻松实现对话交互功能。 环境要求 JDK 8Spring Boot 2.7Maven/Gr…...
无耳科技 Solon v3.0.8 发布,Java 企业级应用开发框架
Solon 框架! Solon 是新一代,Java 企业级应用开发框架。是杭州无耳科技有限公司的“根级”开源项目(最近“杭州六小龙”很火啊,我们也是杭州的哦)。从零开始构建(No Spring、No Java-EE、No Servlet&#…...
【吾爱出品】针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版
针对红警之类老游戏适用WIN10和11的补丁cnc-ddraw7.1汉化版 链接:https://pan.xunlei.com/s/VOJ8PZd4avMubnDzHQAeZDxWA1?pwdnjwm# 直接复制到游戏安装目录,保持与游戏主程序同目录下。...
使用 playwright 自定义 js 下载的路径和文件名
遇到一个问题,点击按钮自动下载文件,路径和文件名都不能自定义,可以用 playwright 来解决这个问题 from playwright.sync_api import sync_playwright import os import time class ExcelDownloader: def __init__(self, download_pat…...
Kafka分区管理大师指南:扩容、均衡、迁移与限流全解析
#作者:孙德新 文章目录 分区分配操作(kafka-reassign-partitions.sh)1.1 分区扩容、数据均衡、迁移(kafka-reassign-partitions.sh)1.2、修改topic分区partition的副本数(扩缩容副本)1.3、Partition Reassign场景限流1.4、节点内副本移动到不…...
3.从零开始学会Vue--{{生命周期,工程化,组件化}}
1.生命周期钩子 1.是什么 生命周期 概念:就是一个Vue实例从创建 到 销毁 的整个过程 生命周期包括:① 创建 ② 挂载 ③ 更新 ④ 销毁 四个阶段 1.创建阶段:创建响应式数据 2.挂载阶段:渲染模板 3.更新阶段:修改…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...
