Redis第一天

news/2024/11/8 9:24:06/

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.ppmy.cn/news/762483.html

相关文章

操作系统11:虚拟存储器

目录 1、虚拟存储器概述 (1)常规存储管理方式的特征和局部性原理 1.1 - 常规存储器管理方式的特征 1.2 - 局部性原理 1.3 - 虚拟存储器的基本工作情况 (2)虚拟存储器的定义和特征 2.1 - 虚拟存储器的定义 2.2 - 虚拟存储器…

Unity 中控(三) 关于电脑断电关机时间长后无法网络唤醒问题

之前研究了中控后并没有发现这个问题,也是有人提醒才知道的,然后再网上查了很多类似的问题,总结 下几个解决方案。 方法一:直接给主板加一个UPS,让主板一直处在供电状态。 方法二:在网卡的属性设置里->高…

局域网不同网段远程桌面_自动化已非原来的自动化:看虚拟局域网技术应用到罗克韦尔的DCS...

导读:在前述几篇文章中,老鬼同各位头条的好友在后台中同很多一直从事自动化行业的工程师交流中,感觉到了很多技术人员,工程师总是先入为主的去将IT技术和OT技术进行切割,同时又根据这些来限定、否定自己。老鬼也一直在…

红帽启动apache服务器_redhat 启动ssh服务器

redhat 配置ssh服务器 SSH:是一种安全通道协议,它对通信双方的数据进行了加密,端口号为tcp22,主配置文件/etc/ssh/sshd_config,linux默认已经安装了ssh服务,默认所有用户都可以登录。 使用ssh服务器时我们可以注意一下…

无线WiFi模块通信技术,WiFi技术方案应用,物联网智能发展

时下主流的智能控制方案基本都可实现在家控制和远程控制两种方式。在家的情况下,用户手机APP通过路由器连接WiFi控制内置WiFi模块的产品(比如智能开关(插座),智能灯泡……控制产品的应用。在室外,用户可以通过云端来控制家里的智能设备。 智能…

第62讲:Python编程案例之谁在说谎

文章目录 1.需求描述以及分析2.代码编写1.需求描述以及分析 需求描述: 张三说李四在说谎,李四说王五在说谎,王五说张三和李四在说谎。 需要分析出这三个人到底谁在说谎。 需求分析: 张三说李四在说谎,那么会有两种情况: 要么张三说的是真话,李四说的是假话。要么张三…

智能家居系统(移动端和硬件开发)

话不多说,先以图致敬 这是一个非常简单的结构图(当然细节部分会比较多,没有完全展示) 本文主要内容 在本博客中,略述了一下当今智能家居发展的现状,过去和前景。接来下,我要介绍的是基于iOS平台…

ZStack

一些参考 : http://wjf88223.blog.163.com/blog/static/351680012011731105424480/ http://blog.csdn.net/tanqiuwei/article/details/7640913 前言 这片文章总结一下学习ZStack自带例子的过程。这些例子位于ZStack的安装目录中,如: D:\Texas Instruments\ZSta…