redis(一) 基本数据结构

redis(一) 基本数据结构


redis的简介 Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。,它以字典结构存储数据.并允许其他应用通过TCP协议读写字典中的内容,数据结构如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iO5g74HM-1579051443276)(./images/1578447044217.png)]
redis 的魅力 缓存大致可以分为两类,一种是应用内缓存 比如Map(简单的数据结构) 以及EH Cache(Java第三方库),另一种就是缓存组件 比如 Memached,Reids 等.Redis是一个基于KEY-VALUE的高性能的存储系统,通过提供多种键值数据类型来适应不同场景下的缓存和存储需求

[注意:redis的安装 配置有多种方式 单机 一主多从 多主多从 各种配置方式不同 机制不同 使用方式 也有区别]

1.redis中的数据类型

1.1 字符串类型
字符串类型是redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据.你可以用它存储用户的邮箱 json化的对象 甚至是图片,一个字符串类型键的允许存储的最大容量是512M

内部数据结构
redis内部,string类型通过int , SDS(simple dynamic string)作为结构存储,int用来存放整型数据,sds存放字节/字符串和浮点型数据 . 在C的标准字符串结构下进行了封装,用来提升基本操作的性能.同时也充分利用了C的标准库,简化实现逻辑.我们可以在redis的源码中[sds.h]中看到 sds 的结构如下:
typedef char *sds ;

redis3.2分支引入了五种sdshdr类型 目的是为了满足不同长度字符串 可以使用不同大小的Header,从而节省内存,每次创建一个sds时根实际长度判断应该选择什么类型的sdshdr,不同类型的sdshdr占用的内存空间不通,这样细分下来可以省去很多不必要的内存开销…下面是3.2中sdshdr的定义:

`struct __attribute__ ((__packed__)) sdshdr8 { 8表示字符串最大长度是2^8-1 (长度为255)`` 
 uint8_t len;//表示当前sds的长度(单位是字节)``  
 uint8_t alloc; //表示已为sds分配的内存大小(单位是字节)`` 
 unsigned char flags; //用一个字节表示当前sdshdr的类型,因为有sdshdr有五种类型,所以至少需要3位来表示000:sdshdr5,001:sdshdr8,010:sdshdr16,011:sdshdr32,100:sdshdr64。高5位用不到所以都0`` 
 char buf[];//sds实际存放的位置``};`

sdshdr8的内存布局
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hvo2luYQ-1579051443278)(./images/1578448348316.png)]

1.2 list (列表)
在redis3.2之前 lsit类型得value对象内部以linkedlist或者ziplist来实现,当list得元素个数和单个元素得长度比较小得时候 redis选择ziplist(压缩列表) 否则选择linkedlist.(双向列表)
这两种存储方式都有优缺点
双向列表: 插入复杂度低 但内存开销大
压缩列表:一段连续内存 存储效率高~ 但插入和删除都要申请释放内存
在3.2之后 采用一种叫做 quicklist得数据结构存储list,列表底层都由quicklist实现. 每个节点上都是一个ziplist
在这里插入图片描述

1.3 hash 类型
整体看作一个对象 每个field-value相当于对象得属性和属性值
map提供两种结构来存储,一种是hashtable、另一种是前面讲的ziplist,数据量小的时候用ziplist. 在redis中,哈希表分为三层,分别是,源码地址【dict.h】

1.4 set (集合)
集合类型中,每个元素都是不同得 不允许有重复数据,同时集合类型中得数据是无序得 一个集合类型得键可以存储之多232-1个 .集合和列表的最大区别就是有序性和唯一性
集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在。由于集合类型在redis内部是使用的值为空的散列表(hash table),所以这些操作的时间复杂度都是O(1).

Set在的底层数据结构以intset或者hashtable来存储。当set中只包含整数型的元素时,采用intset来存储,否则,
采用hashtable存储,但是对于set来说,该hashtable的value值用于为NULL。通过key来存储元素

1.5 有序集合 zset
在这里插入图片描述
有序集合类型,顾名思义,和前面讲的集合类型的区别就是多了有序的功能
在集合类型的基础上,有序集合类型为集合中的每个元素都关联了一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在等集合类型支持的操作,还能获得分数最高(或最低)的前N个元素、获得指定分数范围内的元素等与分数有关的操作。虽然集合中每个元素都是不同的,但是他们的分数却可以相同
zset类型的数据结构就比较复杂一点,内部是以ziplist或者skiplist+hashtable来实现,这里面最核心的一个结构就是skiplist,也就是跳跃表
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值