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.mzph.cn/web/43883.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1招搞定maven打包空间不足问题

目录 一、工具应用问题 二 、使用效果 三、使用方法 四、练习手段 一、工具应用问题 使用maven的package功能打包失败&#xff0c;报错“Java heap space”错误。 二 、使用效果 修改IDEA中maven内存使用大小后&#xff0c;打包成功。 三、使用方法 点击菜单“File->Set…

C++ 例外处理 try throw catch

例外处理 程式中可能会发生的错误有三种&#xff0c;分别是语法错误(syntax error) 、执行期间错误(runtime error) 及语意错误(semantic error) &#xff0c;其中编译器会直接检查出语法错误&#xff0c;如果含有语法错误的程式无法过编译&#xff0c;例如 $ g u06.cpp u06.c…

【PythonRS】基于Python分块处理大型遥感影像的方法

RSer工作时不可避免会用到大型的遥感影像,由于分辨率过高、区域过大、波段信息过多等原因,都会导致数据非常的大。这个时候我们在进行一些简单的操作,如计算NDVI、二值化、分类等时,计算机的内存都会溢出。因此今天跟大家分享一下我平时分块的方法,中间如何计算就按照自己…

Docker 使用基础(3)—容器

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;秒針を噛む—ずっと真夜中でいいのに。 0:34━━━━━━️&#x1f49f;──────── 4:20 &#x1f504; ◀️ ⏸ …

let/const/var的区别及理解

在JavaScript中&#xff0c;let、const 和 var 是用来声明变量的关键字&#xff0c;但它们之间在作用域、变量提升、重复声明等方面存在区别&#xff0c;详细情况如下: 1. let、const、var 的区别 (1) 块级作用域 let 和 const&#xff1a;具有块级作用域&#xff0c;由 {} 包…

百数教学秘籍:三步走,轻松规划你的自动化计划任务

通过设定任务计划&#xff0c;用户可以轻松安排指定的功能插件或数据助手在特定时间自动执行&#xff0c;有效提高工作效率&#xff0c;还确保了数据的及时更新和处理。任务计划在应用启动时自动启动并在后台运行&#xff0c;无需用户持续监控&#xff0c;为用户带来极大的便利…

oracle哪些后台进程不能杀?

oracle 有很多的后台进程&#xff0c;在遇到特殊情况的时候如锁表&#xff0c;如果等待的是一个后台进程&#xff0c;那这时就需要考量是不是能杀掉这个后台进程&#xff1f;杀掉这个后台进程会不会引起实例崩溃&#xff1f;本着实践出真知&#xff0c;本文针对oracle 11g&…

游戏开黑语音-使用云服务器部署teamspeak服务(系统Ubuntu 20.04 LTS)

目录 前置物品服务器调整及部署1.重装系统2.换源3.下载teamspeak服务端并部署 连接服务器参考 前置物品 一台云服务器&#xff08;系统&#xff1a;Ubuntu 20.04 LTS) 服务器调整及部署 1.重装系统 在腾讯云官网的主机控制台内&#xff0c;选择重装系统 (由于之前为了快点和…

【刷题汇总 -- 最长回文子串、买卖股票的最好时机(一)、[NOIP2002 普及组] 过河卒】

C日常刷题积累 今日刷题汇总 - day0101、最长回文子串1.1、题目1.2、思路1.3、程序实现 2、买卖股票的最好时机(一)2.1、题目2.2、思路2.3、程序实现2.4、程序实现 -- 优化 3、[NOIP2002 普及组] 过河卒3.1、题目3.2、思路3.3、程序实现 -- dp 4、题目链接 今日刷题汇总 - day0…

Excel中用VBA实现Outlook发送当前工作簿

Excel中用VBA实现Outlook发送当前工作簿&#xff0c;首先按AltF11打开VBA编辑器&#xff0c;插入模块&#xff0c;并在工具-引用中勾选 Microseft Outlook .0 Object Library(其中为你Microseft Outlook的版本号。 Sub 发送邮件() 保存当前excel ThisWorkbook.Save让excel连接…

Linux 入门教程 by 程序员鱼皮

本文作者&#xff1a;程序员鱼皮 免费编程学习 - 编程导航网&#xff1a;https://www.code-nav.cn 大家好&#xff0c;我是鱼皮。 前两天我学编程的老弟小阿巴过生日&#xff0c;我问他想要什么礼物。 本来以为他会要什么游戏机、Q 币卡、鼠标键盘啥的&#xff0c;结果小阿巴…

模拟防止重复提交

gitee地址&#xff08;需要自取&#xff09;AopProxy重复提交: 防止重复提交 (gitee.com) RestController public class SubmissionController {Autowiredprivate SubmissionService submissionService;private static Jedis jedis new Jedis("localhost",6379);pr…

短视频矩阵:批量发布的秘密揭秘

在数字化时代&#xff0c;短视频已经成为一种广受欢迎的媒体形式。无论是用于品牌推广、产品营销还是个人创作&#xff0c;短视频都提供了一种直观、生动的方式来吸引观众的注意力。然而&#xff0c;有效地制作、管理和发布短视频对于许多创作者和企业来说是一个挑战。 为此&am…

什么是 C 语言中的宏定义?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&#xff0c;看过的人都说好。 文章目…

解决 Yarn 运行时的 Node.js 版本问题:一个详尽的指南

引言 Yarn 是一个流行的 JavaScript 包管理器&#xff0c;它与 Node.js 紧密集成&#xff0c;用于管理项目依赖。然而&#xff0c;在开发过程中&#xff0c;开发者可能会遇到 Node.js 版本不兼容的问题&#xff0c;这会导致 Yarn 运行时出错。本文将提供一个详细的指南&#x…

动态规划之数字三角形模型+最长上升子序列模型

首先&#xff0c;我们从集合角度重新看待DP&#xff1a; 直接看题&#xff1a;https://www.acwing.com/problem/content/1029/ 就是取纸条的原题&#xff0c;我们令f[i1,j1,i2,j2]表示从(1,1),(1,1)分别走到(i1,j1),(i2,j2)的路径的max i1j1i2j2&#xff0c;于是我们可以把状…

机器学习 | 对K-Means聚类假设的研究演示及实践示例

我们在Scikit-learn对K-means假设的调查中探索了揭示算法优势和局限性的场景。我们研究了K-means对不正确的聚类大小的敏感性&#xff0c;它在各向异性分布中面临的困难&#xff0c;它在不同的聚类方差中面临的困难&#xff0c;以及使用合成数据集的大小不均匀的聚类问题。我们…

准备工作+1、请求和响应+2、模型和管理站点

Django快速入门——创建一个基本的投票应用程序 准备工作1、创建虚拟环境2、安装django 1、请求和响应&#xff08;1&#xff09;创建项目&#xff08;2&#xff09;用于开发的简易服务器&#xff08;3&#xff09;创建投票应用&#xff08;4&#xff09;编写第一个视图1、编写…

家用激光投影仪品牌排行榜:这几个品牌口碑好产品好最适合家用

现在人们生活水平提升&#xff0c;对投影这类产品的认知接受度也提升&#xff0c;有条件的家庭都想在家里整一个家庭影院&#xff0c;对于这些消费者来说挑选一台性价比高的家用投影至关重要&#xff0c;既省到钱又买对了产品&#xff1b;投影市场发展迅速目前市面上大大小小的…

华为机考真题 -- 多段线数据压缩

题目描述: 下图中,每个方块代表一个像素,每个像素用其行号和列号表示,但可以发现,这种表示不是最简的,其实只需要存储 6 个蓝色的关键点即可,它们是线段的起点、拐点、终点,而剩下 4 个点是冗余的。现在,请根据输入的包含有冗余数据的多段线坐标列表,输出其最简化的…