数据结构与算法简记--redis常用数据类型对应的数据结构

Redis常用数据类型对应的数据结构


Redis数据库

  • Redis 是一种键值(Key-Value)数据库。相对于关系型数据库(比如 MySQL),也被叫作非关系型数据库
  • 常用的数据类型:
    • 字符串、列表、字典、集合、有序集合。

列表(list)

  • 支持存储一组数据。两种实现方法:

    • 压缩列表(ziplist)
    • 双向循环链表
  • 压缩列表
    • 数据量比较小的时候采用压缩列表的方式实现:

      • 列表中保存的单个数据(有可能是字符串类型的)小于 64 字节;
      • 列表中数据个数少于 512 个。
    • 非基础数据结构,类似数组,通过一片连续的内存空间,来存储数据,与数组不同的是,它允许存储的数据大小不同
  • 双向循环链表
    • 数据量比较大的时候使用(不满足压缩列表的两个条件时)
    • redis的实现方式
      • 额外定义一个 list 结构体,来组织链表的首、尾指针,还有长度等信息
      • // 以下是C语言代码,因为Redis是用C语言实现的。
        typedef struct listnode {
          struct listNode *prev;
          struct listNode *next;
          void *value;
        } listNode;
        
        typedef struct list {
          listNode *head;
          listNode *tail;
          unsigned long len;
          // ....省略其他定义
        } list;

字典(hash)

  • 用来存储一组数据对。每个数据对又包含键值两部分。
  • 两种实现方式:
    • 刚刚讲到的压缩列表
    • 散列表
  • 散列表:
    • 散列函数:MurmurHash2这种运行速度快、随机性好的哈希算法作为哈希函数。
    • 哈希冲突: 使用链表法来解决。
    • 动态扩容、缩容:
      • 当装载因子大于 1 的时候,Redis 会触发扩容,将散列表扩大为原来大小的 2 倍左右。
      • 当装载因子小于 0.1 的时候,Redis 就会触发缩容,缩小为字典中数据个数的大约 2 倍大小。
      • 大量的数据搬移耗时问题:Redis 使用渐进式扩容缩容策略,将数据的搬移分批进行,避免了大量数据一次性搬移导致的服务停顿:
      • 当装载因子触达阈值之后,只申请新空间,但并不将老的数据搬移到新散列表中。
      • 当有新数据要插入时,将新数据插入新散列表中,并且从老的散列表中拿出一个数据放入到新散列表。

      • 每次插入一个数据到散列表,都重复上面的过程。经过多次插入操作之后,老的散列表中的数据就一点一点全部搬移到新散列表中了。
      • 这样没有了集中的一次性数据搬移,插入操作就都变得很快了。

原文地址:https://www.cnblogs.com/wod-Y/p/12202315.html

时间: 2024-09-29 00:27:56

数据结构与算法简记--redis常用数据类型对应的数据结构的相关文章

redis常用数据类型对应的数据结构

redis的数据类型都是通过多种数据结构来实现,主要是出于时间和空间的考虑,当数据量小的时候通过数组下标访问最快,占用内存最小[压缩列表是数组的变种,允许存储的数据大小不同] 因为数组需要占用连续的内存空间,所以当数据量大的时候,就需要使用链表,同时为了保证速度又需要和数组结合,也就有了散列表. 1.字符串 2.列表(list):支持存储一组数据,这种数据类型对应两种实现方法,一种是压缩列表,另一种是双向循环链表 压缩列表:数据集比较少的时候,采用压缩列表 redis自己设计的一种存储结构,类似

Redis常用数据类型介绍、使用场景及其操作命令

Redis常用数据类型介绍.使用场景及其操作命令 本文章同时也在cpper.info发布. Redis目前支持5种数据类型,分别是: 1.String(字符串) 2.List(列表) 3.Hash(字典) 4.Set(集合) 5.Sorted Set(有序集合) 下面就分别介绍这五种数据类型及其相应的操作命令. 1. String(字符串) String是简单的 key-value 键值对,value 不仅可以是 String,也可以是数字.String在redis内部存储默认就是一个字符串,被

数据结构与算法简记--剖析微服务接口鉴权限流背后的数据结构和算法

微服务鉴权限流剖析 微服务 把复杂的大应用,解耦拆分成几个小的应用. 有利于团队组织架构的拆分,毕竟团队越大协作的难度越大: 每个应用都可以独立运维,独立扩容,独立上线,各个应用之间互不影响. 有利就有弊: 大应用拆分成微服务之后,服务之间的调用关系变得更复杂,平台的整体复杂熵升高,出错的概率.debug 问题的难度都高了好几个数量级. 为了解决这些问题,服务治理便成了微服务的一个技术重点. 服务治理 简单点讲,就是管理微服务,保证平台整体正常.平稳地运行. 涉及的内容:鉴权.限流.降级.熔断.

Redis常用数据类型

Redis目前支持5种数据类型 分别是:1.String(字符串)2.List(列表)3.Hash(字典)4.Set(集合)5.Sorted Set(有序集合) 下面就分别介绍这五种数据类型及其相应的操作命令.1. String(字符串)String是简单的 key-value 键值对,value 不仅可以是 String,也可以是数字.String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObje

Redis不同数据类型的的数据结构实现

我们知道Redis支持五种数据类型, 分别是字符串.哈希表(map).列表(list).集合(set)和有序集合,和Java的集合框架类似,不同数据类型的数据结构实也是不一样的. >>Redis中的redisObject对象 Redis是使用C编写的,内部实现了一个struct结构体redisObject对象, 通过结构体来模仿面向对象编程的“多态”,作为一个底层的数据支持,redisObject代码: /* * Redis 对象 */ typedef struct redisObject {

redis常用数据类型总结

redis是以键值对key-value的形式来存储数据,而存储的数据类型有5种String,List,Set,Map,以及有序集合 这五种数据类型操作的命令多有相似,经常混淆,闲暇之余,总结一番. 类型一:String 1append key value 如果key存在,则把value追加到原来的value后面 如果可以不存在,则以key为键,value为值建立新的. 2get key 返回key所关联的字符串.如果key不存在则返回nil 3bitcount key 返回给定字符串中,被设置为

数据结构与算法简记--实现一个短网址系统

实现一个短网址系统 短网址服务 把一个长的网址转化成一个短的网址,访问这个短网址,就相当于访问原始的网址 原始网址:https://github.com/wangzheng0822/ratelimiter4j 短网址:http://t.cn/EtR9QEG 上面第二个网址是通过新浪提供的短网址服务生成的 核心功能: 把原始的长网址转化成短网址 当用户点击短网址的时候,短网址服务会将浏览器重定向为原始网址 如何通过哈希算法生成短网址? 使用比较著名并且应用广泛的一个哈希算法:MurmurHash

redis常用数据类型介绍

String类型的常用命令: type key_name:查看某个key是什么类型的 >help @STRING #查看string类型的帮助 set key value [EX|NX|XX] :设定一个键值 EX表示过期时间,单位是s NX表示当此key存在时不创建,如果不存在则创建 XX表示当此key存在时修改 mset:一次设置多个key get:获取某个key的value mget:一次获取多个key的value append:在指定key的values后边追加新的内容 del:删除某个

数据结构与算法简记--贪心算法

贪心算法 贪心算法问题解决步骤 第一步,当我们看到这类问题的时候,首先要联想到贪心算法:针对一组数据,我们定义了限制值和期望值,希望从中选出几个数据,在满足限制值的情况下,期望值最大. 第二步,我们尝试看下这个问题是否可以用贪心算法解决:每次选择当前情况下,在对限制值同等贡献量的情况下,对期望值贡献最大的数据. 第三步,我们举几个例子看下贪心算法产生的结果是否是最优的. 贪心算法实战分析 分糖果:有 m 个糖果和 n 个孩子.要把糖果分给这些孩子吃,但是糖果少,孩子多(m<n),所以糖果只能分配