Redis系列-Redis数据类型【3】
目录
- Redis系列-Redis数据类型【3】
- 字符串类型(String)
- SDS (simple dynamic string)
- 哈希类型(Hash)
- 列表类型(List)
- 集合类型(Set)
- 有序集合类型(ZSet)
- 字符串类型(String)的特殊形式
- geospatial(地理位置)
- Hyperloglog(基数)
- 应用场景
- 应用场景
- Bitmaps(位存储)
- 应用场景
- 参考学习:
个人主页: 【⭐️个人主页】
需要您的【💖 点赞+关注】支持 💯
Redis系列-Redis数据类型【3】
字符串类型(String)
string
是 redis 最基本的类型
,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
应用场景:共享session、分布式锁,计数器、限流。
内部编码有3种,int
(8字节长整型)/embstr
(小于等于39字节字符串)/raw
(大于39个字节字符串)
命令列表
📌 set | get | mget | getrange | getset | getbit| setbit | setnx | setex | strlen | setrange| mset | msetnx | psetex | incr | incrby | decr | decrby | append
SDS (simple dynamic string)
Redis使用SDS(simple dynamic string) 封装,sds源码如下:
struct sdshdr{ unsigned int len; // 标记buf的长度 unsigned int free; //标记buf中未使用的元素个数 char buf[]; // 存放元素的坑
}
SDS 结构图如下:
Redis为什么选择SDS结构,而C语言原生的char[]
不香吗?
举例其中一点,SDS中,O(1)时间复杂度,就可以获取字符串长度;而C 字符串,需要遍历整个字符串,时间复杂度为O(n)
哈希类型(Hash)
Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
每个 hash 可以存储 2^32 -1
键值对(40多亿)。
内部编码:ziplist
(压缩列表) 、hashtable
(哈希表)
应用场景:缓存用户信息等。
⚠️ hset | hmset | hdel | hmset | hexists | hget | hgetall | hincrby | hincrbyfloat | hkeys | hvals | hlen | hmget| hsetnx | hscan
列表类型(List)
Redis 列表是简单的字符串
列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
列表最多可存储 2^32 - 1 元素 (4294967295, 每个列表可存储40多亿)。
特点: 有序,不唯一性,
一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
Redis3.2之前内部编码:ziplist(压缩列表)、linkedlist(链表)
ziplist是一种压缩链表,它的好处是更能节省内存空间,因为它所存储的内容都是在连续的内存区域当中的。当列表对象元素不大,每个元素也不大的时候,就采用ziplist存储。但当数据量过大时就ziplist就不是那么好用了。因为为了保证他存储内容在内存中的连续性,插入的复杂度是O(N),即每次插入都会重新进行realloc。如下图所示,redisObject对象结构中ptr所指向的就是一个ziplist。整个ziplist只需要malloc一次,它们在内存中是一块连续的区域。
结构
1、zlbytes:用于记录整个压缩列表占用的内存字节数
2、zltail:记录要列表尾节点距离压缩列表的起始地址有多少字节
3、zllen:记录了压缩列表包含的节点数量。
4、entryX:要说列表包含的各个节点
5、zlend:用于标记压缩列表的末端
Redis3.2及之后的底层实现方式:quicklist
快速列表是ziplist和linkedlist的混合体,是将linkedlist按段切分,每一段用ziplist来紧凑存储,多个ziplist之间使用双向指针链接。
应用场景:消息队列,文章列表,
lset | lpush | lpushx | rpush | linsert | lpop | rpop | llen | lindex | lrange | lrem | ltrim | rpushx | rpoplpush | brpoplpush | blpop | brpop
集合类型(Set)
Redis 的 Set
是 string
类型的无序
集合。
集合是通过哈希表
实现的,所以添加,删除,查找的复杂度都是 O(1)。
sadd 命令: 添加一个 string 元素到 key 对应的 set 集合中,成功返回 1,如果元素已经在集合中返回 0。
注意 : 根据集合内元素的唯一性,第二次插入的元素将被忽略。
特点:无序
,唯一性
集合中最大的成员数为 2^32 - 1(4294967295, 每个集合可存储40多亿个成员)。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)
。
内部编码:intset
(整数集合)、hashtable
(哈希表)
当存储的数据同时满足下面这样两个条件的时候,Redis 就采用整数集合intset来实现set这种数据类型:
- 存储的数据都是整数
- 存储的数据元素个数小于512个
intset 结构
intset是一个有序集合,查找元素的复杂度为O(logN)(采用二分法),但插入时不一定为O(logN),因为有可能涉及到升级操作。比如当集合里全是int16_t型的整数,这时要插入一个int32_t,那么为了维持集合中数据类型的一致,那么所有的数据都会被转换成int32_t类型,涉及到内存的重新分配,这时插入的复杂度就为O(N)了。是intset不支持降级操作。
inset是有序不要和我们zset搞混,zset是设置一个score来进行排序,而inset这里只是单纯的对整数进行升序而已
注意点:smembers和lrange、hgetall都属于比较重的命令,如果元素过多存在阻塞Redis的可能性,可以使用sscan来完成。
应用场景:用户标签,生成随机数抽奖、社交需求。
sadd | scard 个数 | smembers | srem | sinter | sdiff | sunion | sinterstore | sdiffstore | sunionstore | spop | srandmember | smove | sismemeber |
有序集合类型(ZSet)
Redis zset
和 set 一样也是string
类型元素的集合,且不允许重复
的成员。
不同的是每个元素都会关联一个double类型
的分数
。redis正是通过分数来为集合中的成员进行从小到大
的排序。
zset的成员是唯一的,但分数(score)却可以重复。
底层内部编码:ziplist
(压缩列表)、skiplist
(跳跃表)
应用场景:排行榜,社交需求(如用户点赞)。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)
。
集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储40多亿个成员)。
zadd airline 1 飞机1号 2 飞机2号 3 飞机三号 5 飞机五号 6 飞机6号 4 飞机4号
zscore
zcard airline # 个数
zcount airline 1 3
zrem
zrange airline 0 100
zrevrange
zrank
zincrby
zlexcount
zinterstore
zunionstore
zpopmin
zpopmax
zrevrank
zrangebyscore
zrangebylex
zremrangebyscore
zremrangebyrank
zremrangebylex
zrevrangebyscore airline 100 0 # 按倒排
zlexcount chars [c [b
字符串类型(String)的特殊形式
geospatial(地理位置)
Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。
Redis GEO 操作方法有:
- geoadd:添加地理位置的坐标。
- geopos:获取地理位置的坐标。
- geodist:计算两个位置之间的距离。
- georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
- georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
- geohash:返回一个或多个位置对象的 geohash 值。
Hyperloglog(基数)
Redis 在 2.8.9 版本添加了 HyperLogLog 结构。
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
应用场景
查看附近的人
微信位置共享
地图上直线距离的展示
应用场景
网页统计UV (浏览用户数量,同一天同一个ip多次访问算一次访问,目的是计数,而不是保存用户)
传统的方式,set保存用户的id,可以统计set中元素数量作为标准判断。
但如果这种方式保存大量用户id,会占用大量内存,我们的目的是为了计数,而不是去保存id。
pfadd | pfcount | pfmerge
Bitmaps(位存储)
Redis提供的Bitmaps这个“数据结构”可以实现对位的操作。Bitmaps本身不是一种数据结构,实际上就是字符串,但是它可以对字符串的位进行操作。
可以把Bitmaps想象成一个以位为单位数组,数组中的每个单元只能存0或者1,数组的下标在bitmaps中叫做偏移量。单个bitmaps的最大长度是512MB,即2^32个比特位。
应用场景
两种状态的统计都可以使用bitmaps,例如:统计用户活跃与非活跃数量、登录与非登录、上班打卡等等。
参考学习:
https://www.zhihu.com/tardis/bd/art/487583440?source_id=1001
相关文章:

Redis系列-Redis数据类型【3】
目录 Redis系列-Redis数据类型【3】字符串类型(String)SDS (simple dynamic string) 哈希类型(Hash)列表类型(List)集合类型(Set)有序集合类型(ZSet)字符串类…...

机器学习 - 决策树:技术全解与案例实战
目录 一、引言二、决策树基础决策树模型概述构建决策树的关键概念特征选择决策树的生成 决策树的剪枝 三、算法研究进阶提升树和随机森林提升树(Boosted Trees)随机森林(Random Forests) 进化算法与决策树决策树结构的进化 多目标…...
Opus 1.4 编译脚本
Opus 1.4 编译脚本 官网地址:https://www.opus-codec.org/ 仓库地址:https://gitlab.xiph.org/xiph/opus #!/bin/bash# 每次编译删除原来的编译文件 rm build -rf rm install -rf # 创建临时编译目录,避免污染源文件 mkdir build # 定义一…...

二进制搭建及高可用 Kubernetes v1.20
目录 一、实验规划: 二、操作系统初始化配置: 1. 关闭防火墙 selinux: 2. 关闭swap分区: 3. 根据规划设置主机名: 4. 所有主机添加hosts: 5. 调整内核参数: 6. 时间同步: 三、部署 etcd 集群:…...
SpringBoot 使用WebSocket打造在线聊天室
1、WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。 2、浏览器通过 Java…...
vcpkg安装第三方库,报错fatal error RC1107: invalid usage; use RC /? for Help
记录一下,vcpkg不知道什么原因安装库失败。 首先就是原本安装过的库,再次安装之后。不知道环境哪里修改了。会导致安装报错。 Change Dir: D:/Software/vcpkg/buildtrees/freeglut/x64-windows-dbgRun Build Command(s): "D:/Program Files/Micros…...
axios的介绍及配置多个服务器url
文章目录 1、常用的默认配置的是:baseURL、method、timeout2、axios配置多个服务器url3、配置api文件4、文件中使用 1、常用的默认配置的是:baseURL、method、timeout ① baseURL:设置url的基本结构(请求根地址)&…...

C# OpenCvSharp 通过特征点匹配图片
SIFT匹配 SURF匹配 项目 代码 using OpenCvSharp; using OpenCvSharp.Extensions; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text.RegularExpressions; using System.Windows.Forms; using static System.Net…...
10个python爬虫入门实例
昨天带伙伴学习python爬虫,准备了几个简单的入门实例,涉及主要知识点: web是如何交互的 requests库的get、post函数的应用 response对象的相关函数,属性 python文件的打开,保存 代码中给出了注释,并且…...

麒麟KYLINOS命令行设置系统静音
原文链接:麒麟KYLINOS命令行设置系统静音 hello,大家好啊,今天给大家带来一篇在麒麟KYLINOS上使用命令行调节系统静音的方法,有时候需要制作模板,便可以采用此方法,话不多说,一起来看看吧。 1、…...

零信任安全:构建无懈可击的网络防护体系
随着网络技术的飞速发展,信息安全问题日益凸显,传统的安全防护手段已经无法满足复杂多变的安全需求。在此背景下,零信任安全模型逐渐受到广泛关注。本文将探讨零信任安全的概念、优势以及如何构建无懈可击的网络防护体系。 一、零信任安全概念…...

华为李鹏:到 2025 年智能算力需求将达到目前水平的 100 倍
在第十四届全球移动宽带论坛上,华为高级副总裁、运营商 BG 总裁李鹏表示,大模型为代表的 AI 应用发展带来对智能算力的爆发式需求。 李鹏在题为《加速 5G 商业正循环,拥抱更繁荣的 5.5G》的讲话中表示,「5G 已经走在商业成功的正确…...

【漏洞复现】深信服下一代防火墙NGAF存在任意文件上传漏洞 附POC
漏洞描述 深信服下一代防火墙(Next-Generation Application Firewall)NGAF是面向应用层设计,能够精确识别用户、应用和内容,具备完整安全防护能力,能够全面替代传统防火墙,并具有强劲应用层处理能力的全新网络安全设备。NGAF解决了传统安全设备在应用识别、访问控制、内…...

城市内涝积水预防,万宾科技内涝监测仪如何预警?
近几年来城市内涝所引发的安全隐患极为突出,影响着城市道路安全,而且也让市民心中多有惶恐。一旦城市内涝问题出现背后不仅是路面积水问题,更会导致城市无法正常运行,导致市民日常生活和工作受到影响。所以对于排水防涝设施的建设…...

SpringBoot定时任务打成jar 引入到新的项目中后并自动执行
一、springBoot开发定时任务 ①:连接数据库实现新增功能 1. 引入依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional> </dependency> <dependen…...

AD9371 官方例程 NO-OS 主函数 headless 梳理(一)
AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 : AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射: AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 : AD9371 官方…...

SHAP 和 LIME 解释模型
内容大纲 1、SHAP 解释器1.1 案例:用于预测患者肺癌1.2 案例中使用的shap解释器1.3 SHAP工作原理1.4 举例说明 2、LIME 解释器2.1 案例:判断法律案件胜诉可能性2.2 LIME解释器工作原理2.3 本地解释模型的训练过程2.4 举例说明1:新闻分类2.4 举…...

若依vue-初步下载使用
若依框架可以满足大部分的后台管理系统的开发,使用频率也是比较高的,所以这里讲一下如何使用若依框架 若依框架代码克隆 首先去若依官网 http://www.ruoyi.vip/ 这里演示的是若依-vue版本的使用 我们点击下载 会跳转到码云仓库 或者直接点击下面的链接去码云仓库 https://git…...

Android 使用.9图 NinePatchDrawable实现动态聊天气泡
最近一段时间,在做一个需求,需要实现一个聊天气泡的动画效果,如下图所示: GitHub源码demo ,建议下载demo,运行查看。 动态聊天气泡动画 静态聊天气泡 经过一段时间调研,实现方案如下: 实现方…...
力扣 LCR 024. 反转链表两种解法
目录 1.解题思路Ⅰ2.代码实现Ⅰ3.解题思路Ⅱ4.代码实现Ⅱ 1.解题思路Ⅰ 利用头插法,遍历数组将后面的元素头插到前面的元素. 2.代码实现Ⅰ struct ListNode* reverseList(struct ListNode* head) { struct ListNode*curhead;;struct ListNode*newheadNULL;whil…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...

FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...