【Redis】Redis安装步骤和特性以及支持的10种数据类型(Redis专栏启动)

news2024/12/28 22:36:46

📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C++及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。

        

📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。

        

🏆 InfoQ签约作者、CSDN专家博主/后端领域优质创作者/内容合伙人、阿里云专家/签约博主、51CTO专家 🏆

        

🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~ 


专栏系列(点击解锁)

学习路线(点击解锁)

知识定位

🔥MySQL从入门到精通🔥

MySQL从入门到精通

全面讲解MySQL知识与实战

🔥计算机底层原理🔥

深入理解计算机系统CSAPP

构件计算机体系和计算机思维

Linux内核源码解析

围绕Linux内核讲解计算机底层原理与并发

🔥数据结构与企业题库精讲🔥

数据结构与企业题库精讲

结合工作经验深入浅出,适合各层次,笔试面试算法题精讲

🔥互联网架构分析与实战🔥

企业系统架构分析实践与落地

行业前沿视角,专注于技术架构升级路线、架构实践

互联网企业防资损实践

金融公司的防资损方法论、代码与实践。

本文目录

本文导读

一、什么是Redis

1、Redis简介

2、Redis特性

二、Redis的安装步骤

1、Docker安装

2、Github编译

3、直接安装

三、Redis 支持的10种数据类型

1、 字符串(Strings)

2、散列(Hashes)

3、列表(Lists)

4、集合(Sets)

5、有序集合(Sorted sets)

6、流(Streams) 

7、位图(Bitmaps)

8、位域(Bitfields)

9、地理空间索引(Geospatial indexes)

10、HyperLogLog

11、Bitmaps、Bitfields、Geospatial、HyperLogLog的底层

四、源码中的7种数据类型

总结


本文导读

本文作为Redis的开篇,简单介绍Redis以及其数据类型、存储、事务、lua、集群等等特性,展开讲解Redis的10中数据类型,并给出源码中的7种数据类型的结构,

所以当回答的时候,建议先说10种,再说7种,并展开官网和源码中的注释进行回答。让面试官看到你的理解和你对基本逻辑的掌握更系统和专业。

一、什么是Redis

1、Redis简介

Redis是一个日志类型的键值存储组件,使用ANSI C语言编写。它的所有数据结构都存储在内存中,可以用作缓存、数据库和消息中间件。

Redis(Remote dictionary server)是远程字典服务器的缩写。一个Redis实例可以有多个存储数据的字典,客户端 select 字典(即DB)来存储数据。

2、Redis特性

Redis有许多数据类型。它有10种核心数据类型,strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes,bitfields, and streams.,每种类型都有一系列操作指令。Redis具有高性能,单线程压测可以达到 10~11w 的 QPS。

Redis中的所有数据读写操作都在内存中执行,但也可以下载所有数据进行持久化。Redis提供了两种持久性方法。一、快照模式,在某一时间将所有数据写入硬盘的RDB文件;二、追加文件模式,即所有写入命令都以追加模式写入硬盘的AOF文件。

Redis从2.6版开始就支持Lua,Lua是一种高效、简洁、可扩展的脚本语言,可以很容易地嵌入到其他语言中。通过在客户端支持定制的Lua脚本,Redis可以减少网络开销,提高处理性能,并整体操作脚本中的多个操作,以实现原子更新。

Redis支持事务。在多指令之后,指定多个操作,然后通过exec指令一次执行它们。如果在执行过程中发生异常,请不要执行所有命令操作。否则,一次按顺序执行所有操作,在执行过程中不会执行其他指令。

Redis还支持 Cluster  集群功能所有 key 都可以通过哈希自动或手动分散到不同的节点。当容量不足时,一些 key 也可以通过 Redis 迁移指令迁移到其他节点。

二、Redis的安装步骤

Redis 需要使用 Linux 环境。如果使用Windows操作系统,可以考虑使用虚拟机。 如果不想安装也可以使用网页版Redis进行学习。

1、Docker安装

# 拉取 Redis 镜像
docker pull redis

# 运行 Redis 容器,6379是Redis端口号
docker run --name myredis -d -p6379:6379 redis

# 执行容器中的 redis-cli,
docker exec -it myredis redis-cli

2、Github编译

# Github 源码编译,下载源码
git clone --branch 5.0 --depth 1 git@github.com:antirez/redis.git
cd redis

# 编译
make
cd src

# 运行服务器,daemonize 表示在后台运行
./redis-server --daemonize yes

# 运行命令行
./redis-cli

3、直接安装

# 直接安装方式
# mac系统
brew install redis

# ubuntu操作系统
apt-get install redis

#运行客户端
redis-cli

三、Redis 支持的10种数据类型

我们经常见到网络上的博客和书籍,资料有很多都比较老久了,很多新的资料也不负责任,这里博主基于官网给出的标准进行讲解。

Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes,bitfields, and streams.

Redis、Redis data types | Redis

1、 字符串(Strings)

Redis 字符串(String)存储字节序列,包括文本、序列化对象和二进制数组。因此,字符串是最基本的 Redis 数据类型。通常用于缓存,但它们支持额外的功能,也可以实现计数器和执行按位运算。默认情况下,单个 Redis 字符串最大为 512 MB。

# 添加缓存:在 Redis 中存储然后检索字符串
> SET user:1 salvatore

# 查询缓存
> GET user:1

# 存储序列化的 JSON 字符串并将其设置为从现在起 100 秒后过期:
> SET tuser:1 "\"{'username': 'priya', 'ticket_id': 321}\"" EX 100

# 增加一个计数器
> INCR tuser:1
1
> INCRBY tuser:1 10
11

SET存储一个字符串值。

SETNX仅当键不存在时才存储字符串值。用于实现锁。

GET检索字符串值。

MGET在单个操作中检索多个字符串值。 

大多数字符串操作的复杂度为 O(1),这意味着它们非常高效。但是 SUBSTR复杂GETRANGE度SETRANGE可能为 O(n)。这些随机访问字符串命令在处理大字符串时可能会导致性能问题。

如果将结构化数据存储为序列化字符串,可能还需要考虑Redis 哈希或RedisJSON。

2、散列(Hashes)

Redis Hashes 是以字段值对集合的形式构造的记录类型。可以使用散列来表示基本对象和存储计数器分组等。大多数Redis哈希命令都是O(1)。

# 将基本用户配置文件表示为散列:
> HSET user:1 username
(integer) 4

> HGET user:1 username
"martina"

> HGETALL user:1
1) "username"

HSET设置哈希上一个或多个字段的值。

HGET返回给定字段的值。

HMGET返回一个或多个给定字段的值。

HINCRBY将给定字段的值增加提供的整数。

例如HKEYS、HVALS和HGETALL 是O(n),其中n是字段值对的数量。每个哈希可以存储多达4294967295(2^32-1)个字段值对,Redis 部署的VM上的总内存的限制。

3、列表(Lists)

Redis Lists 是字符串值的链接列表。Redis列表通常用于:实现堆栈和队列。为后台工作系统构建队列管理。

Redis 列表的最大长度为 2^32 - 1 (4,294,967,295) 个元素。

# 将列表视为队列(先进先出):
> LPUSH user:1 101
(integer) 1
> RPOP user:1
"101"

# 将列表视为堆栈(先进后出):
> LPUSH user:1 101
(integer) 1
> LPOP user:1
"101"

# 检查列表的长度:
> LLEN user:1
(integer) 0

​LPUSH添加一个新元素到列表的头部;RPUSH添加到尾巴。

LPOP从列表的头部移除并返回一个元素;RPOP做同样的事情,但从列表的尾部开始。

LLEN返回列表的长度。

LMOVE原子地将元素从一个列表移动到另一个列表。

LTRIM将列表减少到指定的元素范围。

4、集合(Sets)

Redis Set 是由字符串(成员)组成的无序集合。

可以使用 Redis set 来高效地:跟踪唯一项目(例如,跟踪访问给定博客文章的所有唯一 IP 地址)。表示关系(例如,具有给定角色的所有用户的集合)。执行常见的集合运算,例如交集、并集和差集。

Redis Set 的最大大小为 2^32 - 1 (4,294,967,295) 个成员。

存储用户 1
> SADD user:1
(integer) 1

# 获取用户 1
> SISMEMBER user:1:favorites 742
(integer) 1

# 用户 1 和 2 有没有共同的
> SINTER user:1 user:2
1) "561"

# 统计 user:1
> SCARD user:1
(integer) 3

​SADD将新成员添加到集合中。

SREM从集合中删除指定的成员。

SISMEMBER测试集合成员的字符串。

SINTER返回两个或多个集合共有的成员集合(即交集)。

SCARD返回集合的大小(又名基数)。

大多数集合操作,包括添加、删除和检查项是否为集合成员,都是O(1)。这意味着他们的效率很高。但是,对于具有数十万或更多成员的大型集合,在运行SMEMBERS命令时应谨慎。此命令为O(n),并在单个响应中返回整个集合。作为替代方案,考虑SSCAN,它允许迭代检索集合的所有成员。

5、有序集合(Sorted sets)

Redis Sorted sets是按关联分数排序的唯一字符串(成员)的集合。当多个字符串具有相同的分数时,这些字符串按字典顺序排列。

Sorted sets 的一些用例包括:排行榜。例如,可以使用 Sorted sets 轻松维护大型在线游戏中最高分数的有序列表。费率限制器。可以使用 Sorted sets 来构建滑动窗口速率限制器,以防止过多的API请求。

# 随着玩家分数的变化更新实时排行榜:
> ZADD leaderboard:455 100 user:1
(integer) 1

# 获取 user:1 的分数:
> ZRANGE leaderboard:455 0 2 REV WITHSCORES
1) "user:1"
2) "100"

# 返回用户1的排名,假设排序集按降序排列。
> ZREVRANK leaderboard:455 user:2
(integer) 0

ZADD将新成员和关联的分数添加到已排序的集合中。如果该成员已经存在,则更新分数。

ZRANGE返回在给定范围内排序的有序集合的成员。

ZRANK返回所提供成员的排名,假设排序是按升序排列。

ZREVRANK返回所提供成员的排名,假设 Sorted sets 按降序排列。

大多数有序集合操作的复杂度为 O(log(n)),其中n是成员数。ZRANGE运行具有较大返回值(例如,数万或更多)的命令时要小心。此命令的时间复杂度为 O(log(n) + m),其中m是返回的结果数。Redis Sorted sets 有时用于索引其他 Redis 数据结构。如果需要索引和查询数据,请考虑RediSearch和RedisJSON。

6、流(Streams) 

Redis 5.0 引入了 Stream 数据结构。Redis 流是一种数据结构,其作用类似于仅附加日志。可以使用流实时记录和同时联合事件。

Redis 流用例示例包括:事件溯源(例如,跟踪用户操作、点击等);传感器监控(例如,现场设备的读数);通知(例如,将每个用户的通知记录存储在单独的流中)

Redis 为每个流条目生成一个唯一的 ID。可以使用这些 ID 稍后检索它们的关联条目,或者读取和处理流中的所有后续条目。

Redis 流支持多种修剪策略(以防止流无限制地增长)和不止一种消费策略(请参阅XREAD、XREADGROUP和XRANGE)。

7、位图(Bitmaps)

Bitmap 底层是 String 实现,赋值的每一个 bit 均对应 ASCII 码的二进制位。

Redis Bitmap  位图是字符串数据类型的扩展,可将字符串视为位向量。还可以对一个或多个字符串执行按位运算。

位图用例的一些示例包括:集合成员对应于整数 0-N 的情况的有效集合表示。对象权限,其中每一位代表一个特定的权限,类似于文件系统存储权限的方式。

8、位域(Bitfields)

Redis Bitfields 位域允许设置、递增和获取任意位长度的整数值。可以对从无符号 1 位整数到有符号 63 位整数的任何内容进行操作。

这些值使用二进制编码的 Redis 字符串存储。位域支持原子读、写和递增操作,使它们成为管理计数器和类似数值的不错选择。

9、地理空间索引(Geospatial indexes)

Redis Geospatial indexes 地理空间索引让您可以存储坐标并进行搜索。此数据结构可用于查找给定半径或边界框内的附近点。

10、HyperLogLog

HyperLogLog 底层也是 String 实现,与其说 HyperLogLog 是一种单独的数据类型,倒不如说是对 String 数据类型做 API 封装的应用程序。HyperLogLog 是一种估计集合基数的数据结构。作为一种概率数据结构,HyperLogLog 以完美的准确性换取高效的空间利用。

11、Bitmaps、Bitfields、Geospatial、HyperLogLog的底层

高级数据类型底层数据类型
BitmapString
BitfieldsString
GeospatialindexesSorted Set
HyperLogLogString

四、源码中的7种数据类型

源码内容中,define了7种类型:OBJ_ STRING 0、OBJ_ LIST 1、OBJ_ SET 2、OBJ_ ZSET 3、OBJ_ HASH 4、0BJ_ MODULE 5、OBJ_ STREAM 6。

这个0BJ_ MODULEMODULE对象类型是一种特殊的类型,表示对象,由Redis模块直接管理。这其中就包括了 Bitmaps, Hyperloglogs, Geospatial indexes, Bitfields.

所以当回答的时候,建议先说10种,再说7种,并展开官网和源码中的注释进行回答。让面试官看到你的理解和你对基本逻辑的掌握更系统和专业。

总结

本文作为Redis的开篇,简单介绍Redis以及其数据类型、存储、事务、lua、集群等等特性,展开讲解Redis的10中数据类型,并给出源码中的7种数据类型的结构,

所以当回答的时候,建议先说10种,再说7种,并展开官网和源码中的注释进行回答。让面试官看到你的理解和你对基本逻辑的掌握更系统和专业。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/61117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【20221204】【每日一题】监控二叉树

给定一个二叉树,我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 思路: 1、要尽可能的少安装摄像头,那么摄像头不可能安装在叶子节点上&#xff0c…

TLS及CA证书申请流程

一、概述 SSL 是“Secure Sockets Layer”的缩写,中文叫做“安全套接层”。它是在上世纪90年代中期,由网景公司设计的。 SSL/TLS是同一种协议,只不过是在不同阶段的不同称呼。 SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通…

基于事件驱动的微服务教程

基于事件驱动的微服务教程 使用 Spring Boot、Spring Cloud、Kafka 和 Elasticsearch 掌握具有模式的事件驱动微服务架构 课程英文名:Event-Driven Microservices Spring Boot, Kafka and Elastic 此视频教程共22.0小时,中英双语字幕,画质…

javaee之黑马旅游网1

这是一个用来锻炼javaweb基础知识的项目,先来导入一些我们准备好的文件 下面这些东西是我们项目必备的,我们提前准备好了 ,这个我会上传到我的资源,你们可以自己去下载 利用maven来创建一个项目 选择无骨架创建项目,域…

[附源码]计算机毕业设计小型银行管理系统Springboot程序

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

JavaWeb_第6章_FilterListenerAjax

JavaWeb_第6章_Filter&Listener&Ajax 文章目录JavaWeb_第6章_Filter&Listener&Ajax1,Filter1.1 Filter概述1.2 Filter快速入门1.2.1 开发步骤1.2.2 代码演示1.3 Filter执行流程1.4 Filter拦截路径配置1.5 过滤器链1.5.1 概述1.5.2 代码演示1.5.3 问…

最新版本zookeeper+dubbo-admin

zookeeper 下载地址 :https://archive.apache.org/dist/zookeeper/ 修改conf下zoo_sample.cfg - >zoo.cfgbin下启动zkServer.cmd启动成功 :binding to port 0.0.0.0/0.0.0.0:2181 问题1:zookeper安装 1.去官网下载apache-zookeeper-3.6.2-bin.tar.gz名字中带有…

通用的改进遗传算法求解带约束的优化问题(MATLAB代码)

目录 1 概述 2 遗传算法 2.1 遗传算法的基本概念 2.2 遗传算法的特点 2.3 程序框图 3 运行结果 4 通用的改进遗传算法求解带约束的优化问题(MATLAB代码) 1 概述 遗传算法(Genetic Algorithm,GA)是模拟生物在自然环境中的遗传和进化过程而形成的自…

Spark中宽依赖、窄依赖、Job执行流程

一、宽依赖和窄依赖的定义 【宽依赖:】 宽依赖表示同一个父(上游)RDD 的 Partition 被多个子(下游)RDD 的 Partition 依赖,会引起 Shuffle,总结:宽依赖我们形象的比喻为多生。有shu…

DPD(Digital Pre-Distortion,数字预失真)

什么是DPD 下图中图A是一个理想PA的输入输出关系,它具有线性特性,也就是说输出信号的功率与输入信号功率具有线性关系。但是,现实中使用的PA却不具备理想PA的线性特性。如图C所示,现实PA的输出与输入是非线性关系。为了让非理想P…

HCIA 笔记(1)

一、什么是计算机网络: 二、什么是云技术? 云技术 包含 云存储(百度网盘) 、云计算(分布式计算) 三、计算机技术是怎么实现的? 答:抽象语言(高级语言、汇编语言等&…

数据库、计算机网络,操作系统刷题笔记7

数据库、计算机网络,操作系统刷题笔记7 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle&…

用代码实现全自动化批量下单官网的 iPhone-14-Pro 集成智能下单购物系统,附源码可直接运行

用代码实现全自动化批量下单官网的 iPhone-14-Pro 集成智能下单购物系统,附源码可直接运行。 环境搭建: 1、首先打开谷歌浏览器 输入:chrome://version/ 查看浏览器的版本; 2、打开这个链接: http://chromedriver.storage.googleapis.com/index.html 找到和自己浏览器…

uni-app入门:HBuilderX安装与项目创建

1.HBuilderX下载与安装 2.新建 uni-app 项目并运行到微信开发者工具 1.HBuilderX下载与安装uni-app 官方推荐使用 HBuilderX 来开发 uni-app 类型的项目。 主要好处: 模板丰富 完善的智能提示 一键运行 当然,依然可以根据自己的喜好,选…

(附源码)php小型网络舆情平台设计 毕业设计 252324

小型网络舆情平台设计 摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用php技术建设…

作业11:优化算法比较

目录1. 编程实现图6-1,并观察特征2. 观察梯度方向3. 编写代码实现算法,并可视化轨迹4. 分析上图,说明原理(选做)1) 为什么SGD会走“之字形”?其它算法为什么会比较平滑?2&#xff09…

C#获取子文件夹及其中所有的文件

首先用FolderBrowserDialog获取目标文件夹,如果不要求可视化也可以直接在文本框中输入,从其的SelectedPath属性中就可以获取目标路径。 FolderBrowserDialog folder new FolderBrowserDialog(); folder.ShowDialog(); string Root folder.SelectedPat…

三台机器搭建redis集群过程及问题记录

文章目录1. 前言2. 搭建集群3. 遇到的问题4. 相关文章1. 前言 Redis版本 5.0.4 服务器版本 Linux CentOS 6;CentOS 7;CentOS 9; redis集群需要至少要三个master节点,我们这里搭建三个master节点,并且给每个master再搭…

Spring boot 启动流程及外部化配置

平时我们开发Spring boot 项目的时候,一个SpringBootApplication注解加一个main方法就可以启动服务器运行起来,那它到底是怎么运行起来的呢? Main 入口 我们首先从main方法来看源码,逐步深入: SpringBootApplicatio…

Python实现Stacking回归模型(随机森林回归、极端随机树回归、AdaBoost回归、GBDT回归、决策树回归)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 Stacking通常考虑的是异质弱学习器(不同的学习算法被组合在一起),st…