首页 > 数据库 >REDIS 不单纯的数据库结构

REDIS 不单纯的数据库结构

时间:2023-06-22 12:00:49浏览次数:43  
标签:存储 数据库 REDIS 单纯 使用 数据结构 数据


REDIS   不单纯的数据库结构_java

数据库是一个处理数据的地方,包含了数据计算,数据存储,和数据转换等等,其中处理数据中,数据库结构和数据库库结构的种类,可以作为评判一个数据库某项指标好坏的关键。什么是一个好的数据结构,简单的说,方便数据访问,和管理的数据结构就是一个好的数据结构。

REDIS 本身虽然是一个缓存式数据库,但他在缓存式数据库中并不单纯,REDIS 本身支持很多数据库结构,通过使用不同的数据结构来简化代码提高开发的效率。

1  Strings 类型

REDIS Strings 类似是大多数存储使用的数据格式,REDIS  内部的整体的存储结构是如下图的hashmap ,内部是通过数组实现hash,每个dictEntry 是一个key value的对象,在dictEntry中包含 key 和value的指针,分别指向在其中存储的 key  和 value。

REDIS   不单纯的数据库结构_redis_02

REDIS   不单纯的数据库结构_哈希算法_03

2  lists ,lists 类型用于保存插入到REDIS 中的数据的顺序,我们将其作为一种先进先出的数据存储方式。

redis list 数据结构地城采用压缩列表 ziplist 或者 linkedlist 两种数据结构进行存储,在ziplist 不满足数据存储要求的情况下,在使用linkedlist 存储。

REDIS   不单纯的数据库结构_缓存_04

这里列表对象所有字符串元素的长度小于64字节,列表对象保存的元素数量小于512 。在插入信息会先对这些信息进行判断,在超过这个标准后,会启用listedlist ,这里不同的是ziplist 是压缩格式,而listedlist 是双链表的格式。

3  hash ,redis 的hash 是一种数据类型,本身存储的是一组key value的值,并且

REDIS   不单纯的数据库结构_哈希算法_05

REDIS   不单纯的数据库结构_数据库_06

hash 作为redis 常用的数据库类型,其底层存储结构有两种实现的方式,当数据量较少的时候,会采用ziplist 来存储数据,使用这样的方式主要需要包含两个条件   哈希对象保存的键值对数量少于512 ,同时保存的键值对和值的长度要小于64个字节。

当存储的hash 值不符合这个特性的情况下,我们使用REDIS 就需要使用dict的结构了,这个结构类似与java 的hashmap,是一个无序的数据和里边表结合的方式,如上面的图中所示,存储数据的结构是dict,字典结构的数据存储方式通过哈希表算法实现,查找性能为0(1) .

哈希表主要的工作原理是将数据映射到数据组中的定义位置,通过数组的下标来访问数据,从而提高数据的查找效率。

4  集合set 数据存储结构

redis 的 set 和list 都可以存储多个字符串,list 上面说过,可以存储的值是有序的可重复的,而set 是无序的不可重复的。在使用 set 的情况下,在我们使用的过程中,也根据数据的情况划分存储的方式,在数据量少和所有的元素都是整数的情况下,使用intset 的方式来进行数据存储,而如果不满足这个条件,则使用hashtable来进行数据的存储。通过二分查找的方式来进行数据的存取。

typedef struct intset {
    
    // 编码方式
    uint32_t encoding;

    // 集合包含的元素数量
    uint32_t length;

    // 保存元素的数组
    int8_t contents[];

} intset;

REDIS   不单纯的数据库结构_redis_07

5  sorted sets 

sorted set 与  sets 之间最大的不同就是顺序性,其中这个结构中包含两个数据结构 dict, 和 zskiplist  ,zskiplist 结构体中有四个元素,包含 头 和 尾, 整个链表的长度,以及最大的跳表的层数。

REDIS   不单纯的数据库结构_java_08

跳表产生的主要原因是,数据搜寻的效率的问题,在节点过多的情况下如果搜寻整个节点列中的靠后的节点,则是一个消耗较大的操作。为了解决这个问题,使用了跳表的方式来进行数据的查询。使用跳表的组要原因是实现的方式比较简单,不需要过多的算法代码等,在数据量不是太大的情况下,跳表的算法实现和使用的成本低效率高。同时根据在REDIS 中查找数据的通常的处理方法,一般是不使用范围查找的,而使用传统的数据库中的平衡树,或二叉树的算法,对于REDIS 中的数据查找并无好处,同时从内存占用的角度来看指针如果是传统的算法中 每个节点包含的指针数可以计算为  1/(1-p)而使用跳表的方式,则指针数可以表达为 p=1/4 相对指针数是固定的。

REDIS   不单纯的数据库结构_数据库_09

REDIS 数据库与传统的数据库最大的不同点是,REDIS 中的数据结构是面向,解决程序中的实际中的数据存储和数据查询,提高性能而产生的数据结构。

REDIS   不单纯的数据库结构_缓存_10

标签:存储,数据库,REDIS,单纯,使用,数据结构,数据
From: https://blog.51cto.com/u_14150796/6534577

相关文章

  • Redis
    一.设置密码步骤1:application.xml下配置redis 步骤2:redis目录下配置文件redis-windows.conf的requirepass字段requirepasspwd步骤3:redis-cli客户端设置密码configsetrequirepass'pwd'......
  • 什么是 Redis?【Redis】
    Redis是一个基于内存的key-value结构的数据库 主要特点1.基于内存存储,读写性能高-Redis读的速度是110000次/S2.适合存储热点数据(商品、新闻资讯)3.它存储的value类型比较丰富,也称为结构化NoSQL数据库......
  • Redis6 的安装
    安装网址‍Redis官方网站Redis中文官方网站http://redis.iohttp://redis.cn/‍安装版本‍6.2.1forLinux(redis-6.2.1.tar.gz)‍用考虑在windows环境下对Redis的支持‍安装步骤‍①准备工作:下载安装最新版的gcc编译器安装C语言的编译环境:yum......
  • 2-Redis概述
    ​​‍1.应用场景‍1.1配合关系型数据库做高速缓存‍高频次,热门访问的数据,降低数据库IO分布式架构,做session共享​​‍1.2多样的数据结构存储持久化数据‍​​‍2.Redis介绍相关知识‍​​‍​​‍多路复用指使用一个线程来检查多个文件描述符(Socke......
  • 全球溯源中心系列成果发布,巨杉数据库积极参与溯源产业应用生态
    巨杉数据库作为溯源+数据库技术应用企业,凭借多年深耕文档型分布式数据库的技术积累和创新能力,受邀参与全球溯源中心标准系列成果发布及溯源产业应用启动仪式。6月19日,“链接世界预鉴未来”——全球溯源中心系列成果发布活动在广州南沙成功举办。巨杉数据库作为溯源+数据库技术应......
  • 数据库连接池
    最近写项目碰到数据库连接池,大概记录一下是干嘛的,后续持续补充:应用程序和数据库建立连接的过程是这样的:首先通过TCP协议的三次握手和数据库服务器建立连接,然后发送数据库用户账号密码,等待数据库验证用户身份。2.完成用户身份验证后,系统才可以提交SQL语句到数据库执行。3.......
  • 网络单纯形 学习笔记
    网络单纯形算法是一种神奇的算法。它可以求解带负圈的费用流,可以过HLPP板子,但它的(最坏)复杂度好像是指数级,尽管我并不会证感性理解:它和线规算法simplex有许多相似之处,而simplex(最坏)是指数级的.虽然但是,据CF[1]上所讲,它的平均时间复杂度是\(O(VE)\),且常数较小(无LCT情况......
  • 【Azure Redis 缓存】应用中出现连接Redis服务错误(production.ERROR: Connection ref
    问题描述在PHP应用中,连接Redis的方法报错  RedisException(code:0):Connectionrefusedat/data/Redis/Connectors/PhpRedisConnector.phpproduction.ERROR:Connectionrefused{"exception":"[object](RedisException(code:0):Connectionrefusedat/data/Redis/Con......
  • 【Azure Redis 缓存】应用中出现连接Redis服务错误(production.ERROR: Connection ref
    问题描述在PHP应用中,连接Redis的方法报错  RedisException(code:0):Connectionrefusedat/data/Redis/Connectors/PhpRedisConnector.phpproduction.ERROR:Connectionrefused{"exception":"[object](RedisException(code:0):Connectionrefusedat/data/Redis/......
  • 2023-06-21:redis中什么是BigKey?该如何解决?
    2023-06-21:redis中什么是BigKey?该如何解决?答案2023-06-21:什么是bigkeybigkey是指存储在Key-Value数据库中的键对应的值所占用的内存空间较大。举个例子,如果值是字符串类型,它可以达到最大512MB的存储空间;如果值是列表类型,最多可以存储2^32-1个元素,即4294967295个元素。根据数......