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

Redis常识

缓存的三个风险

  • 缓存雪崩(缓存引起的数据库,乃至整个系统的雪崩)(大量Key同时过期 或者redis挂)
    • 过期时间加扰动值
    • 后台更新缓存值(缓存永不过期,消息队列)
    • key过期,只允许一个请求(线程) 回源 (锁机制,甚至不用分布式锁也可以)
  • 击穿(热点数据过期)
    • key分片,key= key1 + key2… ,各个分片分担流量
    • 雪崩的处理方式都可以用到击穿的场景
  • 穿透(用户访问的数据,既不在缓存中,也不在数据库中)
    • 对被穿透key的访问限流
    • 缓存空值/默认值
    • 布隆过滤器(redis也自带了布隆过滤器的实现)
      • 如果bloomfilter说有,那可能没有
      • 如果bloomfilter说没有,那一定就没有

see also

数据结构

  • str
    • 存session
    • 分布式锁(setnx)
    • 简单计数器
  • list
    • mq
  • hash
    • 存储对象
  • set
    • 集合特性:不重复、可交集、差集、并集计算
    • 点赞场景:一个用户只能对一个key(文章) 点赞一次
    • 共同好友、共同关注的公众号场景
    • 抽奖:一个用户只能抽一次
  • zset
    • 排行榜(根据分数去排序)
    • 相同分数下获取满足前缀的元素,比如获取131 开头的电话号码
  • bitmaps
    • value只能为0或1,用于大数据集的 0、1 值统计,比如签到,要么签到了要么没签到
  • hyperloglog
    • 统计大数据集的不同元素数量。内存占用小,不过只能取近似精确的结果
    • 百万级网页 UV 计数
  • 地理空间(geospatial)
    • 存储和计算经纬度
  • Stream 数据类型
    • 实现消息队列的绝佳数据结构:支持持久化、自动生成全局唯一ID、ack模式、消费者组机制

see also

淘汰策略 和 过期删除策略

Redis的淘汰和过期删除策略是两个不同的概念。

  • 过期删除:key 带ttl
  • 淘汰: 内存不够用了,删除符合条件的key
过期删除

1、如何判断key 已经过期?
redis的【过期字典】数据结构中存储了 <key,ttl> ,get key的时候先从【过期字典】中get ,并将ttl 和当前时间做比较,可以判断出key是否过时。

2、过期删除策略

  • 定时删除: set key ttl的时候,注册一个定时事件,到点就删除。
    这种方式对内存友好(到点就删),但当ttl key多时,对CPU不好,因为需要额外线程干活。
  • 惰性删除(lazy free): get key 时,发现key过期了就删。
    这对内存不够好(删得不及时),但对CPU好
  • 定期随机检查删除: 每隔一段时间【随机】从过期字典中选出一批key检查是否过期,如是则删除。
    这是定时删除和惰性删除的折中。

redis真正的做法是 【惰性删除】 + 【定期随机检查删除】共存。

淘汰

分两大类
一类【不进行淘汰-noevinction】,当内存不够用,返回错误;
二类【进行淘汰】。

【进行淘汰】的策略可再分:
1、设置了ttl key淘汰

  • volatile-random : 随机淘汰设置了ttl 的key
  • volatile-ttl : 优先淘汰更早过期的key
  • volatile -lru :least-recently-used
  • volatile -lfu: least-frequently-used

2、所有范围的key 淘汰

  • allkeys-random : 随机淘汰任意key
  • allkeys-lru
  • allkeys-lfu

值得一提是:3.0+的redis,使用 【noeviction】作为默认策略,这对用户使用redis的容量评估提供了更高的要求。

如何理解单线程

  • before6.0,网络IO+KV读写是 单线程;
  • after6.0,网络IO是多线程,KV操作是单线程。即使多线程并非彻底的多线程,I/O线程只能同时执行读或者同时执行写操作

redis特性

Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)

复制

主从复制是个比较复杂的过程,详见 see also

gossip协议

事务(和mysql不同,是不严格的事务 )

假如现开启了事务,包括了一组命令,拿传统DB的ACID“套”一下:

  • 原子性A

    • exec前,如果命令入队失败,事务不会执行,原子性可以保证
    • exec后,多个命令中其一执行异常,不会回滚这组命令,所以不能保证原子性
  • 能保证隔离性 A 【客户端A执行事务(注意只是exec期间),客户端B的请求会阻塞住】

  • 一致性 C

    • 理解1:一致性的核心是约束 (唯一性约束” 和 “完整性约束”),redis能满足
    • 理解2:原子性,隔离性和持久性是数据库的属性,而一致性(在 ACID 意义上)是应用程序的属性。应用可能依赖数据库的原子性和隔离属性来实现一致性,但这并不仅取决于数据库。
      因此,字母 C 严格来说不属于 ACID 。这就没有“redis的一致性”说法了
  • 持久性 D

    • 开启了rdb/aof
    • rdb可能没有生成快照
    • aof:no/everysec有丢失数据风险,always性能差一般不使用,所以实践角度看,持久性没有保证
  • 隔离性I

    • 并发操作在 EXEC 执行前,隔离性需要通过 WATCH 机制来保证
    • 并发操作在 EXEC 命令之后,隔离性可以保证:Redis 是单线程执行命令,EXEC 命令执行后,Redis 会保证先把事务队列中的所有命令执行完之后再执行之后的命令。
  • see also

集群(高可用)

  • 主从 【主可读写,从只读;主挂了,不可写,要手动切换主】
  • 哨兵 【基于主从,主可读写,主挂了,哨兵会重新选主。哨兵集群要高可靠,算是独立的服务。一个哨兵集群可以检测多个redis主从】
    see also
  • cluster集群 【官方推荐的高可用方案】
    • 【主从和哨兵数据都是没有分片的,容量有上限;cluster会分片,分片后mget mset等不可用】
    • 【实际上是多组主从 “组团”成了一个集群,只由主读写,从不提供服务】
    • 【客户端查询路由- 客户端连任意节点可能被 重定向 (注意不是转发)到其他节点】
    • 【无中心节点、redis 虚拟槽slot分布到多个节点、扩缩容方便、高可用+可failover】
    • 【但无监控、依赖客户端做路由、failover节点检测慢、gossip协议本身有开销】
    • 【slot是数据管理和迁移的基本单位,类比kafak分区;槽的迁移不影响节点服务】
    • 【数据 – slot --节点】
    • 【三主三从】
    • see also

P.S. redis 是根据crc(key)%16384 来决定存储这个kv对的slot的位置,也即是说,sharding 是在key维度的。这解决不了热点key的问题。

管道

一组命令发给服务端 ,不仅减少了网络传输的开销,更重要是极大减少服务端IO,增大吞吐

持久化

  • RDB (redis database):fork子进程出来dump内存快照二进制文件到磁盘,文件小,恢复快,但可能丢数。大数据集场景下fork子进程也可能比较耗时,redis可能有抖动
  • AOF (Append-on-file)
    • 写命令落盘到文件,恢复时回放
    • append本质是写文件系统buffer,OS会【delayed write】
    • 文件重写:aof不能持续追加,毕竟磁盘有限,且过大的文件,回放极其费时,因此redis会压缩文件(合并命令,有点像kafka的Compaction)。
      redis内数据对象的最新状态生成新的AOF文件,体积较小
  • Redis支持混合持久化,对AOF文件重写有什么影响
    • 纯AOF方式
    • RDB+AOF方式:先按照RDB格式写入数据状态,然后把重写期间AOF缓冲区的内容以AOF格式写入,文件前半部分为RDB格式,后半部分为AOF格式
  • 开启混合持久化:文件是【RDB头+AOF尾】,Redis发现AOF文件为RDB头,会使用RDB数据加载的方法读取并恢复前半部分;然后再使用AOF方式读取并恢复后半部分
    (这特别像mysql的备份数据恢复,备库+binlog)

相关文章:

Redis常识

文章目录 缓存的三个风险数据结构淘汰策略 和 过期删除策略过期删除淘汰 如何理解单线程redis特性复制gossip协议事务&#xff08;和mysql不同&#xff0c;是不严格的事务 &#xff09;集群&#xff08;高可用&#xff09;管道持久化 缓存的三个风险 缓存雪崩&#xff08;缓存…...

Instant,LocalDate,LocalTime,LocalDateTime和ZonedDateTime

Instant 封装了从 1970-01-01T00:00:00Z 开始的秒数&#xff0c;相当于时间戳。 主要有两个属性&#xff1a; private final long seconds; private final int nanos;LocalDate 用于表示日期&#xff0c;包括年、月、日&#xff0c;例如 2017-12-03。 主要有三个属性&…...

Web入门笔记

Web入门笔记 HTTP协议 超文本传输协议 规定了浏览器和服务器之间数据传输的规则&#xff0c;请问数据和响应数据的格式 基于TCP请求-响应模式一次请求对应一次响应无状态的协议 请问数据格式 浏览器版本&#xff1a;解决浏览器兼容问题。GET请求体&#xff1a;存放请求参数…...

Linux网络编程二(TCP三次握手、四次挥手、TCP滑动窗口、MSS、TCP状态转换、多进程/多线程服务器实现)

TCP三次握手 TCP三次握手(TCP three-way handshake)是TCP协议建立可靠连接的过程&#xff0c;确保客户端和服务器之间可以进行可靠的通信。下面是TCP三次握手的详细过程&#xff1a; 假设客户端为A&#xff0c;服务器为B 1、第一次握手&#xff08;SYN1&#xff0c;seq500&…...

C#核心笔记——(一)C#和.NET Framework

C#是一种通用的&#xff0c;类型安全的面向对象编程语言。其目标是提高程序员生产力。 一.面向对象 C#实现了丰富的面向对象范式&#xff0c;包括封装、继承、多态。 C#面向对象特性包括&#xff1a; 统一的类型系统 类与接口 属性、方法、事件 C#支持纯函数模式 二、类型安…...

【2023年冬季】华为OD统一考试(B卷)题库清单(已收录345题),又快又全的 B 卷题库大整理

目录 专栏导读华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如何刷题更有效率呢&#xff1f; 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、队列4、滑动窗口5、二叉树6、并查集7、栈 三、算法1、基础算法① 贪心算法② 二分查找③ 分治递归…...

云服务器的先驱,亚马逊云科技海外云服务器领军者

随着第三次工业革命的发展&#xff0c;移动互联网技术带来的信息技术革命为我们的生活带来了极大的便捷。其中&#xff0c;不少优秀的云服务器产品发挥了不可低估的作用&#xff0c;你或许听说过亚马逊云科技、谷歌GCP、IBM Cloud等优秀的海外云服务器。那么云服务器有哪些&…...

QT webengine显示HTML简单示例

文章目录 参考示例1TestWebenqine.promainwindow.hmainwindow.cppmain.cpp效果 示例2 (使用setDevToolsPage函数)main.cpp效果 参考 QT webengine显示HTML简单示例 示例1 编译器 : Desktop Qt 5.15.2 MSVC2019 64bit编辑器: QtCreator代码: TestWebenqine.pro # TestWeben…...

Spark_SQL函数定义(定义UDF函数、使用窗口函数)

一、UDF函数定义 &#xff08;1&#xff09;函数定义 &#xff08;2&#xff09;Spark支持定义函数 &#xff08;3&#xff09;定义UDF函数 &#xff08;4&#xff09;定义返回Array类型的UDF &#xff08;5&#xff09;定义返回字典类型的UDF 二、窗口函数 &#xff08;1&…...

【Leetcode】【每日一题】【中等】274. H 指数

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/h-index/description/?envTyped…...

MySQL读写分离技术及实现方案

MySQL读写分离技术及实现方案 本文主要介绍了MySQL读写分离技术的原理、实现方案以及示例。通过使用读写分离技术&#xff0c;可以提高数据库的性能&#xff0c;降低服务器的压力。 一、MySQL读写分离技术简介 读写分离是指将数据库的读操作和写操作分别分配到不同的服务器上…...

git 推送到github远程仓库细节处理(全网最良心)

我查看了很多网上的教程都不是很好 我们先在github创建一个仓库&#xff0c;且初始化 readme 我们到本地文件初始化仓库 添加远程仓库 这时候我们就 git add . , git commit ,再准备git push 的时候 显示没有指定远程的分支 我们按照提示操作 提示我们要先git pull 提示我…...

算法训练|数据流中的中位数

LCR 160. 数据流中的中位数 - 力扣&#xff08;LeetCode&#xff09; 总结&#xff1a;这题自己最开始的想法是直接使用vector容器&#xff0c;每次取中位数的时候就进行一次排序&#xff0c;超时。题解很巧妙的利用大根堆和小根堆来解决问题&#xff0c;大根堆和小根堆各存一…...

LeetCode 2558. 从数量最多的堆取走礼物【模拟,堆或原地堆化】简单

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

windows服务器环境下使用php调用com组件

Office设置 安装 office2013 且通过正版激活码激活 在组件服务 计算机 我的电脑 DOM 中找到 Microsoft Word 97 - 2003 文档 服务&#xff0c;右键属性 身份验证调整为 无 在 标识中 调整为 交互式用户 php环境设置 开启com组件扩展 在php.ini中设置 extensionphp_com_dotn…...

3DCAT+东风日产:共建线上个性化订车实时云渲染方案

近年来&#xff0c;随着5G网络和云计算技术的不断发展&#xff0c;交互式3D实时云看车正在成为一种新的看车方式。 与传统的到4S店实地考察不同&#xff0c;消费者可以足不出户&#xff0c;通过网络与终端设备即可实现全方位展示、自选汽车配色、模拟效果、快捷选车并进行个性…...

【VR开发】【Unity】【VRTK】1-无代码VRVR开发介绍

本篇开始精简讲解VRTK相关的知识。 VRTK是基于Unity的一套提供无代码VR开发的插件,这套插件开源,可商用,集合了目前可能的VR体验组件,可以让不会C#编程但想要开发VR体验的人在不写一行代码的前提下开发出心仪的VR作品。 这套组件问世后也很受欢迎,目前已经进化到了第四代…...

全国地级市最新城投债数据(2006-2023.2)

地级市-城投债数据是关于各地级市发行的城市投资建设项目资金债券的统计数据。这些数据对于研究者来说有着一定的参考价值。首先&#xff0c;地级市-城投债数据能够提供全国各地级市城投债发行的数量和规模情况&#xff0c;帮助研究者了解城市基础设施建设和经济发展的情况。其…...

vm_flutter

附件地址 https://buuoj.cn/match/matches/195/challenges#vm_flutter 可以在buu下载到。 flutter我也不会&#xff0c;只是这个题目加密算法全部在java层&#xff0c;其实就是一个异或和相加。 反编译 package k;import java.util.Stack;/* loaded from: classes.dex */ pu…...

MySQL数据库#6

Python操作mysql 在使用Python连接mysql之前我们需要先下载一个第三方的模块 pymysql的模块&#xff0c;导入后再进行操作。 操作步骤&#xff1a;1. 先连接mysql host&#xff0c;port&#xff0c;charset&#xff0c;username password 库&#xff0c;等等。 import pymysql…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...