开源一夏 | 23 张图,4500 字从入门到精通解释 Redis
mhr18 2024-11-30 12:29 18 浏览 0 评论
redis 是目前出场率最高的 NoSQL 数据库,同时也是一个开源的数据结构存储系统,在缓存、数据库、消息处理等场景使用的非常多,本文瑞哥就带着大家用一篇文章入门这个强大的开源数据库——Redis。
让我们直接开始!
什么是 Redis?
redis 的英文全称为Remote Dictionary Serve,翻译成中文就是远程字典服务器。Redis 的核心是一种内存数据存储,可用作高性能数据库、缓存和消息代理,它非常适合实时数据处理。
Redis 是用 ANSI C 语言编写的,它可以在大多数 POSIX 系统中运行,例如 BSD、Linux、OS X,而无需任何外部依赖,OS X 和 Linux 被认为是 Redis 开发和测试最多的两个操作系统。
Redis 通常被称为数据结构服务器,因为它的核心数据类型类似于字符串、列表、字典(或哈希)、集合和排序集合等编程语言中的数据类型。稍微新版的 Redis 还有近似计数、地理定位和流处理等高级功能。
Redis 将数据存储在内存中,默认情况下具有周期性磁盘持久性,由于 Redis 将数据持久化到磁盘,因此它可以用作许多用例的经典数据库以及缓存。
Redis 安装
redis 的官网有 redis 安装的详细说明,包括有:
- Linux 系统安装
- macOS 系统安装
- Windows 系统安装
网址:
https://redis.io/docs/getting-started/installation/
大家可以根据自己的系统进行选择安装。
Redis 基础命令
Redis 安装好了,需要一些基础的命令对 redis 进行管理,比如启动 redis、关闭 redis 等。
Windows
在 Windows 安装完 Redis 后,只需要双击redis-server.exe即可启动 redis。
windows 没啥好讲的,如果是开发或者生产环境,几乎没人会在 windows 上部署 redis,bug 简直不是一般的多。
Linux
这个还得看你安装的方式。
- 如果是直接解压型的安装,那么启动 redis 的时候,假设你已经进入 redis 目录下的 sbin 目录,那么启动 redis 就是:
./redis-server
停止 redis 有好多种办法,比如通过直接杀死进程的方式:
查询 redis-server 的进程 ID:
ps aux | grep redis-server
杀死 redis-server 进程:
kill -9 processid
也可以通过 redis-cli 命令进行停止:
redis-cli shutdown
- 如果你是 services command 用户,那么启动 redis 可以使用如下命令:
service redis-server start
停止 redis:
service redis-server stop
重启 redis:
service redis-server restart
- 如果你是 systemctl 命令用户,比如 Ubuntu、CentOS、RHEL 等
启动 redis:
systemctl start redis
停止 redis:
systemctl stop redis
重启 redis:
systemctl restart redis
macOS
启动 redis:
brew services start redis
停止 redis:
brew services stop redis
重启 redis:
brew services restart redis
Redis 数据类型?
redis 一般就是五大类型:
但是随着数据量的激增,加上场景定制化越来越多,redis 的数据结构也随之丰富起来,目前 redis 支持的所有类型如下:
下面我们来一一介绍一下。
字符串 Strings
Strings 是最基本的一种 Redis 数据类型,被认为是二进制安全的,这意味着它们可以包含任何类型的数据,例如 JPEG 格式的图像,最多可以保存 512MB 的值。
列表 Lists
列表其实就是按插入顺序排序的字符串列表,新的元素过来的时候,会将元素推到列表的左侧或右侧。
- LPUSH 命令:将元素推到列表的左侧
- RPUSH 命令:将元素推到列表的右侧
集合 Sets
集合类似于列表,但集合不能包含重复值并且未排序,集合可以使用并集、交集和减法。
哈希 Hashes
Hashes 是表示对象的最重要的数据类型,它们是 string 值和字段之间的映射。
哈希内部实现结构也与 Java 的 HashMap 一致,同样是数组+链表的二维结构,当数组的散列元素串联时,会使用数组第一维的碰撞位置。
哈希可以容纳多达 40 亿个字段,因此,哈希为单个 Redis 实例提供了一种有效的方式来保存大量对象并对其进行操作。
有序集合 Sorted sets
集合也可以有序的,不过有序的集合称作有序集合,按进行分数排,在排序集中,分数可以重复。
流 Streams
Streams 是一种简单但用途广泛且功能强大的数据结构,Streams 是 Redis 5.0 版本的内置类型,可以帮助消除日志数据结构的限制,广泛应用于实时消息传递 (RTM)、消息代理等。
地理空间 Geospatial
Redis 中的地理空间数据以经度和纬度表示,Redis GeoSpatial 数据集实际上只是 Redis 中的 Sorted Sets。
Geospatial 有两个特别重要的命令:
- GEOADD:将地理空间信息添加到特定键
- GEODIST:查找两个 key 之间的距离
超级日志 HyperLogLog
HyperLogLog 是一种概率数据结构,用于计算唯一值,这些值可以是任何值:例如,网站访问者的 IP 地址、搜索词或电子邮件地址
以精确的精度计算唯一值需要与唯一值的数量成比例的内存量,HyperLogLog 通过允许用内存消耗换取精度来解决这个问题。
HyperLogLogs 从 2.8.9 版本开始在 Redis 中可用,是 Redis 一种高级数据结构。Redis HyperLogLog 最多消耗 12 KB 的内存,并产生标准误差为 0.81% 的近似值,12 KB 不包括存储实际密钥所需的字节。
位图 Bitmaps
位图或位集是一个由 0 和 1 组成的数组,位集中的位可以设置为 0 或 1,并且数组中的每个位置称为偏移量。诸如逻辑与、或、异或等操作。
Bitmap 不是 Redis 中的原生数据类型,它的底层实现是基于字符串数据类型的,它是一组基于 String 数据类型的功能,理解位图的最简单方法是将其视为位数组,我们称 Redis 位图中的数组索引为“偏移”。
位域 Bitfields
BITFIELD 可以在单个命令调用中对多个位字段进行操作,它需要一个操作列表来执行并返回一个响应数组,其中每个数组对应于参数列表中的相应操作。
redis 持久化
Redis 是一个内存存储,这意味着它的所有数据都存储在服务器 RAM 中,并且只有在服务器运行时才可用,这种操作方式的缺点是 RAM 是易失性的,如果 Redis 进程或其主机发生事故,您可能会遭受数据丢失。为了防止重要数据丢失,Redis 支持两种主要的持久化模式:RDB 和 AOF。
RDB
RDB,英文全称:Redis DataBase。
每隔一段时间,将内存中的数据作为快照写入磁盘上的临时文件,恢复时将快照文件读入内存。如果机器停机并重新启动,内存中将没有数据,再次启动 redis 后,就会恢复。
重要命令
- save <seconds> <changes>:保存数据到磁盘,seconds 为秒数,changes 为操作数,比如save 10 2就代表在 10 秒内操作 2 次。
- stop-writes-on-bgsave-error <yes|no>:默认情况下,如果启用 RDB 快照并且最近的后台保存失败,Redis 将停止接受写入。这将给用户一种感觉:数据没有正确地保存在磁盘上,如果后台保存过程将再次开始工作,Redis 将自动再次允许写入。
- rdbcompression <yes|no>:转储 .rdb 数据库时使用 LZF 压缩字符串对象。
- dbfilename <name>:转储数据库的文件名(默认 dump.rdb)。
RDB 优势
- 每隔一段时间备份一次,完全备份
- 容灾简单,可远程传输
- RDB 最大限度地提高了 Redis 的性能
- 文件较大时重启和恢复速度要块
RDB 缺点
- 如果发生故障,最后的备份数据可能会丢失,无法处理实时备份
- RDB 需要经常 fork() 以便使用子进程在磁盘上持久化,增加 CPU 的负担
AOF
AOF,英文全称:Append Only File。
RDB 会丢失上次备份的 RDB 文件,如果整体数据完整性要求不高还可以,但是如果追求数据完整性,就要考虑使用 AOF 了。
- 用户请求的写操作以日志的形式记录下来,不记录读取操作,因为存储了写入操作。
- 文件被追加而不是修改
- redis 的 aof 恢复其实就是从头到尾对附加文件进行读写
重要命令
- appendonly <yes|no>:是否应打开 AOF 模式,默认是 RDB。
- appendfilename <name>:仅附加文件的名称(默认值:“appendonly.aof”)
- appendfsync <mode>:持久化策略,一般有三种:no、always、everysec
AOF 写入策略
AOF 支持三种写入策略:
- always:每次将新命令附加到 AOF 时,速度慢,但是最安全
- everysec:每秒一次,也挺快的快(在 2.4 中可能与快照一样快),如果发生灾难,您可能会丢失 1 秒的数据。
- no:将写入策略权交给操作系统,速度块,但是不安全。
建议策略是 everysec,因为它既非常快又非常安全。
AOF 重写
AOF 持久化是通过存储执行的写命令来记录数据库状态的,随着服务器运行时间越来越长,AOF 文件的内容会越来越大,如果放任不管,一个过大的 AOF 文件很可能会对 Redi 服务器甚至整个主机造成影响计算机。
AOF 文件越大,使用该 AOF 文件执行数据恢复所需的时间就越多。
举个例子,在某段时间内 redis 执行了如下操作:
redis> RPUSH list "1" "2" // ["1","2"]
(integer) 2
redis> RPUSH list "3" "4" // ["1","2","3","4"]
(integer) 2
redis> RPUSH list "5" "6" "7" // ["1","2","3","4","5","6","7"]
(integer) 3
上面的三个命令浓缩了 redis 的重复操作,其实三个命令都是朝某个 list 键中添加新元素,现在是 3 个命令,假如有 300 个这样的命令呢?
所以当 AOF 太大时,Redis 会简单地将它从头开始重写到一个临时文件中。重写不是通过读取旧的来执行,而是直接访问内存中的数据,这样 Redis 可以创建可能生成的最短 AOF,并且在写入新的时不需要读取磁盘访问。
重写结束后,临时文件会在磁盘上与 fsync 同步,并用于覆盖旧的 AOF 文件。
那么经过重写后,上面三个命令可以直接合并为一条命令:
redis> RPUSH list "1" "2" "3" "4" "5" "6" "7"
AOF 优势
- AOF 更耐用,可以在几秒钟内完成备份
- 当数据过大时,redis 可以在后台自动重写 AOF,节省空间
- AOF 实时性比较好,并且支持配置写入策略
AOF 缺点
- AOF 文件一般大于 RDB 的文件
- 即使 AOF 有写入策略,但是本质上速度还是慢于 RDB
- 至于网上博客一直说的 bug 和易于攻击的点,确实存在,但是极少遇到
如何从 RDB 迁移到 AOF?
由于遗留原因、特定场景使用了默认了持久化策略:RDB,现在想从 RDB 迁移到 AOF,这个时候应该怎么做?
这种情况,首先要确定的是需要重启 redis 服务器。
迁移步骤:
- 创建现有 RDB 备份文件的副本
- 从 Redis 客户端触发命令bgrewriteaof
- 编辑配置文件 redis.conf 启用 AOF 持久性:appendonly yes
- 重启 Redis 服务器
RDB+AOF 组合持久化
重写 AOF 指令可以大大减少命令的数量,但是,Redis 需要在启动时执行才能恢复其先前的状态,而且它仍然不如 RDB 紧凑,所以假如 RDB+AOF 组合会极大加快日志压缩和恢复。
配置也非常简单:
aof-use-rdb-preamble yes
启用后,appendonly.aof 文件将以“RDB preamble”为前缀,这样的话 redis 将记录每个写入操作,然后在指定的时间间隔执行快照,redis 启动时,会使用 AOF 文件而不是 RDB 来重构数据,因为它保证是最完整的。
启用 aof-use-rdb-preamble,可以获得了 RDB 带来的许多好处,也能确保更好的持久性。
redis 命令
redis 命令其实是跟 redis 的类型相关联的,每个类型包含了若干个命令,由于命令实在有点多,所以我这边不做具体解释,但是我教大家如何去查询你要的命令,并且熟能生巧。
命令列表网站
这里首先给大家安利一个 redis 的命令网站,网址为:
https://redis.io/commands/
我们看到该界面包含了 redis 所有的命令列表,你可以有几种筛选策略:
- 搜索框直接搜索:这种情况一般是你知道某个命令,但是不会用。
- 根据字母快速模糊搜索
- 根据类型进行列举
前两个没啥要说的,我们来看下根据类型列举:
比如我们想要看看字符串类型包含了哪些命令:
可以清晰的看到字符串相关的命令就那么多,一共 22 个,其实也不多,常用的也就那几个,比如 set、get、mset、mget、setnx 等。
每个命令副标题都是对这个命令的简单介绍,我们拿 set 举个例子:
这个 set 的简单介绍就是:设置字符串类型的 key value。
我们点进去,就能看到这个命令的详细介绍:
主要有:
- Syntax:语法
- Options:选项
- Return:返回
- Examples:例子
- Patterns:模式
- History:历史
一般我们快速看的话就看语法和例子就可以了,你如果想特别精通的话,那就每个都看一下,不过我认为没有那个必要。
那么其他命令的使用和 string 的 set 一样,大家要举一反三,因为命令的使用是根据场景来的,每一个命令都非常重要,都有它的价值。
Redis 的使用场景
1、缓存
缓存是存储数据的临时存储,以便将来可以更快地访问数据。所以,缓存就是在 Cache 中存储数据的过程。Redis 可以实现高可用性内存缓存以减少磁盘或 SSD 的数据访问延迟、高吞吐量并减轻数据库和应用程序负载。
一般情况下网页缓存、数据库查询结果缓存、持久会话缓存和常用对象(如图像、文件和元数据)的缓存都会有 redis 的影子。
2、排行榜/计数
redis 构建实时排行榜和计数,可以通过集合和有序集合很好的实现,集合可以提供元素的唯一性,有序集合还有分数的概念,可以对分数进行排序。
计数的话像文章阅读数、微博点赞数都是 redis 可以轻松实现的。
3、分布式锁
字符串类型的 setnx 方法只有在不存在时才能添加成功,返回 true,这种功能可以应用于分布式锁
4、消息的发布/订阅
Pub/Sub 消息传递允许将消息传递到通道,并允许该通道的所有订阅者接收该消息。发布订阅的方案有很多,redis 也可以很轻松实现。
5、地理空间
这个功能对于应 redis 的类型:Geospatial。对于处理地理信息非常有用,而且提供的功能足够业务使用,非常赞。
除了以上几种用途,还有实时分析、媒体流处理、限流、队列等场景的使用。
所以说 redis 真的非常强大!
总结
redis 是一个非常棒的开源 NoSQL 产品,可以毫不夸张的说,世界上每个中大型应用都有 redis 的身影,本文从 redis 的基本介绍、数据类型、持久化、使用场景等几大方面给大家详细的普及了 redis 的技术点,其实 redis 还有好多高级内容,考虑到阅读本文的读者以新手或者对 redis 没有实际应用或者应用比较少的情况,不做高级技术的解释,那么在后续的文章中,我会根据本文的反向酌情进行编写。
希望本文对您有所帮助,最后感谢您的阅读,如果觉得文章对您有帮助,别忘了点赞、收藏哦!有任何问题,欢迎在下方评论区与我讨论!!!
相关推荐
- 【推荐】一个开源免费、AI 驱动的智能数据管理系统,支持多数据库
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!.前言在当今数据驱动的时代,高效、智能地管理数据已成为企业和个人不可或缺的能力。为了满足这一需求,我们推出了这款开...
- Pure Storage推出统一数据管理云平台及新闪存阵列
-
PureStorage公司今日推出企业数据云(EnterpriseDataCloud),称其为组织在混合环境中存储、管理和使用数据方式的全面架构升级。该公司表示,EDC使组织能够在本地、云端和混...
- 对Java学习的10条建议(对java课程的建议)
-
不少Java的初学者一开始都是信心满满准备迎接挑战,但是经过一段时间的学习之后,多少都会碰到各种挫败,以下北风网就总结一些对于初学者非常有用的建议,希望能够给他们解决现实中的问题。Java编程的准备:...
- SQLShift 重大更新:Oracle→PostgreSQL 存储过程转换功能上线!
-
官网:https://sqlshift.cn/6月,SQLShift迎来重大版本更新!作为国内首个支持Oracle->OceanBase存储过程智能转换的工具,SQLShift在过去一...
- JDK21有没有什么稳定、简单又强势的特性?
-
佳未阿里云开发者2025年03月05日08:30浙江阿里妹导读这篇文章主要介绍了Java虚拟线程的发展及其在AJDK中的实现和优化。阅前声明:本文介绍的内容基于AJDK21.0.5[1]以及以上...
- 「松勤软件测试」网站总出现404 bug?总结8个原因,不信解决不了
-
在进行网站测试的时候,有没有碰到过网站崩溃,打不开,出现404错误等各种现象,如果你碰到了,那么恭喜你,你的网站出问题了,是什么原因导致网站出问题呢,根据松勤软件测试的总结如下:01数据库中的表空间不...
- Java面试题及答案最全总结(2025版)
-
大家好,我是Java面试陪考员最近很多小伙伴在忙着找工作,给大家整理了一份非常全面的Java面试题及答案。涉及的内容非常全面,包含:Spring、MySQL、JVM、Redis、Linux、Sprin...
- 数据库日常运维工作内容(数据库日常运维 工作内容)
-
#数据库日常运维工作包括哪些内容?#数据库日常运维工作是一个涵盖多个层面的综合性任务,以下是详细的分类和内容说明:一、数据库运维核心工作监控与告警性能监控:实时监控CPU、内存、I/O、连接数、锁等待...
- 分布式之系统底层原理(上)(底层分布式技术)
-
作者:allanpan,腾讯IEG高级后台工程师导言分布式事务是分布式系统必不可少的组成部分,基本上只要实现一个分布式系统就逃不开对分布式事务的支持。本文从分布式事务这个概念切入,尝试对分布式事务...
- oracle 死锁了怎么办?kill 进程 直接上干货
-
1、查看死锁是否存在selectusername,lockwait,status,machine,programfromv$sessionwheresidin(selectsession...
- SpringBoot 各种分页查询方式详解(全网最全)
-
一、分页查询基础概念与原理1.1什么是分页查询分页查询是指将大量数据分割成多个小块(页)进行展示的技术,它是现代Web应用中必不可少的功能。想象一下你去图书馆找书,如果所有书都堆在一张桌子上,你很难...
- 《战场兄弟》全事件攻略 一般事件合同事件红装及隐藏职业攻略
-
《战场兄弟》全事件攻略,一般事件合同事件红装及隐藏职业攻略。《战场兄弟》事件奖励,事件条件。《战场兄弟》是OverhypeStudios制作发行的一款由xcom和桌游为灵感来源,以中世纪、低魔奇幻为...
- LoadRunner(loadrunner录制不到脚本)
-
一、核心组件与工作流程LoadRunner性能测试工具-并发测试-正版软件下载-使用教程-价格-官方代理商的架构围绕三大核心组件构建,形成完整测试闭环:VirtualUserGenerator(...
- Redis数据类型介绍(redis 数据类型)
-
介绍Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sortedset:有序集合)。1、字符串类型概述1.1、数据类型Redis支持...
- RMAN备份监控及优化总结(rman备份原理)
-
今天主要介绍一下如何对RMAN备份监控及优化,这里就不讲rman备份的一些原理了,仅供参考。一、监控RMAN备份1、确定备份源与备份设备的最大速度从磁盘读的速度和磁带写的带度、备份的速度不可能超出这两...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)