redis五种基本数据类型

29bc12ff749c44f2bb9cc576eb7710cf.jpgredis存储任何类型的数据都是以key-value形式保存,并且所有的key都是字符串,所以讨论基础数据结构都是基于value的数据类型

 

 

常见的5种数据类型是:String、List、Set、Zset、Hash

 

 

 

 

 

一) 字符串(String)

String是redis最基本的类型,value最大是512M,String类型是二进制安全的,可以包含任何数据,如jpg图片或者序列化的对象

 

1 使用场景

1) 缓存:redis作为缓存层,mysql做持久化层,降低mysql的读写压力

 

2) 计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源

 

3) 分布式session

 

4) 分布式锁

 

5) 限流

 

 

 

2 编码

String类型的编码包括:

 

1) int编码:保存用 long 类型的整数值

 

2) embstr编码:长度小于44Byte的短字符串(redis3.2版本之前是39Byte,之后是44Byte),对其进行修改后变成raw编码,无论是否达到44字节

 

3) raw编码: 长度大于44Byte的长字符串(redis3.2版本之前是39Byte,之后是44Byte)

 

 

 

3 编码转换

1) int 编码的值不再是整数,或大小超过了long类型的时,自动转化为raw

2) 由于redis没有对embstr编码的值提供修改方法(embstr编码是只读的),在修改embstr编码的值时,都会先转化为raw编码再进行修改,修改后的对象一定是raw编码的,无论是否达到了44Byte

 

 

 

 

 

二) List(列表)

redis中的List其实就是双端链表

 

 

使用List的技巧

lpush+lpop=Stack(栈)

lpush+rpop=Queue(队列)

lpush+ltrim=Capped Collection(有限集合)

lpush+brpop=Message Queue(消息队列)

 

 

 

1 使用场景

1) 简单队列:发布微博,用lpush加入时间轴,最新消息排行,展示新的列表信息

 

2) 消息队列:PUSH 操作将任务存放在List中,然后工作线程再用 POP操作将任务取出进行执行

 

 

 

2 编码

1) linkedlist:双向链表,当列表元素个数比较多或者某个元素占用空间比较大的时使用,redis3 .2版本之前使用

 

2) ziplist:压缩列表,当列表元素个数比较少并且每个元素占用空间比较小时使用,redis3 .2版本之前使用

 

3) quicklist:快速列表,结合了ziplist和linkedlist各自的优点,redis3 .2版本开始使用

 

 

 

三) Set(无序集合)

redis中的Set类型是无序集合,集合中成员是不可重复的

 

添加,删除,查找元素的复杂度都是 O(1)

 

 

 

1 使用场景

1) 标签:有同一标签或者类似标签的可以给推荐关注的事或者关注的人

 

2) 点赞,点踩,收藏

 

 

 

2 编码

1) hashtable:数据全部存储于dict的键中,值字段闲置不用

 

2) intset:集合中存储的只能是数值数据,且必须是整数

 

 

 

3 编码转换

同时满足以下两个条件时,使用intset编码,否则使用hashtable编码

 

1) Set中所有元素都是整数

 

2) Set中所有元素数量不超过512M(配置文件的set-max-intset-entries参数)

 

 

 

四) ZSet(有序集合)

Zset类型和Set类型基本一样,区别在于Zset类型是有序集合

 

Zset集合中的每个元素都会关联一个 double 类型的权重参数(score),使得集合中的元素能够按score进行有序排列

 

添加,删除,查找元素的复杂度都是 O(1)

 

 

 

1 使用场景

1) 排行榜:如网站需要对用户点赞数从高到低进行排行

2) 权重分配:带权重的队列,如普通消息的score为1,重要消息的score为2,工作线程根据权重倒序获取,保证重要的任务优先执行

 

 

2 编码

1) ziplist:需要基于ziplist数据结构的基础做排序与去重

 

2) skiplist:底层使用了dict与skiplist两种数据结构

     单独使用dict,虽然能以 O(1) 的时间复杂度查找成员,但dict是无序的,所以进行范围操作的时候都要进行排序;

 

     单独使用skiplist,虽然能执行范围操作,但是查找操作为O(logN)

 

     因此redis使用了dict与skiplist两种数据结构来共同实现Zset,既可以以O(1) 的时间复杂度查找成员,又可以实现范围操作

 

 

 

3 编码转换

当Zset对象同时满足以下两个条件时,使用 ziplist 编码,否者使用 skiplist 编码

 

1) 保存的元素数量小于128(配置文件的zset-max-ziplist-entries参数)

 

2) 保存的所有元素长度都小于64Byte(配置文件的zset-max-ziplist-value参数)

 

 

五) Hash

Hash是一个key(字段) 和 value(属性) 的映射表,hash 特别适合用于存储对象

 

一个Hash可以存多个key-value

 

 

 

1 使用场景

1) 缓存:用户信息,视频信息等

 

2) 用户信息

 

3) 用户主页访问量

 

4) 组合查询

 

 

 

2 编码

1) ziplist

 

2) hashtable

 

 

 

3 编码转换

当同时满足下面两个条件时,使用ziplist编码,否则使用hashtable 编码

 

1) 列表保存元素个数小于512(配置文件的set-max-intset-entries参数)

 

2) 每个元素长度小于64Byte

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

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

相关文章

linux日志不循环问题诊断

有一台Linux虚拟机的messages日志文件自2023年7月下旬开始没有按周为周期重新生成新的日志,一直累积在同一个messages文件中,如下所示: [root logrotate.d]# ls -l /var/log|grep me -rw-r--r-- 1 root root 107170 Nov 15 1…

地图导航测试用例,你get了吗?

地图导航是我们经常使用的工具,能帮助我们指引前进的方向。 接下来,会从功能测试、UI测试、兼容测试、安全测试、网络测试、性能测试、易用性测试、文档和国际化语言测试8个方面来编写地图导航测试用例。 一 功能测试 输入起点和终点,验证…

python3.7升级为更高版本并迁移库

创建虚拟环境 # 在进入当前的虚拟环境【py3.7的环境】使用pip导出全部包txt文件 pip freeze > all_package.txt# 创建虚拟环境 conda create -n py39 python3.9# 激活新创建的虚拟环境 conda activate py39# 用 pip 一键文件安装 # pip install --help 查看-r命令的作用 # …

LeetCode48旋转图像

思路是沿对角线交换元素,之后沿矩阵中线交换元素 参考链接 🔗:【LeetCode 每日一题】48. 旋转图像 | 手写图解版思路 代码讲解-哔哩哔哩】 class Solution {public void rotate(int[][] matrix) {int i0,j0;if(matrixnull){return;}int n matrix.length;// int[]…

优先级队列(priority_queue)

文章目录 优先级队列的定义定义:接口头文件优先队列和堆的关系使用:排序的规则容器 仿函数应用 队列存指针问题: 优先级队列的定义 定义: 黄色部分是仿函数 接口 头文件 这里不需要包含其他的头文件只需要使用队列的头文件就可以…

mysql 与 Oracle 的区别,oracle 与 mysql分页查询的区别

文章目录 mysql 与 Oracle 的区别1、并发性2、一致性3、事务4、数据持久性5、提交方式6、逻辑备份7、热备份8、sql语句的扩展和灵活性9、复制10、性能诊断11、权限与安全12、分区表和分区索引13、管理工具 oracle 与 mysql分页查询1.Oracle分页查询中提供了一个伪列&#xff1a…

LeetCode算法题解(动态规划)|LeetCode343. 整数拆分、LeetCode96. 不同的二叉搜索树

一、LeetCode343. 整数拆分 题目链接:343. 整数拆分 题目描述: 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入…

​极氪,中国传统汽车品牌电动化的样板间

这篇文章早就想写了,因为太忙的原因就一直跳票,正好最近两件事的出现,又触发了想写这篇文章的冲动。 两件事主要是: 一,10 月份各家陆续公布了单月销量以及累计销量; 二,极氪在北京正式发布了 …

LeetCode100131. Make Three Strings Equal

文章目录 一、题目二、题解 一、题目 You are given three strings s1, s2, and s3. You have to perform the following operation on these three strings as many times as you want. In one operation you can choose one of these three strings such that its length i…

PTA 7-2 简单计算器

7-2 简单计算器 分数 20 全屏浏览题目 作者 张彤彧 单位 浙江大学 模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。 输入格式: 输入在一行中给出一个四则运…

【GUI】-- 10 贪吃蛇小游戏之静态面板绘制

GUI编程 04 贪吃蛇小游戏 4.1 第一步:先绘制一个静态的面板 首先,需要新建两个类,一个StartGame类作为游戏的主启动类;一个GamePanel类作为游戏的面板类。此外,再新建一个Data类作为数据中心(存放了小蛇各部分图像的…

微信朋友圈全新玩法,轻松互动,引爆你的社交圈

随着社交媒体的普及,越来越多的人开始利用朋友圈来展示自己的生活和与朋友互动。而在这个数字时代,定时发圈、跟圈和朋友圈互动已经成为了一种社交习惯。本文将介绍这些功能的概念和一键转发朋友圈的实现方法。 什么是定时发圈、跟圈、朋友圈互动和一键转…

Embedding技术与应用(4): Embedding应用工程探析

编者按:随着互联网内容数量的急剧增长,个性化推荐已成为各大科技公司的核心竞争力之一。那么,如何构建一个可靠、高效的基于嵌入技术的推荐系统,使其能够在实际生产环境中正常运行呢?这是所有从业者都关心的问题。 本文…

git的实验:cherry-pick,github对比代码的两种方式

某个commit,比如 c1,,最早是在a分支做的,当被cherry-pick到b分之后,还是一样的revision吗? 实验1:c1被cherry-pick到别的分支后,revision不变对吗?(答案是变…

druid keepAlive 导致数据库连接数飙升

一.背景 应用在执行完某个复杂业务,主要包含20几个查询SQL的操作后,会导致数据库连接池一直升高 druid版本:1.2.11 druid配置文件: spring.datasource.druid.maxActive100 spring.datasource.druid.initialSize20 spring.datas…

python解决登录图形验证码

摘要:测试过程中经常遇到图片验证码,以下主要是调用百度OCR图片识别获取验证码,实现登录 1、百度云申请创建应用

【自动驾驶】一些业内自动驾驶专业术语释义

Trajectory 轨迹信息,一般都会发布未来5-10秒的trajactory信息。 Trajectory flicker 轨迹抖动 Nudge 道内避障。在维持车道不变的情况下,横向偏离车道中心以绕开obstacle/agent。 Xlane Nudge 借道避障。借用对向车道或自行车道以绕开obstacle/a…

VMware Workstation 与 Device/Credential Guard 不兼容 解决办法

问题描述 问题描述: VMware 启动虚拟机会报错。无法运行。 错误信息:VMware Workstation 与 Device/Credential Guard 不兼容。在禁用 Device/Credential Guard 原因分析: 通常原因是 Window 系统开启了 内置的Hyper-V 虚拟机。 解决方案&…

气死了,过五关,斩六将,结果被 HR 捅了一刀!!

Hello,大家好,我是 Sunday。 大家有没有遇到过这样的事情:“过五关,斩六将。通过了两轮、甚至是三轮的技术面,最后 HR 面被“捅死”了” 这样的事情,最近在一位同学身上连续出现了两次,弄得人…

【资深硬件工程师总结-千兆以太网设计指南】

文章目录 01通用PCB布线指南02标志焊盘中的接地过孔区示例03EMI注意事项04ESD注意事项 资深硬件工程师总结-千兆以太网设计指南 本应用笔记旨在帮助客户使用Microchip的10/100/1000 Mbps以太网器件系列设计PCB。本文档提供有关PCB布线的建 议, PCB 布线是保持信号完…