Redis常识
文章目录
- 缓存的三个风险
- 数据结构
- 淘汰策略 和 过期删除策略
- 过期删除
- 淘汰
- 如何理解单线程
- redis特性
- 复制
- gossip协议
- 事务(和mysql不同,是不严格的事务 )
- 集群(高可用)
- 管道
- 持久化
缓存的三个风险
- 缓存雪崩(缓存引起的数据库,乃至整个系统的雪崩)(大量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协议事务(和mysql不同,是不严格的事务 )集群(高可用)管道持久化 缓存的三个风险 缓存雪崩(缓存…...
Instant,LocalDate,LocalTime,LocalDateTime和ZonedDateTime
Instant 封装了从 1970-01-01T00:00:00Z 开始的秒数,相当于时间戳。 主要有两个属性: private final long seconds; private final int nanos;LocalDate 用于表示日期,包括年、月、日,例如 2017-12-03。 主要有三个属性&…...

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

Linux网络编程二(TCP三次握手、四次挥手、TCP滑动窗口、MSS、TCP状态转换、多进程/多线程服务器实现)
TCP三次握手 TCP三次握手(TCP three-way handshake)是TCP协议建立可靠连接的过程,确保客户端和服务器之间可以进行可靠的通信。下面是TCP三次握手的详细过程: 假设客户端为A,服务器为B 1、第一次握手(SYN1,seq500&…...
C#核心笔记——(一)C#和.NET Framework
C#是一种通用的,类型安全的面向对象编程语言。其目标是提高程序员生产力。 一.面向对象 C#实现了丰富的面向对象范式,包括封装、继承、多态。 C#面向对象特性包括: 统一的类型系统 类与接口 属性、方法、事件 C#支持纯函数模式 二、类型安…...

【2023年冬季】华为OD统一考试(B卷)题库清单(已收录345题),又快又全的 B 卷题库大整理
目录 专栏导读华为OD机试算法题太多了,知识点繁杂,如何刷题更有效率呢? 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、队列4、滑动窗口5、二叉树6、并查集7、栈 三、算法1、基础算法① 贪心算法② 二分查找③ 分治递归…...

云服务器的先驱,亚马逊云科技海外云服务器领军者
随着第三次工业革命的发展,移动互联网技术带来的信息技术革命为我们的生活带来了极大的便捷。其中,不少优秀的云服务器产品发挥了不可低估的作用,你或许听说过亚马逊云科技、谷歌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函数定义 (1)函数定义 (2)Spark支持定义函数 (3)定义UDF函数 (4)定义返回Array类型的UDF (5)定义返回字典类型的UDF 二、窗口函数 (1&…...

【Leetcode】【每日一题】【中等】274. H 指数
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/h-index/description/?envTyped…...
MySQL读写分离技术及实现方案
MySQL读写分离技术及实现方案 本文主要介绍了MySQL读写分离技术的原理、实现方案以及示例。通过使用读写分离技术,可以提高数据库的性能,降低服务器的压力。 一、MySQL读写分离技术简介 读写分离是指将数据库的读操作和写操作分别分配到不同的服务器上…...

git 推送到github远程仓库细节处理(全网最良心)
我查看了很多网上的教程都不是很好 我们先在github创建一个仓库,且初始化 readme 我们到本地文件初始化仓库 添加远程仓库 这时候我们就 git add . , git commit ,再准备git push 的时候 显示没有指定远程的分支 我们按照提示操作 提示我们要先git pull 提示我…...
算法训练|数据流中的中位数
LCR 160. 数据流中的中位数 - 力扣(LeetCode) 总结:这题自己最开始的想法是直接使用vector容器,每次取中位数的时候就进行一次排序,超时。题解很巧妙的利用大根堆和小根堆来解决问题,大根堆和小根堆各存一…...
LeetCode 2558. 从数量最多的堆取走礼物【模拟,堆或原地堆化】简单
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...

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

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

【VR开发】【Unity】【VRTK】1-无代码VRVR开发介绍
本篇开始精简讲解VRTK相关的知识。 VRTK是基于Unity的一套提供无代码VR开发的插件,这套插件开源,可商用,集合了目前可能的VR体验组件,可以让不会C#编程但想要开发VR体验的人在不写一行代码的前提下开发出心仪的VR作品。 这套组件问世后也很受欢迎,目前已经进化到了第四代…...
全国地级市最新城投债数据(2006-2023.2)
地级市-城投债数据是关于各地级市发行的城市投资建设项目资金债券的统计数据。这些数据对于研究者来说有着一定的参考价值。首先,地级市-城投债数据能够提供全国各地级市城投债发行的数量和规模情况,帮助研究者了解城市基础设施建设和经济发展的情况。其…...

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

MySQL数据库#6
Python操作mysql 在使用Python连接mysql之前我们需要先下载一个第三方的模块 pymysql的模块,导入后再进行操作。 操作步骤:1. 先连接mysql host,port,charset,username password 库,等等。 import pymysql…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.
ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #:…...