Redis第一天

Redis第一天

    • Redis基本数据结构
      • 数据结构
        • 字符串
        • Redis链表
        • 字典
        • 跳跃表
        • 压缩列表
      • 对象
        • 字符串对象
        • 列表对象
        • 哈希对象
        • 集合对象
        • 有序集合对象
        • 类型检查
        • 键回收

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis基本数据结构

数据结构

字符串

SDS: redis定义了一种简单动态字符串用来保存数据库中的字符串值,该动态字符串还被用作缓冲区

与C字符串的区别

  1. 常数复杂度获取字符串长度
  2. 杜绝缓冲区溢出:对SDS修改时,API会先检查SDS的空间是否满足修改所需的要求,不满足,会扩展SDS的空间至需要的大小
  3. 减少修改字符串时带来的内存重分配次数,SDS会通过空间预分配和惰性空间释放的策略管理字符串。
  4. 二进制安全:SDS的保存字符串的结构是二进制数组
  5. 兼容部分C字符串函数

Redis链表

特点:

  1. 双端:链表节点带有prev和next指针
  2. 无环:表头节点的prev和表尾节点的next指向NULL
  3. 带表头指针和标为指针
  4. 带链表长度计数器
  5. 多态:链表节点使用void *指针保存节点值,并且可以通过list结构的dup、free、match三个属性为节点值设置类型特定函数,所以链表可以用于保存各种不同类型的值。

字典

Redis字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,而每个哈希表节点就保存了字典中的一个键值对。哈希表节点中有一个next属性,指向另一个哈希表节点的指针。

rehash:扩展和收缩哈希表

  • 执行扩展操作的时机:
  1. 服务器目前没有正在执行BGSAVE或者BGREWRITEAOF命令,并且哈希表的负载因子大于等于1
  2. 服务器正在执行BGSAVE或者BGREWRITEAOF命令,并且哈希表的负载因子大于等于5
  • 执行收缩操作的时机:
  1. 当哈希表负载因子小于0.1时,程序自动开始对哈希表执行收缩操作

负载因子=哈希表已保存节点数量 / 哈希表大小

跳跃表

有序数据结构通过在每个节点中维持多个指向其他节点指针,从而达到快速访问节点的目的。主要在有序集合建使用和集群节点中用作内部数据结构,当一个集合只包含整数值,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。

压缩列表

当一个哈希键只包含少量键值对时,并且每个键值对的键和值要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做哈希键的底层实现,添加新节点到压缩列表,或者从压缩列表中删除节点,可能会引发连锁更新操作,但这种操作出现的机率不高。

对象

Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个对象系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象。不同的对象可以使用不同的数据结构。

字符串对象

编码方式:

  • int:保存的是整数值,并且可以用long类型表示
  • raw: 保存的是字符串,并且长度大于39字节
  • embstr:保存的是字符串,并且长度小于等于39字节

raw和embstr编码一样,都使用redistObject和sdshlr结构来表示字符串对象,但raw编码调用两次内存分配函数,embstr调用一次内存分配函数来分配一块连续的内存空间,redis没有对embstr的修改函数,所以对embstr的修改,会把embstr转化为raw。

列表对象

列表对象的编码可以是ziplist或者linkedlist,当列表对象同时满足以下两个条件时,使用ziplist编码

  1. 列表对象保存的所有字符串元素长度都小于64字节
  2. 列表对象的元素数量小于512个字节,不能同时满足这两个条件的列表对象需要使用linkedlist编码。
    以上两个限制值可以通过配置文件的list-max-ziplist-value和list-max-ziplist-entries修改

哈希对象

编码可以是ziplist和hashtable,使用ziplist作为底层实现时,每当有新的键值对加入哈希对象,程序先将保存于建的压缩列表节点推入压缩列表末尾,再将保存了值的压缩列表节点推入压缩列表末尾。编码方式使用ziplist还是hashtable规则和列表对象类似,可以通过配置文件的hash-max-ziplist-value和hash-max-ziplist-entries修改

集合对象

集合对象的编码可以是intset或者hashtable,通过set-max-intset-entries修改

有序集合对象

编码可以是ziplist或者skiplist,有序集合对象zset同时使用zsl跳跃表和dict字典保存所有集合元素,两种数据结构都会通过指针共享相同元素的成员和分值,当有序集合保存的元素数量小于128个,且有序集合的元素成员长度小于64字节,使用ziplist编码。 可以通过配置文件的zset-max-ziplist-value和zset-max-ziplist-entries修改

类型检查

类型特定命令所进行的类型检查时通过redisObject的type属性实现的

键回收

OBJECT REFCOUNT : 查看对对象的引用计数
OBJECT IDLETIME:查看对象的空转时长,如果服务器打开了maxmemory选项,并且服务器用于回收内存的算法为volatile-lru或者allkeys-lru,那么当服务器占用的内存数超过maxmemory选项所设置的上限时,空转时长较高的那部分键会优先被服务器释放,从而回收内存。

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

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

相关文章

ios 启动页storyboard 使用记录

本文简单记录ios启动页storyboard 如何使用和注意事项。 xcode窗口简介 以xcode14为例,新建项目如下图,左边文件栏中的LaunchScreen.storyboard 为默认启动页布局。窗口中间部分是storyboard中的组件列表,右侧为预览,可以看到渲…

摩尔投票算法(Moore‘s Voting Algorithm)及例题

摩尔投票算法(Moores Voting Algorithm)及例题 摩尔投票算法简介摩尔投票算法算法思想摩尔投票算法经典题目169. 多数元素229. 多数元素 II6927. 合法分割的最小下标 上午打力扣第 354 场周赛最后十五分钟用摩尔投票算法直接秒了第三题。 摩尔投票算法简…

matlab数组中元素位置

%判断某个元素的位置 find(a2)就得到2所在的位置Matlab判断某数组中是否包含某元素及其位置

torch.nn.BCEWithLogitsLoss与torch.nn.BCELoss

torch.nn.BCEWithLogitsLoss相当于sigmoidtorch.nn.BCELoss。代码示例如下, import torch import torch.nn as nnBCEWithLogitsLoss nn.BCEWithLogitsLoss() BCELoss nn.BCELoss()x torch.randn((1,)) y torch.FloatTensor([1])Loss_BCEWithLogits BCEWithLog…

【图像处理】基于双目视觉的物体体积测量算法研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【QT/OpenCV】QT实现张正友相机标定

相机标定 01、相机标定02、OpenCV函数及其张正友标定法2.1、相机标定步骤2.2、相机标定相关函数2.2.1 提取角点--- findChessboardCorners2.2.2 亚像素角点提取1--- find4QuadCornerSubpix2.2.3 亚像素角点提取2--- cornerSubPix2.2.4 绘制内角点 --- drawChessboardCorners2.2…

Go 记录日志——log包

Golangs log模块主要提供了3类接口。分别是 “Print 、Panic 、Fatal ”,对每一类接口其提供了3中调用方式,分别是 "Xxxx 、 Xxxxln 、Xxxxf",基本和fmt中的相关函数类似,下面是一个Print的示例: package m…

HDFS的数据存储

文章首发地址 HDFS的数据存储 HDFS的数据存储包括两块: 一块是HDFS内存存储另一块是HDFS异构存储 HDFS内存存储是一种十分特殊的存储方式,将会对集群数据的读写带来不小的性能提升,而HDFS异构存储则能帮助我们更加合理地把数据存到应该存的…

生成式AI:大语言模型ChatGPT交互的机制

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 与 ChatGPT 有效交互的快速工程 随着生成式人工智能的普及,特别是 ChatGPT,提示已成为人工智能世界中越来越重要的技能。制作提示,与大型语言模型&…

【C语言督学营 第十八天】考研408排序大题初探(将排序思想融入题目)

文章目录 题目一分析代码实战 题目二分析代码实战 补充(快排与归并)数据结构大题注意点!!!(评分标准) 题目一 分析 (1)算法的基本设计思想 由题意知,将最小的nl2个元素放在Ai中,其余的元素放在A2中&#x…

Linux信号

文章目录 一.信号基础二.信号的产生1.使用键盘组合键发送信号(只能给当前正在运行的进程发)信号捕捉2.使用kill指令(可以向任意进程发送信号)3.使用raise()让进程自己给自己发送信号4.硬件异常产生信号a.除…

Java中List的使用方法简单介绍

Java中List的使用方法简单介绍 java中的List就是一种集合对象,将所有的对象集中到一起存储。List里面可以放任意的java对象,也可以直接放值。 使用方法很简单,类似于数组。 使用List之前必须在程序头引入java.util.* import java.util.*; pub…

分享四款导航页 个人主页html源码

一、开源免费,可以展示很多社交账号,也可以更换社交账号图标指向你的网站,上传后即可使用 https://wwwf.lanzout.com/ik7R912s031g 二、开源免费,不过部署稍微麻烦点 https://wwwf.lanzout.com/iCq2u12s02wb 三、适合做成导航页面…

HTTP常见的状态码

HTTP(Hypertext Transfer Protocol)是一种用于传输超文本的应用层协议。在HTTP协议中,每个响应都包含一个状态码(Status Code),用于指示请求的处理结果。以下是HTTP常见的状态码及其含义: 1xx -…

golang网络编程学习-1rpc

网络编程主要的内容是: 1.TCP网络编程 2.http服务 3.rpc服务 4.websocket服务 一、rpc RPC 框架----- 远程过程调用协议RPC(Remote Procedure Call Protocol)-----允许像调用本地服务一样调用远程服务。 RPC是指远程过程调用,也就是说两台服…

MySQL结构以及数据管理(增删改查)

目录 1.数据库的简介 2.数据库分类 2.1关系型数据库 2.2 非关系型数据库 3.mysql的数据类型 3.1 常用的数据库类型 4.mysql的数据库结构 4.1 查看库信息 4.2 查看表信息 5.SQL 语句 5.1 SQL语言分类: 1.数据库的简介 数据库(database&#…

Spark高级特性

spark shuffle 中 map 和 reduce 是一个相对的概念,map是产生一批数据,reduce是接收一批数据,前一个任务是map,后一个任务是reduce。 hashShuffle:hash分组,一个task里面按hash值的不同,分到不…

微服务优雅上下线的实践方法

导语 本文介绍了微服务优雅上下线的实践方法及原理,包括适用于 Spring 应用的优雅上下线逻辑和服务预热,以及使用 Docker 实现无损下线的 Demo。同时,本文还总结了优雅上下线的价值和挑战。 作者简介 颜松柏 腾讯云微服务架构师 拥有超过…

【云原生】Kubernetes临时容器

临时容器 特性状态: Kubernetes v1.25 [stable] 本页面概述了临时容器:一种特殊的容器,该容器在现有 Pod 中临时运行,以便完成用户发起的操作,例如故障排查。 你会使用临时容器来检查服务,而不是用它来构建…

Python ARP缓存投毒(ARP欺骗)

原理介绍 https://mohen.blog.csdn.net/article/details/100576912 投毒技术 ARP投毒的逻辑:欺骗目标设备,使其相信我们是它的网关;然后欺骗网关,告诉它要发给目标设备的所有流量必须交给我们转发。网络上的每一台设备,都维护着一段ARP缓存,里面记录着最近一段时间本地…