【Redis】Redis键值存储
大家好,我是白晨,一个不是很能熬夜,但是也想日更的人。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!💪💪💪
文章目录
- Redis键值概述
- 一、Redis数据类型概述
- 常用数据类型
- String
- List
- Hash
- Set
- Zset
- 扩展数据类型
- BitMap
- HyperLogLog
- GEO
- BitField
- Stream
- 二、Redis键(key)操作
- 常用操作及示例
- keys *
- exists key
- type key
- del key
- unlink key
- ttl key
- expire key seconds
- move key dbindex
- select dbindex
- dbsize
- flushdb
- flushall
- 常用操作汇总
- 总结
Redis键值概述
一、Redis数据类型概述
首先要强调一点:Redis是key value
类型的数据库,Redis所说的数据类型都是key value
中的value
的数据结构, 而key
都是字符串。
常用数据类型
Redis中有经常使用的有五大数据类型,分别是——String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。

String
String是redis最基本的类型,一个key对应一个value。
String类型是二进制安全的,意思是Redis的String可以包含任何数据,比如jpg图片或者序列化的对象 。
String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M。
List
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
List中最多可以最多可以包含 2 32 − 1 2^{32} - 1 232−1 个元素 (4294967295, 每个列表超过40亿个元素)。
Hash
Redis Hash 是一个 String 类型的 field(字段) 和 value(值) 的映射表,Hash 特别适合用于存储对象。
Redis 中每个 Hash 可以存储 2 32 − 1 2^{32} - 1 232−1 键值对 (4294967295, 每个哈希结构可存储40多亿个元素)。
Set
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
Redis 中Set集合是通过哈希表实现的(这里先这样认为),所以添加,删除,查找的复杂度都是 O(1)。
集合中最大的成员数为 2 32 − 1 2^{32} - 1 232−1 (4294967295, 每个集合可存储40多亿个成员)。
Zset
Redis Zset 和 Set 一样也是String类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。
Zset的成员是唯一的,但分数(score)却可以重复。
Zset集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 2 32 − 1 2^{32} - 1 232−1。
扩展数据类型
随着 Redis 版本的更新,后面又支持了五种数据类型: BitMap(2.2 版新增)、HyperLogLog(2.8.9 版本新增)、GEO(3.2 版新增)、BitField(3.2 版新增)、Stream(5.0 版新增)。
BitMap
Redis中的BitMap不是一个独立的数据类型,而是基于String类型实现的一种特殊的数据结构。BitMap主要用于存储大量二进制位(0或1)的数据,这些位可以代表不同的状态或标志。
BitMap,即位图,是一串连续的二进制数组(0和1),可以通过偏移量(offset)定位元素。BitMap通过最小的单位bit来进行 0|1 的设置,表示某个元素的值或者状态,时间复杂度为O (1)。由于bit是计算机中最小的单位,使用它进行储存将非常节省空间,特别适合一些数据量大且使用二值统计的场景。
示例如下图:
Redis的BitMap实际上是利用String类型的最大容量(512 MB)存储一个连续的二进制序列,其中每个字节的8位可以分别代表8个独立的状态。这意味着你可以用一个BitMap来跟踪多达数百万甚至数十亿的状态,只要状态总数不超过,即大约 2 32 2^{32} 232。
HyperLogLog
HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2 64 2^{64} 264 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
GEO
Redis的GEO类型主要用于存储地理位置信息,并对存储的信息进行操作。GEO实际上是一种有序集合(zset),它的每个元素都包含三个属性:经度(longitude)、纬度(latitude)和位置名称(member)。通过这些属性,我们可以在Redis中存储地理位置的坐标,并对它们进行一些有用的操作。
BitField
Redis的BITFIELD命令可以将一个Redis字符串看作是一个由二进制位组成的数组,并对这个数组中任意偏移进行访问。BITFIELD命令的作用在于它能够将很多小的整数储存到一个长度较大的位图中,又或者将一个非常庞大的键分割为多个较小的键来进行储存,从而非常高效地使用内存,使得Redis能够得到更多不同的应用,特别是在实时分析领域。
说白了就是通过BITFIELD命令我们可以一次性对多个比特位域进行操作。
Stream
Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。
简单来说发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息。
而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失
二、Redis键(key)操作
常用操作及示例
keys *
查看当前库的所有key
示例如下:
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
exists key
检查key是否存在,存在返回1,不存在返回0
示例如下:
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> EXISTS k1
(integer) 1
127.0.0.1:6379> EXISTS k3
(integer) 0
type key
返回key的类型
示例如下:
127.0.0.1:6379> type k1
string
del key
删除一个或多个key
示例如下:
127.0.0.1:6379> keys *
1) "k2"
2) "k1"
127.0.0.1:6379> del k1
(integer) 1
127.0.0.1:6379> keys *
1) "k2"
unlink key
非阻塞删除一个或多个key,并异步释放和key相关的内存;返回1表示删除成功,返回0表示删除失败
示例如下:
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
127.0.0.1:6379> unlink k1
(integer) 1
127.0.0.1:6379> keys *
1) "k2"
ttl key
获取key的剩余过期时间,单位为秒;-1表示永不过期,-2表示已过期
示例如下:
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> ttl k1
(integer) -1
127.0.0.1:6379> expire k1 10 # 设置过期时间为10s
(integer) 1
127.0.0.1:6379> ttl k1
(integer) 5
127.0.0.1:6379> ttl k1
(integer) -2
expire key seconds
设置key的过期时间,单位为秒;返回1表示设置成功,返回0表示设置失败
自Redis 7.0,
expire
支持如下参数:
- NX:只有当key没有设置过期时间,才会执行命令(已经设置过的,不能再设置)
- XX :只有当key有过期时间,才会执行命令设置(没有设置过的,不能设置)
- GT :只有当新的过期时间大于当前过期时间时,才会设置(只会增加过期时间)
- LT :只有当新的过期时间大于当前过期时间时,才会设置(只会减少过期时间)
可选参数这里先不做演示,有兴趣的小伙伴可以自己去尝试。
示例如下:
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> ttl k1
(integer) -1
127.0.0.1:6379> expire k1 10 # 设置过期时间为10s
(integer) 1 # 1表示成功,0表示失败
127.0.0.1:6379> ttl k1
(integer) 5
127.0.0.1:6379> ttl k1
(integer) -2
Redis 的过期时间设置有四种形式:
-
EXPIRE 秒——设置指定的过期时间(秒),表示的是时间间隔。
-
PEXPIRE 毫秒——设置指定的过期时间,以毫秒为单位,表示的是时间间隔。
-
EXPIREAT 时间戳-秒——设置指定的 Key 过期的 Unix 时间,单位为秒,表示的是时间/时刻。
-
PEXPIREAT 时间戳-毫秒——设置指定的 Key 到期的 Unix 时间,以毫秒为单位,表示的是时间/时刻。
move key dbindex
将当前数据库的key移动到给定的数据库dbindex(0~15)。
Redis支持多个数据库,每个数据库都是一个独立的键值空间,这意味着同一个Redis实例中的不同数据库可以拥有相同的key。在某些情况下,我们可能需要将一个key从一个数据库移动到另一个数据库。
示例如下:
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
127.0.0.1:6379> move k1 13
(integer) 1
select dbindex
切换到指定的数据库dbindex(0~15),默认为0。
示例如下:
127.0.0.1:6379> select 13
OK
127.0.0.1:6379[13]> keys *
1) "k1"
127.0.0.1:6379[13]> select 0
OK
127.0.0.1:6379> keys *
1) "k2"
dbsize
返回当前数据库的key的总数
示例如下:
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
127.0.0.1:6379> dbsize
(integer) 2
127.0.0.1:6379> select 13
OK
127.0.0.1:6379[13]> keys *
1) "k1"
127.0.0.1:6379[13]> dbsize
(integer) 1
flushdb
删除当前数据库中的所有Key,不会影响其他库
示例如下:
127.0.0.1:6379[13]> keys *
1) "k1"
127.0.0.1:6379[13]> flushdb
OK
127.0.0.1:6379[13]> keys *
(empty array)
127.0.0.1:6379[13]> select 0 # 不影响其他库
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
flushall
删除所有数据库中的所有Key
示例如下:
127.0.0.1:6379[13]> select 0
OK
127.0.0.1:6379> keys *
1) "k1"
2) "k2"
127.0.0.1:6379> select 13
OK
127.0.0.1:6379[13]> keys *
1) "k3"
2) "k4"
127.0.0.1:6379[13]> flushall
OK
127.0.0.1:6379[13]> keys *
(empty array)
127.0.0.1:6379[13]> select 0 # 0和13号数据库中的数据都被清除了
OK
127.0.0.1:6379> keys *
(empty array)
常用操作汇总
命令 | 描述 |
---|---|
keys * | 查看当前库的所有key |
exists key | 检查key是否存在,存在返回1,不存在返回0 |
type key | 返回key的类型 |
del key | 删除一个或多个key |
unlink key | 删除一个或多个key,并异步释放和key相关的内存 |
ttl key | 获取key的剩余过期时间,单位为秒;-1表示永不过期,-2表示已过期。 |
expire key seconds | 设置key的过期时间,单位为秒 |
move key dbindex | 将当前数据库的key移动到给定的数据库dbindex |
select dbindex | 切换到指定的数据库dbindex |
dbsize | 返回当前数据库的key的总数 |
flushdb | 删除当前数据库中的所有Key |
flushall | 删除所有数据库中的所有Key |
这里补充一点,Redis中的操作一般是1
代表操作执行成功,0
代表操作执行失败。
总结
在本文中,我们对Redis的键值存储进行了全面的概述和介绍。首先,我们了解了Redis的五大基本数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)和Zset(有序集合),并探讨了它们各自的特点和用法。随后,我们介绍了五种扩展数据类型:BitMap、HyperLogLog、GEO、BitField和Stream,以及它们在实际应用中的用途和优势。
在键(key)操作方面,我们涵盖了常用的操作,包括查看、检查、删除、移动、切换数据库以及设置过期时间等。这些操作丰富了我们对Redis数据管理的理解,使我们能够更有效地管理和操作Redis中的数据。
通过本文的学习,读者可以更加深入地了解Redis的键值存储特性,为其在实际应用中的使用提供了更多的参考和指导。Redis作为一款高性能的键值存储数据库,在各种场景下都具有广泛的应用前景,希望本文能为读者在Redis的学习和应用上提供一些帮助和启发。
如果讲解有不对之处还请指正,我会尽快修改,多谢大家的包容。
如果大家喜欢这个系列,还请大家多多支持啦😋!
如果这篇文章有帮到你,还请给我一个大拇指
👍和小星星
⭐️支持一下白晨吧!喜欢白晨【Redis】系列的话,不如关注
👀白晨,以便看到最新更新哟!!!
相关文章:

【Redis】Redis键值存储
大家好,我是白晨,一个不是很能熬夜,但是也想日更的人。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!💪💪💪…...

C++系统编程篇——Linux初识(系统安装、权限管理,权限设置)
(1)linux系统的安装 双系统---不推荐虚拟机centos镜像(可以使用)云服务器/轻量级云服务器(强烈推荐) ①云服务器(用xshell连接) ssh root公网IP 然后输入password ①添加用户: addus…...

No Cortex-M SW Device Found
将DIO和CLK管脚调换一下...

提升写作效率的秘密武器:一个资深编辑的AI写作体验
有句话说:“写作是一项你坐在打字机前流血的工作。”而如今,各类生成式软件的涌现似乎打破了写作这一古老的艺术形式壁垒。过去,作家们独自在书桌前冥思苦想,如今,一款名为“玲珑AI工具”的ai写作助手正悄然改变着文案写作行业的创作生态,成为提升写作效率的秘密武器。 在传统…...

Python sort() 和 sorted() 的区别应用实例详解
大家好,今天针对 Python 中 sort() 和 sorted() 之间的区别,来一个实例详细解读。sort — 顾名思义就是排序的意思,它可以接收的对象为可迭代的数据类型。今天以列表为例子演示两者的不同点、相同点,以及其中一些常用的高级参数使…...

七、Redis三种高级数据结构-HyperLogLog
Redis HyperLogLog是用来做基数统计的算法,HyperLogLog在优点是,在输入的元素的数量或者体积非常大时,计算基数占用的空间总是固定的、并且非常小。在Redis里每个HyperLogLog键只需花费12KB内存,就可以计算接近 264 个元素的基数。…...

2024年【金属非金属矿山(露天矿山)安全管理人员】模拟考试题库及金属非金属矿山(露天矿山)安全管理人员作业模拟考试
题库来源:安全生产模拟考试一点通公众号小程序 金属非金属矿山(露天矿山)安全管理人员模拟考试题库参考答案及金属非金属矿山(露天矿山)安全管理人员考试试题解析是安全生产模拟考试一点通题库老师及金属非金属矿山&a…...

网站DDoS攻击应对策略:全面防护与恢复指南
随着互联网的发展,网络安全问题日益凸显,其中DDoS(分布式拒绝服务)攻击成为了网站安全的主要威胁之一。当网站遭受DDoS攻击时,可能会面临服务中断、性能下降、数据泄露等严重后果。因此,了解并掌握DDoS攻击…...

线性/非线性最小二乘 与 牛顿/高斯牛顿/LM 原理及算法
最小二乘分为线性最小二乘和非线性最小二乘 最小二乘目标函数都是min ||f(x)||2 若f(x) ax b,就是线性最小二乘;若f(x) ax2 b / ax2 bx 之类的,就是非线性最小二乘; 1. 求解线性最小二乘 【参考】 2. 求解非线性最小二乘…...

mysqldump: Error 2013 导致mysql停止运行
https://www.cnblogs.com/DataArt/p/10173957.html 1 查询表大小 SELECT table_name AS "表名", round(((data_length index_length) / 1024 / 1024), 2) AS "大小(MB)" FROM information_schema.tables WHERE table_schema your_database_name AND …...

2023年数维杯国际大学生数学建模挑战赛D题洗衣房清洁计算解题全过程论文及程序
2023年数维杯国际大学生数学建模挑战赛 D题 洗衣房清洁计算 原题再现: 洗衣房清洁是人们每天都要做的事情。洗衣粉的去污作用来源于一些表面活性剂。它们可以增加水的渗透性,并利用分子间静电排斥机制去除污垢颗粒。由于表面活性剂分子的存在ÿ…...

python 两种colorbar 最大最小和分类的绘制
1 colorbar 按照自定义的最值绘制 归一化方法使用Normalize(vmin0, vmax40.0) import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt import matplotlib.cm as cm import matplotlib.colors as mcolors from matplotlib import rcParams from matplot…...

Linux-基础IO
🌎Linux基础IO 文章目录: Linux基础IO C语言中IO交互 常用C接口 fopen fputs fwrite fgets 当前路径 三个文件流 系统文件IO open函数 …...

202006青少年软件编程(Python)等级考试试卷(二级)
第 1 题 【单选题】 以下程序的运行结果是?( ) l ["兰溪","金华","武义","永康","磐安","东阳","义乌","浦江"]for s in l:if"义"in s:print(…...

【LeetCode】每日一题:2244.完成所有任务需要的最少轮数
给你一个下标从 0 开始的整数数组 tasks ,其中 tasks[i] 表示任务的难度级别。在每一轮中,你可以完成 2 个或者 3 个 相同难度级别 的任务。 返回完成所有任务需要的 最少 轮数,如果无法完成所有任务,返回 -1 。 英文原题…...

百度文心一言 java 支持流式输出,Springboot+ sse的demo
参考:GitHub - mmciel/wenxin-api-java: 百度文心一言Java库,支持问答和对话,支持流式输出和同步输出。提供SpringBoot调用样例。提供拓展能力。 1、依赖 <dependency> <groupId>com.baidu.aip</groupId> <artifactId…...

59.基于SSM实现的网上花店系统(项目 + 论文)
项目介绍 本站是一个B/S模式系统,网上花店是在MySQL中建立数据表保存信息,运用SSMVue框架和Java语言编写。并按照软件设计开发流程进行设计实现充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得基于SSM的网…...

什么是字节码?
字节码(Bytecode)是Java虚拟机(JVM)能够理解和执行的中间代码。Java源代码首先编译成字节码文件(扩展名为 .class),而不是直接编译成特定机器的机器码。字节码具有以下特点: 平台无…...

C++ JWT的使用
接入sdk需要使用JWT加密参数,做个记录以备后查 #include <iostream> #include <jwt-cpp/jwt.h> int main() { // 设置JWT的密钥(对于HS256) std::string secret_key "your-256-bit-secret"; // 创建一个新的JW…...

SpringBoot内置插件的使用(jackson和lombok)
文章目录 引言I lombok(自动为属性生成构造器)II jacksonsee also引言 idea正式版2021.2.2 已经捆绑安装jackson和lombok插件 I lombok(自动为属性生成构造器) Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。 htt…...

Franz Electron + React 源码启动运行填坑指南
环境要求 安装miniconda python 环境electron/rebuild用得着,miniconda 默认自带的 python 是 3.11 版本,比较新; 安装virsual studio 2019 要把C桌面相关的都安装了,大概需要20G,不要安装到 C 盘,都安装到…...

网络安全法中关于网络信息的保护和监管,有哪些规定?
网络安全法作为我们数字时代的重要法律保障,对于网络信息的保护和监管有着明确且详细的规定。这些规定不仅体现了国家对于网络安全的重视,也为我们每个人在数字世界中提供了坚实的法律屏障。 首先,我们来看一个关于网络运营者主体责任的案例。…...

前端XHR请求数据
axios封装了XHR(XMLHttpRequest) 效果 项目结构 Jakarta EE9,Web项目。 无额外的maven依赖 1、Web页面 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title&…...

利用香港多IP服务器优化网站访问速度的关键策略?
利用香港多IP服务器优化网站访问速度的关键策略? 随着数字化时代的不断发展,网站的全球访问速度成为企业吸引用户、提升竞争力的重要因素。特别对于跨国企业而言,如何确保全球用户都能享受到稳定快速的访问体验显得尤为重要。在这一背景下,…...

如何快速将视频做成二维码?扫描二维码播放视频的制作方法
视频二维码的用途越来越多,比如常见的有产品展示、企业宣传、教程说明、个人展示等都可以生成二维码,通过扫码在手机或者其他设备上预览内容,从而提升其他人获取视频的速度,实现内容的快速分享。 对于有制作视频二维码需求的小伙…...

使用python开发的闭运算调试器
使用python开发的开运算调试器 简介效果代码 简介 用来调试闭运算效果的小工具,滑动条可以控制滤波核的大小,用来查看不同滤波核下的闭运算效果。 效果 代码 import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayou…...

一例Phorpiex僵尸网络变种的分析
概述 这是一例Phorpiex僵尸网络变种,通过NSIS打包,加载恶意dll(Flaminius.dll),读取dat文件(Preoral.dat),在内存解密并解压缩出一个Pe,创建同名傀儡进程并注入。通过可移动存储介质传播&#…...

PDF文件转换为CAD的方法
有时候我们收到一个PDF格式的设计图纸,但还需要进行编辑或修改时,就必须先将PDF文件转换回CAD格式。分享两个将PDF转换回CAD的方法,一个用到在线网站,一个用到PC软件,大家根据情况选择就可以了。 ☞在线CAD网站转换 …...

Java为什么会成为现在主流的编程语言
Java为什么会成为现在的主流语言 前言一、Java语言概述Java是什么为什么大多数人会选择从事Java为什么从事Java的工作者数量从年递减 二、Java语言的特点简单性面向对象分布式(微服务)健壮性安全性体系结构中立可移植性解释型高性能多线程动态性 三、Jav…...

动手学深度学习16 Pytorch神经网络基础
动手学深度学习16 Pytorch神经网络基础 1. 模型构造2. 参数管理1. state_dict()2. normal_() zeros_()3. xavier初始化共享参数的好处 3. 自定义层4. 读写文件net.eval() 评估模式 QA 1. 模型构造 定义隐藏层–模型结构定义前向函数–模型结构的调用 import torch from torch…...