redis的对象(如何将redis的数据结构和数据类型联合起来)

news/2024/7/8 3:10:03 标签: redis, 缓存, 数据库

引言

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

通过这五种不同类型的对象,Redis可以在执行命令之前,根据对 象的类型来判断一个对象是否可以执行给定的命令。使用对象的另一个 好处是,我们可以针对不同的使用场景,为对象设置多种不同的数据结 构实现,从而优化对象在不同场景下的使用效率

对象的类型和编码

Redis使用对象来表示数据库中的键和值,每次当我们在Redis的数 据库中新创建一个键值对时,我们至少会创建两个对象,一个对象用作键值对的键(键对象),另一个对象用作键值对的值(值对象)

举个例子:

redis> SET msg "hello world"
O

SET命令在数据库中创建了一个新的键值对,其中键值对的键是一个包含了字符串值"msg"的对象,而键值对的值则是一 个包含了字符串值"hello world"的对象

Redis中的每个对象都由一个redisObject结构表示,该结构中和保存数据有关的三个属性分别是type属性、encoding属性和ptr属性

typedef struct redisObject {
//
类型
unsigned type:4;
//
编码
unsigned encoding:4;
//
指向底层实现数据结构的指针
void *ptr;
// ...
} robj;

类型

对象的type属性记录了对象的类型,这个属性的值可以是表列出的常量的其中一个

 对于Redis数据库保存的键值对来说,键总是一个字符串对象,而值则可以是字符串对象、列表对象、哈希对象、集合对象或者有序集合对象的其中一种

当我们称呼一个数据库键为“字符串键”时,我们指的是“这个数据 库键所对应的值为字符串对象”;

·当我们称呼一个键为“列表键”时,我们指的是“这个数据库键所对应的值为列表对象”。

TYPE命令的实现方式也与此类似,当我们对一个数据库键执行 TYPE命令时,命令返回的结果为数据库键对应的值对象的类型,而不 是键对象的类型

键为字符串对象,值为字符串对象
redis> SET msg "hello world"
OK
redis> TYPE msg
string
#
键为字符串对象,值为列表对象
redis> RPUSH numbers 1 3 5
(integer) 6
redis> TYPE numbers
list
#
键为字符串对象,值为哈希对象
redis> HMSET profile name Tom age 25 career Programmer
OK
redis> TYPE profile
hash
#
键为字符串对象,值为集合对象
redis> SADD fruits apple banana cherry
(integer) 3
redis> TYPE fruits
set
#
键为字符串对象,值为有序集合对象
redis> ZADD price 8.5 apple 5.0 banana 6.0 cherry
(integer) 3
redis> TYPE price
zset

编码和底层实现

对象的ptr指针指向对象的底层实现数据结构,而这些数据结构由对象的encoding属性决定。

encoding属性记录了对象所使用的编码,也即是说这个对象使用了 什么数据结构作为对象的底层实现

                                    每种类型的对象都至少使用了两种不同的编码

 举例 用OBJECT ENCODING命令可以查看一个数据库键的值对象的编 码

redis> SET msg "hello wrold"
OK
redis> OBJECT ENCODING msg
"embstr"
redis> SET story "long long long long long long ago ..."
OK
redis> OBJECT ENCODING story
"raw"
redis> SADD numbers 1 3 5
(integer) 3
redis> OBJECT ENCODING numbers
"intset"
redis> SADD numbers "seven"
(integer) 1
redis> OBJECT ENCODING numbers
"hashtable

列出了不同编码的对象所对应的OBJECT ENCODING命令输出

 总结:

通过encoding属性来设定对象所使用的编码,而不是为特定类型的 对象关联一种固定的编码,极大地提升了Redis的灵活性和效率,因为 Redis可以根据不同的使用场景来为一个对象设置不同的编码,从而优 化对象在某一场景下的效率


http://www.niftyadmin.cn/n/169364.html

相关文章

基于Java+SpringBoot+vue的毕业生信息招聘平台设计和实现【源码+论文+演示视频+包运行成功】

博主介绍:专注于Java技术领域和毕业项目实战 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟 Java项目精品实战案例(200套) 目录 一、效果演示 二、…

Lazada、速卖通、Shopee、阿里国际如何提升流量?测评自养号优势。

Lazada、Shopee、速卖通、阿里国际跨境电商平台上面每天都会上架很多新品,新品是没什么数据支撑的,所以热度会比较低,这就需要卖家好好思考一下该怎么提升? 1、优化标题关键词 标题关键词可以在很大程度上影响产品的显示&#x…

Spring Boot/Cloud读取配置文件yaml中的数据格式(List、Map、Object、基本数据类型)| Spring Cloud 27

一、概述 Spring Boot/Cloud读取配置文件yaml中的数据,包括:List、Map、Object、基本数据类型,并对ConfigurationProperties与Value的使用场景和方式进行比较。 二、利用ConfigurationProperties读取配置 2.1 配置文件样例 microservice:…

【C++初阶】四、类和对象(下)

文章目录一、再谈构造函数构造函数体赋值初始化列表explicit关键字二、Static成员引入- 计算类中创建了多少个类对象概念特性静态成员函数的访问三、友元友元函数友元类四、内部类五、匿名对象六、拷贝对象时的一些编译器优化一、再谈构造函数 构造函数体赋值 在创建对象时&a…

【JVM中的垃圾回收算法】

JVM(Java虚拟机)是Java程序运行的基础,它的主要任务是将Java字节码解释成计算机硬件指令。在Java虚拟机中,垃圾回收是一项非常重要的任务。垃圾回收算法是指在Java虚拟机中用于回收无用对象占用内存空间的算法。 目前&#xff0c…

华为OD机试真题Java实现【最远足迹】真题+解题思路+代码(20222023)

最远足迹 题目 某探险队负责对地下洞穴进行探险。探险队成员在进行探险任务时,随身携带的记录器会不定期地记录自身的坐标,但在记录的间隙中也会记录其他数据。探索工作结束后,探险队需要获取到某成员在探险过程中相对于探险队总部的最远的…

【面试】-- Hive高频面试题目

一、请描述一下数据倾斜,并提供解决方案?  定义:由于数据分布不均匀,导致大量数据集中到一点,造成数据热点。现象是100个 task, 有一个运行了 1个小时,其他99个只有 10分钟。本质是数据量太大。原因:key 分布不均匀、sql倾斜join、建表时类型有问题算子:count、dist…

(Java)付账问题

付账问题一、题目二、输入输出三、代码及解析一、题目 几个人一起出去吃饭是常有的事。 但在结帐的时候,常常会出现一些争执。 现在有 n个人出去吃饭,他们总共消费了S元。其中第i个人带了 ai元。 幸运的是,所有人带的钱的总数是足够付账的…