redis常用数据类型和应用场景

news2024/11/16 1:20:14

我们都知道 Redis 提供了丰富的数据类型,常见的有五种:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。
随着 Redis 版本的更新,后面又支持了四种数据类型: BitMap(2.2 版新增)、HyperLogLog(2.8 版新增)、GEO(3.2 版新增)、Stream(5.0 版新增)。

string
底层主要通过int和SDS简单字符串实现。
SDS比C语言中字符串的优点:
1、不仅可以存字符串,还可以存二进制数据,sds的API都是用二进制方式处理buf里的数据;
2.有一个记录长度的字段,因此只需要常数复杂度就可以获得sds的长度;
3.拼接字符串不会溢出,因为会检查。

字符串对象的内部编码(encoding)有 3 种 :int、raw和 embstr。
如果一个字符串对象保存的是整数值,并且这个整数值可以用long类型来表示,那么字符串对象会将整数值保存在字符串对象结构的ptr属性里面(将void*转换成 long),并将字符串对象的编码设置为int。
如果保存短字符串,就会用embstr编码,是一种针对段字符串的优化编码。
会通过一次内存分配函数来分配一块连续的内存空间来保存redisObject和SDS。如果是大字符串,就会用raw编码,一个指针指向sds,和对象不连续。
这么做好处,一次分配就一次释放,更方便,并且在一起的话CPU缓存提升命中率。空间局部性。
但是embstr导致字符串长度增加需要重新分配内存,就需要重新分配整个对象和数据。实际上,embstr编码的字符串是不能更改的。当我们对embstr编码的字符串对象执行任何修改命令(例如append)时,程序会先将对象的编码从embstr转换成raw,然后再执行修改命令。
#常用指令
SET name zx
GET name
EXISTS name
基本就是大写单词的缩写。

应用场景:
常规计数
因为 Redis 处理命令是单线程,所以执行命令的过程是原子的。因此 String 数据类型适合计数场景,比如计算访问次数、点赞、转发、库存数量等等。

分布式锁
SET 命令有个 NX 参数可以实现「key不存在才插入」,可以用它来实现分布式锁:
如果 key 不存在,则显示插入成功,可以用来表示加锁成功;
如果 key 存在,则会显示插入失败,可以用来表示加锁失败。
一般而言,还会对分布式锁加上过期时间,分布式锁的命令如下:
SET lock_key unique_value NX PX 10000 (PX 10000 表示设置 lock_key 的过期时间为 10s,这是为了避免客户端发生异常而无法释放锁。
而解锁的过程就是将 lock_key 键删除,但不能乱删,要保证执行操作的客户端就是加锁的客户端。所以,解锁的时候,我们要先判断锁的 unique_value 是否为加锁客户端,是的话,才将 lock_key 键删除。

共享session信息
session信息保存在服务器端,但是服务器可能有多个,如果下一次分配到不同的服务器,就需要重新登录。因此,我们需要借助 Redis 对这些 Session 信息进行统一的存储和管理,这样无论请求发送到那台服务器,服务器都会去同一个 Redis 获取相关的 Session 信息,这样就解决了分布式系统下 Session 存储的问题。

LIST
List 列表是简单的字符串列表,按照插入顺序排序,可以从头部或尾部向 List 列表添加元素。
List 类型的底层数据结构是由双向链表或压缩列表(元素个数小于某个值,且每个元素小于64字节)实现的。但是在 Redis 3.2 版本之后,List 数据类型底层数据结构就只由 quicklist 实现了,替代了双向链表和压缩列表。
LPUSH key value [value …] 将一个或多个值value插入到key列表的表头(最左边)
应用场景
消息队列。并且满足三个需求,分别是消息保序、处理重复的消息和保证消息可靠性
消息保序先进先出本身就可以保证。但是在pop读取消息时有一个性能风险点。如果消费者想要及时处理消息,就需要在程序中不停地调用 RPOP 命令(比如使用一个while(1)循环)这就会导致消费者程序的 CPU 一直消耗在执行 RPOP 命令上。为了解决这个问题,Redis提供了 BRPOP 命令。BRPOP命令也称为阻塞式读取,客户端在没有读到队列数据时,自动阻塞,直到有新的数据写入队列,再开始读取新数据。

如何实现处理重复消息。首先每个消息有一个全局ID,消费者对比消息ID和已经处理的ID,决定是不是重复。这个全局ID是要自己输入的。比如
例如,我们执行以下命令,就把一条全局 ID 为 111000102、库存量为 99 的消息插入了消息队列:

LPUSH mq “111000102:stock:99”

实现可靠性
当消费者程序从 List 中读取一条消息后,List 就不会再留存这条消息了。所以,如果消费者程序在处理消息的过程出现了故障或宕机,就会导致消息没有处理完成,那么,消费者程序再次启动后,就没法再次从 List 中读取消息了。
为了留存消息,List 类型提供了 BRPOPLPUSH 命令,这个命令的作用是让消费者程序从一个 List 中读取消息,同时,Redis 会把这个消息再插入到另一个 List(可以叫作备份 List)留存。
这样一来,如果消费者程序读了消息但没能正常处理,等它重启后,就可以从备份 List 中重新读取消息并进行处理了。

List缺点就是一条信息只能一个消费者读取。后来版本的有STREAM类型,实现消费组读取。

Hash 是一个键值对(key - value)集合,其中 value 的形式如: value=[{field1,value1},…{fieldN,valueN}]。Hash 特别适合用于存储对象。
在这里插入图片描述
Hash 类型的底层数据结构是由压缩列表或哈希表实现的:在 Redis 7.0 中,压缩列表数据结构已经废弃了,交由 listpack 数据结构来实现了。

主要用来缓存对象。比如在关系数据库中
在这里插入图片描述
存储一个哈希表uid:1的键值

HMSET uid:1 name Tom age 15

存储一个哈希表uid:2的键值

HMSET uid:2 name Jerry age 13

获取哈希表用户id为1中所有的键值

HGETALL uid:1

  1. “name”
  2. “Tom”
  3. “age”
  4. “15”

购物车,用户ID就是键,商品 id 为 field,商品数量为 value。

Set 类型是一个无序并唯一的键值集合,它的存储顺序不会按照插入的先后顺序进行存储。所以 Set 类型除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集。Set 类型的底层数据结构是由哈希表或整数集合实现的:
往集合key中存入元素,元素存在则忽略,若key不存在则新建
SADD key member [member …]
从集合key中删除元素
SREM key member [member …]
获取集合key中所有元素
SMEMBERS key
获取集合key中的元素个数
SCARD key
交集运算
SINTER key [key …]
将交集结果存入新集合destination中
SINTERSTORE destination key [key …]

这里有一个潜在的风险。Set 的差集、并集和交集的计算复杂度较高,在数据量较大的情况下,如果直接执行这些计算,会导致 Redis 实例阻塞。
在主从集群中,为了避免主库因为 Set 做聚合计算(交集、差集、并集)时导致主库被阻塞,我们可以选择一个从库完成聚合统计,或者把数据返回给客户端,由客户端来完成聚合统计。
主要用于点赞统计,共同关注数量,抽奖活动。

Zset 类型(有序集合类型)相比于 Set 类型多了一个排序属性 score(分值),对于有序集合 ZSet 来说,每个存储元素相当于有两个值组成的,一个是有序结合的元素值,一个是排序值。
Zset 类型的底层数据结构是由压缩列表或跳表实现的:
有序集合比较典型的使用场景就是排行榜

Bitmap 类型非常适合二值状态统计的场景,这里的二值状态就是指集合元素的取值就只有 0 和 1 两种,在记录海量数据时,Bitmap 能够有效地节省内存空间。
#签到统计,登录状态

简单来说 HyperLogLog 提供不精确的去重计数。
HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的内存空间总是固定的、并且是很小的。
所以,非常适合统计百万级以上的网页 UV 的场景。

LBS 应用访问的数据是和人或物关联的一组经纬度信息,而且要能查询相邻的经纬度范围,GEO 就非常适合应用在 LBS 服务的场景中。

#内部实现
GEO 本身并没有设计新的底层数据结构,而是直接使用了 Sorted Set 集合类型。
GEO 类型使用 GeoHash 编码方法实现了经纬度到 Sorted Set 中元素权重分数的转换,这其中的两个关键机制就是「对二维地图做区间划分」和「对区间进行编码」。一组经纬度落在某个区间后,就用区间的编码值来表示,并把编码值作为 Sorted Set 元素的权重分数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/184889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

稀疏表(ST表,Sparse Table)

ST表用来解决区间最值问题(也可以解决区间gcd) 利用倍增的思想,O(nlog⁡2n)O\left(n\log_2 n\right)O(nlog2​n)预处理,O(1)O\left(1\right)O(1)区间查询 令f(i,j)f\left(i,j\right)f(i,j)表示区间[i,i2j−1]\left[i,i2^j-1\right…

TypeScript 学习笔记总结(二)

TypeScript 笔记记录,侧重于接口,对象等内容。 文章目录一、 TS 面向对象二、TS 类三、TS 继承四、TS super关键字五、TS 抽象类六、TS 接口七、TS 属性封装八、TS 泛型一、 TS 面向对象 js也是面向对象的,并不是面向过程的。 下面&#xf…

虹科案例 | AR数字化解决方案在石油与天然气领域“大放异彩”

石油和天然气在当今人类社会中扮演着重要角色,但是石油和天然气的开采,却是耗费成本巨大的工程,石油和天然气公司也在不断寻找着能帮助他们降低运营成本并提高效率的好方法。 事实上,AR技术解决方案能帮助这些公司实现他们的目标…

Linux[安装gitlab笔记]

参考文章:https://www.jianshu.com/p/2cb10c11813d CentOS7下安装gitlab中文版 前提: 下载文件:gitlab-ce-12.9.2-ce.0.el7.x86_64.rpm 地址1:https://packages.gitlab.com/gitlab/gitlab-ce 地址2:https://mirrors.…

JVM——类加载与字节码技术(3)

目录四、类加载阶段4.1 加载4.2 链接4.3 初始化五、类加载——练习练习1练习2四、类加载阶段 4.1 加载 ① 将类的字节码载入方法区(1.8后为元空间,在本地内存中)中,内部采用 C 的 instanceKlass ● _java_mirror 即 java 的类镜…

大数据技术架构(组件)10——Hive:集合函数类型转化函数

1.4.3、集合函数1.4.3.1、size select map(a,1,b,2),size(map(a,1,b,2)),array(1,2,3,4),size(array(1,2,3,4));1.4.3.2、map_keysselect map(a,1,b,2), map_keys(map(a,1,b,2));1.4.3.3、map_valuesselect map(a,1,b,2), map_values(map(a,1,b,2));1.4.3.4、array_containssel…

中国国际电子商务中心与易观分析联合发布:2022年3季度全国网络零售发展指数同比增长1.5%

近日,中国国际电子商务中心与易观分析联合发布2022年3季度“全国网络零售发展指数”及其分指数。2022年3季度全国网络零售发展指数同比增长1.5%,环比下降2.9%。随着稳经济一揽子政策和接续措施全面落地显效,生产加快回暖,经济平稳…

vmstat、free、df、iostat、sar

1. vmstat看CPU vmstat -n 2 3 一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数单位是秒,第二个参数是采样的次数 -procs r:运行和等待CPU时间片的进程数,原则上1核的CPU的运行队列不要超过2,整个…

Softing为Endress+Hauser提供过程自动化连接解决方案

一 背景 恩德斯豪斯(EndressHauser)是一家总部位于瑞士的过程工业自动化解决方案的全球领军企业,致力于为过程工业及实验室自动化领域提供测量仪器、服务和解决方案。其产品被广泛应用于石油、化工、制药、食品饮料以及废水处理等过程自动化…

银河麒麟V10操控系统Qt安装

下载安装镜像申请试用https://www.kylinos.cn/support/trial.html,根据CPU架构选择要下载的安装包。AMD、Intel的CPU下载银河麒麟桌面操作系统V10 AMD64版本,我下载的Kylin-Desktop-V10-SP1-HWE-Release-2203-X86_64.iso制作系统安装启动U盘下载制作启动…

1. kafka-提高生产者吞吐量

kafka的基础使用知识不在这篇文章阐述,默认读者都会使用 首先kafka的生产者原理,如下。图来自网上 上面的图可能不全, 我再详细描述下,在消息发送过程中,设计到两个线程main和sender线程; (1…

Java接口——子接口是否能直接通过子接口名调用父接口类方法

Java9允许在接口中定义默认方法和类方法,为接口增加了一种私有方法,也可以提供实现。 接口就是定义一组通用的方法,就像U盘,只要是USB接口大部分都可以在电脑上使用,电脑无需关心U盘内部怎么实现,只需要告…

浅谈python中@装饰器 - 附例子(含类装饰器与函数装饰器)

浅谈python中装饰器 文章目录浅谈python中装饰器关于装饰器(decorator)小总结关于(语法糖)进阶装饰器顺序装饰器 & 参数End提到的使用首先要先讲一下装饰器的概念 关于装饰器(decorator) 先来看看官方…

计算机相关专业提升学历的解决方案(硕士研究生)

文章目录1、正规全日制硕士1.1 研究生入学考试1.2 硕士毕业要求2、继续教育(非全日制)2.1 在职研究生2.2 同等学力申硕3、海外硕士3.1 海外硕士申请3.2 中外合作项目1、正规全日制硕士 1.1 研究生入学考试 1、考试报名 官方网站:国家研究生…

玩转PPT 第2节 PPT第一辅助神器iSlide操作

ppt神器 第2节 islide常用操作锦集1 一键优化1.1 统一字体1.2 统一段落1.3 统一参考线1.4 统一主题色2 设计排版2.1 快速复制图形实现矩阵布局2.2 环形布局复制2.3 环形裁剪2.4 矩阵裁剪3 设计工具3.1 对齐3.2 大小3.3 对齐到参考线3.4 选择,相当于快速组合取消等3.…

树与二叉树深度剖析(二)

一. 树表示法1.双亲表示法(1).含义在一棵树中,任意一个结点的双亲只有一个,这是由树的定义决定的。双亲表示法就是利用了树的这个性质,在存储结点信息的同时,在每个节点中附设一个指向其双亲的指针, 指向双亲在链表中的…

IMX Linux 用户手册 — 3

IMX Linux 用户手册 — 3 10.3 CAAM Job Ring后端驱动规范 CAAM作业环后端驱动(caam_jr)实现并使用作业环接口(JRI)向CAAM引擎提交来自前端驱动(caamalg, caamhash, caampkc, caamrng, caamkeyblob)的加密API服务请求。 CAAM驱动程序有几个选项,最显著的是硬件工作…

ssm宿舍水电费报修考勤管理系统的开发与实现

目 录 摘 要 I 目 录 1 第1章 概述 1 1.1 研究背景 1 1.2 研究现状 1 1.3 研究内容 2 第二章 开发技术介绍 2 2.1 系统开发平台 2 2.2 平台开发相关技术 3 2.2.1 B/S架构 3 2.2.2 mysql数据库介绍 4 2.2.3 JSP技术介绍 4 第三章 系…

如何增强企业数字敏捷性?|身份云研究院

在经济下行背景中,企业面临数字化转型和降本增效两大课题,解决这两个问题的核心是增强企业数字敏捷性。比起从业务侧逐个优化,决策者们更应从数字化基础设施入手,搭好底层数字化架构来保障企业在不断变化的技术和法规中获得适应性…

随时随地查看远程试验数据与记录——IPEhub2与IPEmotion APP

一 背景 在工况恶劣、空间狭小的试验场景或工程机械领域中,不但试验人员在试验环境中对自身安全没有保障,而且试验过程也会受到影响,如高温高压测试、工程机械液压系统测试等。对此,结合IPEhub2与IPEmotion APP,既可保…