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. 启用禁用员工账号…...

PyCharm:2023新版PyCharm无UI工具栏,如何回旧版
pycharm2023.3新版本,默认使用新UI,界面突然变化很大,感觉用起来很不适应。。。。于是,在网上搜了一下,确实有回老版的方法,试了一下,确实很nice~~~~ 方法: Settings——>Appea…...

阿里云国际站:云备份
文章目录 一、阿里云云备份的概念 二、云备份的优势 三、云备份的功能 四、云备份的应用场景 一、阿里云云备份的概念 云备份作为阿里云统一灾备平台,是一种简单易用、敏捷高效、安全可靠的公共云数据管理服务,可以为阿里云ECS整机、ECS数据库、文件…...

C#中.NET 6.0 Windows窗体应用通过EF访问数据库并对数据库追加、删除记录
目录 一、应用程序设计 二、应用程序源码 三、生成效果 前文作者发布了在.NET 6.0 控制台应用中通过EF访问已有数据库,事实上,在.NET 6.0 Windows窗体应用中通过EF访问已有数据库也是一样的。操作方法基本一样,数据库EF模型和上下文都是自…...

kafka+ubuntu20.04+docker配置
记录一次配置过程 安装docker 参加下面链接的第一部分 Ubuntu20.04使用docker安装kafka服务-CSDN博客 安装zookeeper docker run -d --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime wurstmeister/zookeeper安装kafka服务 docker run -d --name kafka …...

遍历一个对象,并得出所对应的值
var dates {//定义的对象year:now.getFullYear(),month:now.getMonth()1,date:now.getDate(),hour:now.getHours(),minute:now.getMinutes(),second:now.getSeconds() }//开始遍历循环 var val; for (val in dates){console.log(对象名称:val-对象的值:…...

WGCLOUD的特点整理
做运维工作很多年了,项目中用过不少的运维软件工具,今天整理下WGCLOUD的特点(优点) 首先WGCLOUD是完全免费的 部署使用:部署简单方便,上手容易,几乎没有学习成本,对新手友好 文档…...

新版软考高项试题分析精选(三)
请点击↑关注、收藏,本博客免费为你获取精彩知识分享!有惊喜哟!! 1、项目整体管理要综合考虑项目各个相关过程,围绕整体管理特点,以下说法中,( )是不正确的。 A.项目的…...

从申请服务器到Docker部署Java项目至最后运行完结
目录 1.申请服务器篇 2.配置安全组篇 3.Docker安装篇 4.代码编写打包篇 目录结构 Maven Controller DockerFile 开始打包 5.所需文件上传及镜像构建篇 上传准备 上传jar包及DockerFile文件 指令构建 验证 6.镜像启动服务验证篇 启动镜像 使用云服务器地址进行…...

解决 requests.post 数据字段编码问题的方法
问题背景 在进行网络请求时,我们通常会使用requests库的post方法来发送POST请求。然而,当我们尝试发送包含特殊字符(如中文字符)的数据时,可能会遇到数据字段被编码的问题。这可能会导致请求失败或者服务器无法正确解…...

安全运维:cmd命令大全(108个)
1、calc:启动计算器 2、appwiz.cpl:程序和功能 3、certmgr.msc:证书管理实用程序 4、charmap:启动字符映射表 5、chkdsk.exe:Chkdsk磁盘检查(管理员身份运行命令提示符) 6、cleanmgr: 打开磁盘清理工具 7、clico…...