Redis 常用的类型和 API
前言
在当今的软件开发中,数据存储与操作是至关重要的一部分。为了满足日益增长的数据需求和对性能的追求,出现了许多不同类型的数据库。其中,Redis 作为一种基于内存且高性能的键值存储数据库,因其快速的读取速度、丰富的数据结构和灵活的应用场景而备受推崇。
本文将深入探讨 Redis 数据库中常用的数据类型(如字符串、哈希、列表、集合、有序集合)及其对应的常用 API。我们将详细介绍每种数据类型的特点、使用场景以及相应的 API 操作,旨在帮助读者更好地理解并灵活运用 Redis 数据库,从而提升数据存储与处理的效率和性能。
一、Redis 中常用的五种数据类型
字符串(String):字符串是 Redis 最基本的数据类型,它可以存储任意类型的数据,例如文本、数字或序列化的对象等。Redis 提供了丰富的 API 操作,如设置/获取值、追加、获取子串等。
哈希(Hash):哈希类型是一种键值对的集合,类似于关联数组或字典。每个哈希可以存储多个字段和与之相关联的值,常用于存储对象的属性。Redis 提供了对哈希的各种操作,如设置/获取字段值、获取所有字段、删除字段等。
列表(List):列表是一系列按照插入顺序排列的元素集合,可以在列表的两端进行快速的插入和删除操作。它常被用作队列、栈或消息发布与订阅等场景。Redis 提供了对列表的操作,如在头部/尾部插入元素、获取范围内的元素、删除指定元素等。
集合(Set):集合是一组无序且唯一的元素集合,不允许重复的成员存在。集合常用于存储一些独立的元素,如用户标签、好友列表等。Redis 提供了对集合的操作,如添加/移除元素、求交集/并集、判断元素是否存在等。
有序集合(Sorted Set):有序集合是一种类似于集合的数据结构,每个元素都关联着一个分数(score),通过分数对元素进行排序。有序集合常用于需要排序的场景,如排行榜、计分系统等。Redis 提供了对有序集合的操作,如添加/移除元素、根据分数范围获取元素、获取元素的排名等。
这五种数据类型提供了丰富的功能和灵活的应用场景,使得 Redis 成为一种强大的数据存储工具。在具体的应用中,可以根据需求选择合适的数据类型,从而高效地存储和操作数据。
我们来一个一个的试一下吧。
二、String (字符串 )
String 是 redis 最基本的类型,一个 key 对应一个 value。它是二进制安全的,可以包含任何数据,如jpg图片或者序列化的对象。
1、set:赋值操作。
*语法:set key value*
在可视化工具里面查看:
2、get 取值操作
语法:get key
3、getset 取值后重新赋值
*语法:getset key value*
4、mset 同时设置多个键值
*语法:mset key value [key value ...]*
5、mget 同时获取多个键值
*语法:mget key [key ...]*
6、del 删除一个或多个键值
*语法:del key [key ...]*
7、incr 当存储的字符串是整数时,让当前键值递增,并返回递增或增加后的值。
*语法:incr key*
8、incrby 当存储的字符串是整数时,让当前键值增加指定的数值,并返回递增或增加后的值。
语法:incrby key increment*
刚刚我们递增后的值是2,所以递增2后,值为:4。
9、decr 让当前键值递减,并返回递减或减少后的值。
*语法:decr key*
10、decrby 让当前键值减少指定的数值,并返回递减或减少后的值。
*语法:decrby key decrement*
11、append 向键值的末尾追加value。如果键不存在则将该键的值设置为value,即相当于 SET key value。返回值是追加后字符串的总长度。
*语法:append key value*
12、获取字符串长度(STRLEN)
STRLEN命令返回键值的长度,如果键不存在则返回0。
三、hash(哈希)
hash是一个string类型的field和value的映射表,而field只能是String类型,hash特别适合用于存储对象。
1、hset HSET一次只能设置一个字段值。HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0。
*语法:HSET key field value*
在 ARDM 里面查看:
2、hsetnx 当字段不存在时赋值,类似HSET。区别在于如果字段存在,该命令不执行任何操作。
例如:hsetnx user name qiu
说明:如果user中不存在name字段则设置name的值为qiu,否则不做任何操作。
*语法:HSETNX key field value*
3、hget HGET一次只能获取一个字段值。
语法:HGET key field
4、hgetall 获取所有字段值。
语法:HGETALL key
5、hdel 可以删除一个或多个字段,返回值是被删除的字段个数。
语法:HDEL key field [field...]
6、hincrby 为某个字段增加数值。
语法:HINCRBY key field increment
7、hexists 判断字段是否存在,存在则返回1,否则返回0。
语法:HEXISTS key field
8、hkeys 获取所有的字段名。
语法:HKEYS key
9、hvals 获取所有字段的值。
*语法:HVALS key*
10、hlen 获取字段数量。
语法:HLEN key
四、list(列表)
Redis的list是采用来链表来存储的,所以对于Redis的list数据类型的操作,是操作list的两端数据来操作的。
1、lpush 向列表左边添加元素。
*语法:LPUSH key value [value ...]*
2、rpush 向列表右边添加元素。
*语法:RPUSH key value [value ...]*
3、lrange LRANGE命令是列表类型最常用的命令之一,用于获取列表中的某一片段,将返回start到stop之间的所有元素(包含两端的元素),索引从0开始。索引可以是负数,如:-1代表最后边的一个元素。
*语法:LRANGE key start stop*
4、lpop LPOP命令从列表左边弹出一个元素,会分两步完成:第一步是将列表左边的元素从列表中移除。第二步是返回被移除的元素值。
*语法:LPOP key*
5、rpop RPOP命令从列表右边弹出一个元素,步骤与LPOP类似,第一步是将列表右边的元素从列表中移除。第二步是返回被移除的元素值。
*语法:RPOP key*
6、llen 获取列表中元素的个数
*语法:LLEN key*
7、lrem
语法:LREM key count value
LREM命令会删除列表中前count个值为value的元素,返回实际删除的元素个数。根据count值的不同,该命令的执行方式会有所不同:
当count>0时, LREM会从列表左边开始删除。
当count<0时, LREM会从列表右边开始删除。
当count=0时,LREM删除所有值为value的元素。
8、lindex 获得指定索引的元素值。
语法:LINDEX key index
9、lset 设置指定索引的元素值。
语法:LSET key index value
10、ltrim 只保留列表的指定片段
语法:LTRIM key start stop
11、linsert
语法:LINSERT key BEFORE|AFTER pivot value
LINSERT首先会在列表中从左到右查找值为pivot的元素,然后根据第二个参数是BEFORE还是AFTER来决定将value插入到该元素的前面还是后面。
12、rpoplpush 将一个列表的最后一个元素转移到另一个列表的最前面
语法:RPOPLPUSH source destination
五、set(集合)
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
1、sadd 增加一个或多个元素。
*语法:SADD key member [member ...]*
2、srem 移除一个或多个元素。
语法:SREM key member [member ...]
3、smembers 获得集合中的所有元素。
语法:SMEMBERS key
4、sismember 判断元素是否存在集合中。存在返回1,否则返回0。
语法:SISMEMBER key member
5、sdiff 查找属于集合A并且不属于集合B的元素。(差集运算)
语法:SDIFF key [key ...]
6、sinter 查找属于集合A且属于集合B的元素。(交集运算)
语法:SINTER key [key ...]
7、sunion 查找属于集合A或者属于集合B的元素。(合并运算)
语法:SUNION key [key ...]
8、scard 获取集合中元素的个数。
语法:SCARD key
9、spop
语法:SPOP key [count]
从集合中弹出一个或多个元素,由count指定。如果不指定count,默认弹出一个。由于集合是无序的,所有SPOP命令会从集合中随机选择一个元素弹出。
六、zset(有序集合)
zset又称sorted set,称之为有序集合,可排序的,但是唯一。和set的不同之处在于zset会给集合中的元素添加一个分数,然后通过这个分数进行排序。
1、zadd
语法:ZADD key score member [score member ...]
向有序集合中加入一个或多个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数。返回值是新加入到集合中的元素个数,不包含之前已经存在的元素。
2、zscore 获取元素的分数。
语法:ZSCORE key member
3、zrem 移除有序集合中的一个或多个成员,不存在的成员将被忽略。
语法:ZREM key member [member ...]
4、zrange
语法:ZRANGE key start stop [WITHSCORES]
按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素(包含两端的元素)。如果需要获得元素的分数可以在命令尾部加上WITHSCORES参数。
5、zrevrange
语法:ZREVRANGE key start stop [WITHSCORES]
按照元素分数从大到小的顺序返回索引从start到stop之间的所有元素(包含两端的元素)。如果需要获得元素的分数的可以在命令尾部加上WITHSCORES参数。
6、zrank 获取元素排名(从小到大)。
语法:ZRANK key member
7、zrevrank 获取元素排名(从大到小)。
语法:ZREVRANK key member
8、zrangebyscore 获得指定分数范围的元素。
语法:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
9、zincrby 增加某个元素的分数,并返回更改后的分数。
语法:ZINCRBY key increment member
10、zcard 获取集合元素的数量。
语法:ZCARD key
11、zcount 获取指定分数范围内的元素个数。
语法:ZCOUNT key min max
12、ZREMRANGEBYRANK 按照排名范围删除元素。
语法:ZREMRANGEBYRANK key start stop
13、ZREMRANGEBYSCORE 按照分数范围删除元素。
语法:ZREMRANGEBYSCORE key min max
七、使用 redis 的好处
Redis是一种快速、开源的内存数据库,具有以下几个优点和好处:
高性能:Redis的数据存储在内存中,读写速度非常快。它支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,使得它可以满足各种场景下的高性能需求。
持久化:Redis支持数据持久化,可以将数据以文件的形式保存到硬盘上。这样即使Redis服务重启或崩溃,数据也可以恢复。
缓存:Redis常用于作为缓存层,将热点数据存储在内存中,以提供快速访问。使用Redis作为缓存可以大幅提升系统的读取速度和性能。
发布/订阅:Redis支持发布/订阅模式,可以方便地实现消息的发布和订阅机制。这对于实时消息推送、事件通知等场景非常有用。
分布式锁:Redis提供了原子操作和分布式锁的支持,可以实现分布式环境下的锁机制,避免资源竞争和并发问题。
高可用性:Redis支持主从复制和哨兵模式,可以实现高可用性和自动故障转移。当主节点发生故障时,自动选举新的主节点,保证系统的可用性。
多语言支持:Redis提供了多种编程语言的客户端库,如Java、Python、C#等,使得开发人员可以方便地在各种语言环境下使用Redis。
总的来说,Redis以其高性能、灵活的数据结构和丰富的功能特性,在缓存、数据存储、消息队列等多个领域都有广泛的应用。它可以提升系统性能、增加系统可靠性,并且非常适合处理大规模的实时数据。
八、总结
Redis 常用的五大类型已经讲完了,没有很多理论的知识,都是一些命令,要全部记住也有点难,做好笔记,要用的时候找来用就行了。
相关文章:

Redis 常用的类型和 API
前言 在当今的软件开发中,数据存储与操作是至关重要的一部分。为了满足日益增长的数据需求和对性能的追求,出现了许多不同类型的数据库。其中,Redis 作为一种基于内存且高性能的键值存储数据库,因其快速的读取速度、丰富的数据结…...

在qt的设计师界面没有QVTKOpenGLWidget这个类,只有QOpenGLWidget,那么我们如何得到QVTKOpenGLWidget呢?
文章目录 前言不过,时过境迁,QVTKOpenGLWidget用的越来越少,官方推荐使用qvtkopengnativewidget代替QVTKOpenGLWidget 前言 在qt的设计师界面没有QVTKOpenGLWidget这个类,只有QOpenGLWidget,我们要使用QVTKOpenGLWidget,那么我们如何得到QVTKOpenGLWidget呢? 不过,时过境迁,Q…...

力扣每日一道系列 --- LeetCode 138. 随机链表的复制
📷 江池俊: 个人主页 🔥个人专栏: ✅数据结构探索 ✅LeetCode每日一道 🌅 有航道的人,再渺小也不会迷途。 LeetCode 138. 随机链表的复制 给你一个长度为 n 的链表,每个节点包含一个额外增加…...

无人零售:创新优势与广阔前景
无人零售:创新优势与广阔前景 无人零售在创新方面具有优势。相比发展较为成熟的欧洲和日本的自动贩卖机市场,中国的无人零售市场人均占有量较少,这表明该市场具有广阔的前景和巨大的市场潜力。 此外,无人零售涉及到许多相关行业&…...

【华为OD题库-022】阿里巴巴找黄金宝箱(IV)-java
题目 一贫如洗的椎夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0-N的子,每个箱子上面有一个数字,箱子排列成一个环,编号最大的箱子的下一个是编号为0的箱子。请输出每个箱子贴的数字之后的第…...

Linux 图形界面配置RAID
目录 RAID 1 配置 RAID 5配置 , RAID 配置起来要比 LVM 方便,因为它不像 LVM 那样分了物理卷、卷组和逻辑卷三层,而且每层都需要配置。我们在图形安装界面中配置 RAID 1和 RAID 5,先来看看 RAID 1 的配置方法。 RAID 1 配置 配置 RAID 1…...
(脏读,不可重复读,幻读 ,mysql5.7以后默认隔离级别)、( 什么是qps,tps,并发量,pv,uv)、(什么是接口幂等性问题,如何解决?)
1 脏读,不可重复读,幻读 ,mysql5.7以后默认隔离级别是什么? 2 什么是qps,tps,并发量,pv,uv 3 什么是接口幂等性问题,如何解决? 1 脏读,不可重复读…...

安全通信网络(设备和技术注解)
网络安全等级保护相关标准参考《GB/T 22239-2019 网络安全等级保护基本要求》和《GB/T 28448-2019 网络安全等级保护测评要求》 密码应用安全性相关标准参考《GB/T 39786-2021 信息系统密码应用基本要求》和《GM/T 0115-2021 信息系统密码应用测评要求》 1网络架构 1.1保证网络…...

深度学习_12_softmax_图片识别优化版代码
因为图片识别很多代码都包装在d2l库里了,直接调用就行了 完整代码: import torch from torch import nn from d2l import torch as d2l"获取训练集&获取检测集" batch_size 256 train_iter, test_iter d2l.load_data_fashion_mnist(ba…...
element-ui设置下拉选择切换必填和非必填
1、<el-form-item label="区域" prop="areaCode" :required="isHaveTo"><el-select v-model="form.areaCode" placeholder="请选择区域" clearable size="small"><el-option v-for="dict in …...

Linux的命令——关于操作用户及用户组的命令
目录 1.Linux的命令格式 2.用户与用户组管理 2.1用户管理 添加用户 设置用户密码 删除用户 修改用户 2.2用户组管理 新增用户组 删除用户组 修改用户组属性 用户组切换 用户组管理 用户切换 1. su 2.sudo 1.Linux的命令格式 Linux系统中几乎所有操作࿰…...
pycharm 设置多级跳转SSH
打开本地终端并运行: ssh -L <local_port>:<target_server_ip>:22 <proxy_server_user><proxy_server_ip>运行完之后就应该已经连接上proxy (Optional) 可以再开一个终端测试一下: ssh -p <local_port> <target_server_user&g…...

LeetCode 189.轮转数组(三种方法解决)
文章目录 题目暴力求解空间换时间三段逆置总结 题目 LeetCode 189.轮转数组 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5…...

GB28181设备对接视频流的流程
搭建CG28181 服务端,也即 SIP Server,这正是我们要实现的。实现CG28181服务端可以借助于现有的开源库 PJSIP,具体的实现步骤如下: 1、启动GB28181服务端,接收客户端消息请求 bool Init(std::string concat, int logL…...

类属性修改(为什么python类不具备被赋值能力?)
为什么python类不具备被赋值能力?,用魔术方法收集实参,在类中可以定义方法处理实际参数,实现对类“赋值”。 (笔记模板由python脚本于2023年11月15日 12:45:27创建,本篇笔记适合初通Python类class的coder翻阅) 【学习的…...
uniapp App端 解决input@input事件动态修改值不生效的问题
解决方法 1.延迟修改,利用setTimeout 2.异步修改,利用this.$nextTick <template><view><input v-modal"num" type"number" placeholder"请输入" :maxlength"3" input"onInputOne" …...
ELK分布式日志
ELK是指Elasticsearch、Logstash和Kibana三个开源软件的集合,用于构建分布式日志处理系统。 Elasticsearch是一款基于Lucene搜索引擎库的分布式全文搜索和分析引擎,支持多种数据类型的存储、搜索和分析,常用于日志分析、安全监控等领域。 L…...

Kylin-Server-V10-SP3+Gbase+宝兰德信创环境搭建
目录 一、Kylin-Server-V10-SP3 安装1.官网下载安装包2.创建 VMware ESXi 虚拟机3.加载镜像,安装系统 二、Gbase 安装1.下载 Gbase 安装包2.创建组和用户、设置密码3.创建目录4.解压包5.安装6.创建实例7.登录8.常见问题 三、宝兰德安装1.获取安装包2.解压安装3.启动…...
po与vo互转工具类
po转vo工具类 1.反射调用2.JSON序列化方式3.注解驱动4.ModelMappe5.手动映射6.总结7.扩展方法 1.反射调用 这个方法会创建一个新的实例,并将所有公共字段复制到目标对象中,而不修改原来的实例。因此,如果目标类包含 private 或 final 字段&am…...

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(三)
员工分页查询和账号启用禁用功能 1. 员工分页查询1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计 1.2 代码开发1.2.1 设计DTO类1.2.2 封装PageResult1.2.3 Controller层1.2.4 Service层接口1.2.5 Service层实现类1.2.6 Mapper层 1.3 功能测试1.4 代码完善 2. 启用禁用员工账号…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...