Redis数据结构和持久化

数据类型

String:Map<String,String>

命令格式

set key value(相同的key会覆盖)
get key
incr key
decr key
setex key seconds value seconds秒后失效
ttl key
del key
setnx ke value(if not exist)

应用场景

计数器
比如:访问次数,减少mysql访问
共享session
用户登录后将信息存储在共享redis缓存层中

Hash:Map<String,HashMap<String,String>>使用ziplist和hash表来实现

命令格式

hset key filed value
hget key filed
hexist key field
hvals key
hkeys key
hgetall key
hincrby key field increment
hdel key filed

应用场景

存储对象,代替String,String是使用的json来存储对象,而hash使用一个hashmap来存储对象,filed-value这样,将对象存储在hash比存储在String空间小。
session也可以用hash存储。
当使用string存储对象,需要将对象转换为json(所以查更容易,而修改某一字段需要转为对象然后再转为json),而用hash,查询需要自己做序列化(但是修改某一字段容易)

List:Map<String,List >使用ziplist和双向链表来实现

命令格式

rpush key value
lpush key value
rpop key
lpop key
llen key
lrange key start stop//如果是[0,-1]则是所有数据
List相当于一个双端队列来使用的,也可以从中间插入和删除数据但是不常用

应用场景

常用于单key,多value
用户收藏列表

Set:Map<String,Set>用intset和哈希表实现

无序,不重复,单key,多value

命令格式

sadd key [members]
smembers key 遍历所有
srem key [members]
spop key count 随机弹出key

特点

差集,并集,交集
sdiff key1 key2
sunion key1 key2
sinter key1 key2

应用场景

去重
抽奖:pop

Zset: Map<String,Set>跳表和哈希表

每个元素都有一个double的分数(在add时必须添加),然后用分数做key排序

zset的插入流程

会先在hash表中查找该元素是否存储,如果存在则更新分数,然后在跳表中重新插入。
如果不存在,则插入跳表和hash表。

操作指令

zadd key scrose value
zincrby key increment member
zrange key start stop [withscores]
zrevrange key start stop
zcard key 数量
zrank key member member的排名
zrevrank key member member的逆序排名
范围删除,返回范围等操作

应用场景

排行榜
延迟队列,定时任务
优先级队列

各种数据类型的效率

String插入O1,查询O1

Hash插入O1,查询O1

List插入O1,查询On

Set插入O1,查询O1

ZSet插入Ologn,查询Ologn/nlogn

当使用成员查看排名时rank,先用hash定位在跳表中的位置,然后遍历跳表,查看其排名,所以是logn
当查看zrange一定排名的成员时,过程和rank相似

设计redis

如果需要一个map形式的缓存,并且本地Map不太合适:

redis集群,分片,保证了数据的高可用和高可靠
redis有持久化机制
高效了数据结构
Lua脚本
分布式锁
过期键

设计v

是否需要排序:zset
单value还是多value?
多value:List,hash,set
单value:string
不允许重复:set

设计key

唯一性
可读性

模块名:数据名:主键id
表名:主键名:主键值:列名

全局命令

key pattern
exists key
type key
expire key seconds
perist key
select 0-15 选数据库
randomkey 一个随机key
rename key newname
dbsize

redis事务

单个redis命令是原子性的,因为redis单线程,执行完一个命令才会执行下一个。
redis存在事务的概念,但是只是一个执行脚本包,不支持事务的回滚等。
加入队列,顺序执行任务。如果在此期间有其他命令插入,需要等待事务执行完毕。
multi
command:queued
command:queued
command:queued
exec

持久化

RDB

使用save(阻塞)或者bgsave(子进程)来创建一个新的rdb文件。

间隔RDB自动保存

redis每个数据库都会保存上次save时间以及期间做的dirty次数。
save 100 2 如果100有两个修改,则会调用save

RDB二进制文件内容

下面是RDB文件的内容:
redis:db_version:selectdb:0:paris:selectdb:3:pairs:EOF:check_sum
selectdb:0代表0号数据库,pairs中存储键值对和过期时间(如果有)

AOF

将用户的命令记录到文件中。

当启用AOF时,载入数据库时就会优先载入AOF而不是RDB

格式

set msg “hello”
/r/nset/r/n$3/r/nmsg/r/n$5/r/nhello/r/n

AOF的实现流程:命令追加,文件写入,文件同步

命令追加:每次执行完一个命令后,就会将其加入aof_buf缓冲区尾部。
AOF文件写入和同步:时间事件的AOF写入触发时,会将aof_buf的数据写入aof,并且文件同步。
aof文件写入策略:
(1)always : 每次写入aof_buf都会写入并且同步aof落到磁盘。
(2)everysec:每秒写入aof文件,但是每秒才会将最新的aof文件修改落到磁盘。
(3)no:有操作系统完成aof落磁盘

AOF文件载入

依次执行AOF文件中的内容

AOF文件重写:不会阻塞

会读数据库,然后创建aof语句。

Redis中的过期删除策略

redis可以减少mysql的读操作,减少磁盘io。
但是内存如果只放不删,迟早会满。
所以Redis设置了一个属于每个数据库的过期字典。

设置过期时间来判定键是否过期

设置过期时间:expire key second

查看过期时间:ttl key

移除过期时间:persist key

过期字典:key是键对象指针,value是long类型的UNIX时间戳

检查键是否过期

检查该键是否存在于过期字典,如果存在获得该键的过期时间。检查当前UNIX时间戳是否大于键的ttl,如果大于则过期

过期键删除策略:如果一个键过期了,那么它什么时候被删除

redsi使用:惰性删除+定期删除(每隔一段时间就扫描一些过期键空间)

采用随机扫描,而不是顺序记录扫描

设置的参数:
hz 20 (config set hz 20):每秒扫描20次
active-expire-effort 1 : 每次扫描的努力情况,越大扫描越彻底

RDB对过期键的处理

在生成RDB文件时,会检查键是否过期,如果过期,则不会放入RDB文件中。

载入RDB文件中对过期键的处理

如果过期,不会载入

AOF对过期键的处理

当一个键被过期删除时,会向AOF文件中写入一条del命令

AOF重写对过期键的处理

重写时,过期则不会写入AOF文件

集群模式下的键过期

集群下,从服务器不会主动删除过期键(惰性和定期都不会),主服务器检测到过期键会向从服务器发生del命令。
通过主服务器控制所有过期键,可以保证主从一致性,当一个过期键在主服务器中没有被删除,那么从服务器中也一定没有被删除(此时客户端仍然可以读到)。

Redis的内存淘汰策略(主动删除,即使是一些键没有到达ttl也会被删除)

当reids使用的内存空间超过设置的最大内存空间,就会使用内存淘汰策略:
配置:
maxmemory 256mb (config set maxmemory 256mb)
maxmemory-policy allkeys-lru

触发内存淘汰策略是渐进式的,分阶段回收内存的,避免长时间阻塞

处理设置了过期时间的数据

volatile-lru(最近最少使用,维持一个LRU的队列)
volatile-ttl(设置了过期时间的,剩余存活时间最短的键)(键有一个访问频率的计数器,并且使用了时间衰减机制)
volatile-lfu(最不常使用)
volatile-random

LFU:A最近调用了3次(时间无关,次数有关)
LRU:A在3秒前调用了一次(时间相关)

处理全部数据

allkeys-lru
allkeys-lfu
allkeys-random

不处理,直接报错异常

no-enviction

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/782470.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

批量爬取B站网络视频信息

使用XPath爬取B站视频链接等相关信息 分析B站html框架获取内容完整代码 对于B站&#xff0c;目前网上的爬虫大多都是使用通过解析服务器的响应来爬取想要的内容&#xff0c;下面我们通过使用XPath来爬取B站上一些想要的信息 此次任务我们需要对B站搜索到的关键字&#xff0c;并…

本地多卡(3090)部署通义千问Qwen2-72B大模型提速实践:从龟速到够用

最近在做文本风格转化&#xff0c;涉及千万token级别的文本。想用大模型转写&#xff0c;在线的模型一来涉及数据隐私&#xff0c;二来又不想先垫钱再找报销。本地的7-9B小模型又感觉效果有限&#xff0c;正好实验室给俺配了4卡3090的机子&#xff0c;反正也就是做个推理&#…

Python falsk 接口挂载 步骤

Python falsk 接口挂载 步骤 1.首先要有自己独立的python环境&#xff0c;因为如果和别人共用环境的话&#xff0c;会有依赖包冲突的情况 2.找到python.exe的安装路径 3.CMD切换到该路径下 4.执行指令activate,进入到专属的python环境 5.然后执行指令 pip freeze > re.tet…

CentOS 7遗忘了root密码怎么办?

正文共&#xff1a;666 字 12 图&#xff0c;预估阅读时间&#xff1a;1 分钟 说来也巧&#xff0c;突然发现使用KVM在部署CentOS时&#xff08;笔记本电脑安装CentOS系统&#xff09;&#xff0c;会有一个神奇的现象&#xff0c;还不是偶然出现的&#xff0c;在最近的三四次部…

【ComfyUI节点】扰动注意力引导Perturbed Attention Guidance

扰动注意力引导 Perturbed Attention Guidance GitHub - KU-CVLAB/Perturbed-Attention-Guidance: Official implementation of "Perturbed-Attention Guidance" 按照官方介绍&#xff0c;扰动注意力指导显著提高了扩散模型的样本质量&#xff0c;而无需外部条件&am…

测试用例编写与管理流程

hello&#xff0c;大家好&#xff0c;我是一名测试开发工程师&#xff0c;至今已在自动化测试领域深耕9个年头&#xff0c;现已将本人实战多年的多终端自动化测试框架【wyTest】开源啦&#xff0c;在接下来的一个月里&#xff0c;我将免费指导大家使用wyTest&#xff0c;请大家…

14-Django项目--文件上传-Excel

目录 前端 路由 视图函数 前端 <div class"modal-body"><form method"post" enctype"multipart/form-data" action"/pretty/asset/">{% csrf_token %}<input type"file" name"excel"><bu…

Leetcode3194. 最小元素和最大元素的最小平均值

Every day a Leetcode 题目来源&#xff1a;3194. 最小元素和最大元素的最小平均值 解法1&#xff1a;排序遍历 将数组 nums 排序后&#xff0c;利用双指针计算每一对 (minElement maxElement) / 2&#xff0c;最小值即为答案。 代码&#xff1a; /** lc appleetcode.cn …

Spring源码十七:Bean实例化入口探索

上一篇Spring源码十六&#xff1a;Bean名称转化我们讨论doGetBean的第一个方法transformedBeanName方法&#xff0c;了解Spring是如何处理特殊的beanName&#xff08;带&符号前缀&#xff09;与Spring的别名机制。今天我们继续往方法下面看&#xff1a; doGetBean 这个方法…

AI 大模型系统实战

AI 大模型是什么&#xff1f; 维基百科对基础模型的定义是这样的&#xff0c;基础模型是一种大型机器学习模型&#xff0c;通常在大量数据上进行大规模训练&#xff08;通过自监督学习或半监督学习&#xff09;&#xff0c;以使它可以适应各类下游任务。因此&#xff0c;它需要…

数学系C++ 类与对象 STL(九)

目录 目录 面向对象&#xff1a;py&#xff0c;c艹&#xff0c;Java都是,但c是面向过程 特征&#xff1a; 对象 内敛成员函数【是啥】&#xff1a; 构造函数和析构函数 构造函数 复制构造函数/拷贝构造函数&#xff1a; 【……】 实参与形参的传递方式&#xff1a;值…

【Java】了解异常

初始异常 我们平时应该已经接触过一些 “异常” 了&#xff0c;这里列举一些例子。 算术异常&#xff1a; 数组下标越界异常&#xff1a; 访问空指针异常&#xff1a; 所谓异常指的就是程序在 运行时 出现错误时通知调用者的一种机制。 异常的基本用法 捕获异常 try{ 有可能…

知识的向量表示

1、one-hot表示&#xff0c;空间太大 2、bag词袋模型&#xff0c;无法表示词的语义 3、词的语义由什么决定&#xff1f;词由他的上下文决定&#xff1f;分布式语义 4、CBow&#xff0c;通过前面几个词和后面几个词&#xff0c;预测中间几个词 5、skip-gram&#xff0c;通过…

【Python】已解决:(MongoDB安装报错)‘mongo’ 不是内部或外部命令,也不是可运行的程序

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例及解决方案五、注意事项 已解决&#xff1a;&#xff08;MongoDB安装报错&#xff09;‘mongo’ 不是内部或外部命令,也不是可运行的程序 一、分析问题背景 在安装和配置MongoDB时&#xff0c;有…

数据库逆向工程工具reverse_sql

reverse_sql 是一个用于解析和转换 MySQL 二进制日志&#xff08;binlog&#xff09;的工具。它可以将二进制日志文件中记录的数据库更改操作&#xff08;如插入、更新、删除&#xff09;转换为反向的 SQL 语句&#xff0c;以便对系统或人为产生的误操作进行数据回滚和恢复。 *…

Python28-9 XGBoost算法

XGBoost&#xff08;eXtreme Gradient Boosting&#xff0c;其正确拼写应该是 "Extreme Gradient Boosting"&#xff0c;而XGBoost 的作者在命名时故意使用了不规范的拼写&#xff0c;将“eXtreme”中的“X”大写&#xff0c;以突出其极限性能和效率&#xff09;是一…

【open3d专栏】利用PCA计算狭长点云的主方向

在点云处理中&#xff0c;PCA通常用于识别数据集中的主要方向&#xff0c;从而帮助理解数据的几何结构。 使用工具&#xff1a;python&#xff0c;open3d库 目的&#xff1a;计算狭长型点云的主方向 # -*- coding: utf-8 -*- """ Created on Sun Jul 7 11:50…

SpringMVC源码解析(一):web容器启动流程

SpringMVC源码系列文章 SpringMVC源码解析(一)&#xff1a;web容器启动流程 目录 一、SpringMVC全注解配置1、pom文件2、web容器初始化类(代替web.xml)3、SpringMVC配置类(代替springmvc.xml)4、测试Controller 二、SpringServletContainerInitializer1、web容器初始化入口2、…

RNN 交叉熵

RNN善于处理时序 序列数据 简单RNN 展开就是 LSTM 遗忘门f_t决定上期记忆保留多少 隐藏层 在神经网络中&#xff0c;隐藏层指的是除了输入层和输出层之外的层&#xff0c;它们的输出不会直接用于网络的最终输出&#xff0c;而是作为中间步骤用于提取和转换数据。因此&#x…

LabVIEW光谱测试系统

在现代光通信系统中&#xff0c;光谱分析是不可或缺的工具。开发了一种基于LabVIEW的高分辨率光谱测试系统&#xff0c;通过对可调谐激光器、可编程光滤波器和数据采集系统的控制&#xff0c;实现了高效、高精度的光谱测量。 项目背景 随着光通信技术的迅速发展&#xff0c;对…