一文了解 Redis

2023-10-26

51abe6c4922c69e9903623073462df51.gif

Redis 简介

Redis(Remote Dictionary Server)是一个开源的高性能键值对存储数据库,最初由 Salvatore Sanfilippo 开发,它在内存中存储数据,并提供了持久化功能,可以将数据保存到磁盘中,是一种NoSQL(not-only sql,非关系型数据库)的数据库。

它的数据结构十分丰富,基础数据类型包括:string(字符串)、list(列表,双向链表)、hash(散列,键值对集合)、set(集合,不重复)和 sorted set(有序集合),这使得它不仅仅是一个简单的键值存储,还可以用于存储和处理复杂的数据。

数据类型和底层结构的对应关系

string list hash set sorted set
简单动态字符串 双向链表、压缩链表 压缩链表、哈希表 压缩链表、整数数组 压缩链表、跳表

底层实现的时间复杂度

跳表 双向链表 压缩链表 哈希表 整数数组
O(logN) O(N) O(N) O(1) O(N)

可以看出除了 string 类型的底层实现只有一种数据结构,其他四种均有两种底层实现,这四种类型为集合类型,其中一个键对应了一个集合的数据。

Redis 特点/优势

Redis 具备许多特点和优势,所以在大规模应用和高并发场景中得到广泛应用。

  • 丰富的数据结构:Redis 支持多种数据结构,包括字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等。每种数据结构都有丰富的操作命令,可以方便地对数据进行存储和处理。

  • 持久化:Redis 提供了两种持久化方式,RDB(Redis Database)和 AOF(Append Only File)。RDB 是将数据库在指定时间点转储到磁盘的快照持久化方式,AOF 是将写操作追加到文件末尾的日志持久化方式。这两种方式可以根据需求进行选择,保证数据在服务器重启后不会丢失。

  • 高性能:Redis 是一种内存数据库,数据存储在内存中,因此读写速度非常快。它采用单线程模型,避免了多线程带来的竞争问题,使得 Redis 能够充分利用 CPU 和内存资源。

  • 支持事务:Redis 支持事务操作,可以将多个命令打包执行,保证这些命令要么全部执行成功,要么全部失败,保持数据的一致性。虽然 Redis 在单个命令的执行上是原子性的,但是多个命令的组合并不是原子性的,通过事务可以实现一组命令的原子性执行。

  • 高可用与分布式:Redis 支持主从复制、哨兵和集群等功能,可以构建高可用和分布式的 Redis 架构。主从复制可以实现数据的热备份和读写分离,哨兵可以监控 Redis 的健康状态并进行自动故障转移,集群可以将数据分布在多个节点上,提高性能和扩展性。

  • 发布订阅:Redis 支持发布订阅模式,可以实现消息的发布和订阅。发布者将消息发布到指定的频道,订阅者可以订阅感兴趣的频道并接收相应的消息,实现了解耦和实时通信。

Redis 为什么很快

  • 内存存储:Redis将数据存储在内存中,而不是像传统的磁盘存储数据库那样将数据写入到硬盘上。由于内存的读写速度远远快于磁盘,因此Redis能够实现极快的读写性能。

  • 单线程模型:Redis采用单线程模型,每个Redis实例都由单个主线程来处理所有的客户端请求。虽然单线程看起来似乎会限制其性能,但这实际上是Redis的一大优势。单线程模型消除了多线程之间的竞争和锁等开销,使得Redis能够充分利用CPU资源,并且避免了多线程带来的复杂性。此外,Redis在内部使用了I/O多路复用技术(例如epoll或kqueue)来处理并发请求,使得单线程能够同时处理多个客户端连接。

  • 非阻塞IO:Redis使用了非阻塞IO,也就是在读写操作时不会阻塞其他操作。在读取数据时,如果内存中没有所需的数据,Redis会立即返回一个空结果,而不会等待数据从磁盘加载进来。这样即使在高并发情况下,Redis也能够快速地响应请求。

  • 高效的数据结构:Redis支持多种高效的数据结构,比如字符串、哈希、列表、集合、有序集合等。这些数据结构的设计和实现都非常高效,能够在常量时间内完成查找、插入、删除等操作,保证了Redis的高速性能。

  • 异步操作:Redis支持异步操作,比如异步持久化和异步复制。异步操作能够让Redis在进行磁盘持久化和主从复制时不会阻塞其他操作,提高了整体的性能。

  • 优化的网络协议:Redis使用RESP(Redis Serialization Protocol)作为网络协议,RESP是一种简单、高效的二进制协议。RESP协议的设计使得网络传输的数据量尽可能地减少,减少了网络传输的开销,提高了性能。

  • 原子性操作:Redis支持很多原子性操作,比如INCR、DECR、SETNX等。原子性操作能够在一条命令中完成多个操作,而且这些操作是不可中断的,保证了数据的一致性。

应用场景

由于 Redis 具备高性能、丰富的数据结构和多种特性,它的主要应用场景如下:

  • 缓存:作为缓存数据库,Redis 可以将经常访问的数据存储在内存中,避免频繁读写数据库,提高应用的响应速度。缓存可以存储热点数据,减轻后端数据库的压力,提高系统的吞吐量。

  • 计数器:利用 Redis 的原子性操作,可以实现高效的计数器功能,比如网站的点赞、浏览次数等统计功能。由于 Redis 原子性操作的特性,计数器的更新可以并发执行而不会出现竞争问题。

  • 消息队列:Redis 的发布订阅功能和列表数据结构可以实现简单的消息队列,用于解耦系统的各个模块。生产者将消息发布到指定频道,消费者订阅感兴趣的频道并处理消息,实现异步消息传递。

  • 排行榜:使用有序集合数据结构,可以实现排行榜功能,比如游戏中的玩家排名。通过有序集合的分数属性,可以对玩家的得分进行排序和排名,实时显示排行榜。

  • 会话缓存:在 Web 应用中,可以使用 Redis 存储用户的会话数据,实现分布式会话管理。用户登录后,可以将会话数据存储在 Redis 中,从而实现多台服务器之间的会话共享。

如何安装和使用

安装 Redis 非常简单,可以通过官方网站下载源代码进行编译安装,也可以使用包管理工具安装。对于 Ubuntu 系统,可以使用以下命令安装 Redis:

bashCopy codesudo apt update
sudo apt install redis-server

安装完成后,可以使用以下命令启动 Redis 服务:

bashCopy code
sudo systemctl start redis-server

连接 Redis 服务器可以使用 redis-cli 命令行工具:

bashCopy code
redis-cli

5. 常用命令

  • 设置键值对

bashCopy code
SET key value
  • 获取键值对

bashCopy code
GET key
  • 设置过期时间

bashCopy code
SETEX key seconds value
  • 删除键

bashCopy code
DEL key
  • 使用列表

bashCopy codeLPUSH list_key value1 value2 value3   # 从左侧插入元素
RPUSH list_key value4 value5          # 从右侧插入元素
LRANGE list_key 0 -1                  # 获取所有元素

总结

Redis 是一款功能强大且广泛应用于各种场景的内存数据库。它的快速读写性能、丰富的数据结构和多种特性使得它成为处理高速数据和构建高可用、分布式系统的理想选择。无论是作为缓存、计数器、消息队列还是会话缓存,Redis 都能发挥出色的性能。

原文链接:https://mp.weixin.qq.com/s/hdlkr6a6khJ7tnQ7Zqx5Gg

(版权归原作者所有,侵删)

 
 

d1c9613a2526e9b7108e782d7c1a62b7.gif

 
 

10T 技术资源大放送!包括但不限于:Linux、虚拟化、容器、云计算、网络、Python、Go 等。在 开源Linux 公众号内回复 10T,即可免费获取!

有收获,点个在看
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一文了解 Redis 的相关文章

  • Redis部署配置-主从复制

    目前我有两台服务器 我已经部署了基于node js Express JS的Web服务API 我正在使用 Redis 来缓存 JSON 字符串 将此设置部署到生产中的最佳选择是什么 我懂了here https stackoverflow co
  • Laravel - 缓存 Eloquent 并频繁更新

    是否可以对经常修改的对象使用缓存 例如 假设我们有一个 BlogPost 对象 并且有一个经常更改的 num of views 列 以及其他列 是否可以更新缓存和数据库中的 num of views 字段 而不破坏缓存对象并重新创建它 我可
  • connect-redis - 如何保护会话对象免受竞争条件影响

    我使用 nodejs 和 connect redis 来存储会话数据 我将用户数据保存在会话中 并在会话生命周期中使用它 我注意到两个更改会话数据的请求之间可能存在竞争条件 我尝试过使用 redis lock 来锁定会话 但这对我来说有点问
  • Node.js 上通过套接字连接 Redis

    由于共享托管 目标主机上的我的 redis 服务器不在端口上运行 而是在非常特定的套接字上运行 可以通过套接字文件连接到该套接字 只有我的用户可以访问 但是 我还没有找到如何通过套接字指定连接node redis and connect r
  • 如何使用Spring Cache处理redis异常?

    我目前正在开发一个包含 Spring Data Redis 和 Spring Cache 的项目 在spring data redis中 我使用redis模板调用redis 我在 try catch 块中处理 redis 模板抛出的所有异常
  • 为什么Redis中不建议使用KEYS?

    在Redis中 建议不要使用按键命令 https redis io commands KEYS 为什么会这样呢 是因为它的时间复杂度是 O N 吗 或者是别的什么原因 我做了下面的实验来证明KEYS命令有多么危险 当带有 KEYS 的一个命
  • Spring Data Redis - Lettuce连接池设置

    尝试在 spring data redis 环境中设置 Lettuce 连接池 下面是代码 Bean LettuceConnectionFactory redisConnectionFactory GenericObjectPoolConf
  • 从redis中检索大数据集

    一台服务器上的应用程序查询另一台服务器上运行的 Redis 查询的结果数据集约为 250kzrangebyscore objects locations inf inf这在应用程序服务器上似乎需要 40 秒 当使用命令执行时redis cl
  • 如何将 ActionController::Live 与 Resque + Redis 一起使用(用于聊天应用程序)

    我正在尝试为我的 Rails 应用程序构建聊天功能 我在用ActionController Live Puma Resque Redis为了这 所以基本上在这种情况下 redissubscribe方法正在后台运行 使用resque 到目前为
  • redis 阻塞直到 key 存在

    我是 Redis 新手 想知道是否有办法能够await get通过它的键来获取值 直到该键存在 最小代码 async def handler data await self fetch key async def fetch key ret
  • 在 aws-elasticache 上使用 memcached 或 Redis

    我正在 AWS 上开发一个应用程序 并使用 AWS elasticache 进行缓存 我对使用 memcached 或 redis 感到困惑 我阅读了有关 redis 3 0 2 更新以及它现在如何等同于 memchached 的文章 ht
  • Redis SYNC 套接字上的错误情况:连接被拒绝

    在我的 django 应用程序中使用 celery 和 redis 一切都工作正常 直到我遇到了问题 redis 文件的位置已更改 redis 无法访问它们 经过查找 原来这是由于网络随机攻击造成的 需要添加confg 我添加文件后 一段时
  • 如何设置和获取Redis中存储的对象?

    我试图在 redis 中存储一个对象 当我获取该对象时 它似乎不起作用 I tried u User new u name blankman redis set test u x redis get test x name error 我想
  • 如何在Redis中从hmset()切换到hset()?

    我收到弃用警告 即 Redis hmset 已弃用 请改用 Redis hset 但是 hset 采用第三个参数 我不知道是什么name应该是 info users 10 timestamp datetime utcnow strftime
  • Redis Cluster 与 Pub/Sub 中的 ZeroMQ,用于水平扩展的分布式系统

    如果我要设计一个巨大的分布式系统 其吞吐量应随系统中的订阅者数量和通道数量线性扩展 哪个会更好 1 Redis集群 仅适用于Redis 3 0 alpha 如果是集群模式 您可以在一个节点上发布并在另一个完全不同的节点上订阅 消息将传播并到
  • Laravel 所有会话 ID 与 Redis 驱动程序

    在我的应用程序中 我希望允许某些用户能够注销除他 她之外的所有其他用户 当会话驱动程序设置为文件时 我已经完成了此功能 但现在我使用 redis 作为会话驱动程序 并且我无法找到任何方法来列出所有当前会话 就像我在文件时所做的那样司机 问题
  • redis - 使用哈希

    我正在使用 redis 为我的 Web 应用程序实现社交流和通知系统 我是 redis 的新手 我对哈希值及其效率有一些疑问 我读过这篇很棒的文章Instagram 帖子 http instagram engineering tumblr
  • redis dump.rdb / 保存小文件

    Context 我正在使用redis 数据库小于 100 MB 但是 我想进行每日备份 我也在 Ubuntu Server 12 04 上运行 当输入 redis cli save 我不知道 dump rdb 保存到哪里 因为 redis
  • Amazon Elasticache Redis 集群 - 无法获取端点

    我需要获取 Amazon Elasticache 中 Redis 集群的终端节点 以下代码适用于 Memcached 集群 但不适用于 Redis import com amazonaws auth AWSCredentials impor
  • 如何使用 Redis 自动删除与模式匹配的键

    在我的 Redis DB 中 我有很多prefix

随机推荐

  • 单片机软件系统框架和多任务调度

    这里我用的单片机算是中颖的 芯片 UART底层驱动相关函数 UART相关寄存器初始化 void Uart Init void PCON 0x00 选择SSTAT0 SCON 0x50 01000000 方式一 SBRTL u8int SBR
  • 顺序表的C语言实现

    头文件 SeqList h pragma once include
  • 正大国际期货:期货市场到底难在哪儿?

    正大国际金融控股有限公司 简称 正大国际 成立于2019年11月4日 为香港证监会辖下之持牌法团 证监会中央编号 BOP620 从事第2类及第5类受规管活动及期货合约交易及就期货合约提供意见 主要从事商品期货经纪 金融期货经纪业务 致力于提
  • 程序员如何晋级管理层

    在技术领域 程序员们往往是团队中的核心力量 但是 在职场上 技术过硬并不意味着可以永远待在技术岗位上 程序员们很可能在职场中遇到瓶颈 希望获得更高的职位 那么 作为一名程序员 如何晋升到管理层呢 加强团队合作想要晋升管理层 首先需要具备团队
  • hadoop遇到的问题: org.apache.hadoop.ipc.Client: Retrying connect to server异常的解决

    今天在用pig脚本在hadoop运行时 出现如下错误 前提 hadoop能正常启动 pig的参数也正常配置好了 但是运行脚本就出现org apache hadoop ipc Client Retrying connect to server
  • 中国开源走向第二梯队!

    作者 彭慧中 责编 屠敏 出品 CSDN ID CSDNnews 开源已成为迄今为止最先进 最广泛 最活跃的协同创新模式 近年来 中国开源的发展已成为全球最快 中国在国际社区中的贡献度日益提升 在国际开源生态中的影响力日渐增强 在蓬勃发展之
  • 蒙特卡洛量化分析方法

    蒙特卡洛方法主要思想 对于一个随机系统 输出随输入变化是随机的 那么通过重复采样的方法可以得到输出的具体分布 进而再对输出分布形式进行分析 大数定律 当在试验不变的条件下 重复试验多次 随机事件的频率近似于它的概率 将上述思想用于量化分析
  • 常见国内镜像源地址

    常见国内镜像源地址 常见的pip后面的镜像源地址 常见国内镜像源地址 常见的pip后面的镜像源地址 清华大学 https pypi tuna tsinghua edu cn simple 阿里云 http mirrors aliyun co
  • ABAP:ONCHANGEOF的坑

    以下文章来源于ABAPer孙亮 作者孙小亮 ABAPer孙亮 绝对 有用 实用 的ABAP与Excel 原创 干货 不定期发布 可加vx 286503700交流 1 7 背景 由于AT NEW field会判断field和它前面的所有字段
  • 靠营销出圈的拉面说,会是下一个黄太吉吗?

    乘着 宅经济 一人食 的东风 方便速食这一餐饮细分赛道愈发火热 CBNData发布的 2021方便速食行业洞察报告 数据显示 方便速食行业近年来规模增长稳健 预估国内市场规模超2500亿元 而线上市场近一年的增长率更是超过了70 广阔的市场
  • DataGrip汉化设置

    左上角file settings plugins搜chinese如下图搜索结果 选择第二个官方汉化插件安装即可
  • 构造函数的初始化列表

    构造函数初始化列表以一个冒号开始 接着是以逗号分隔的数据成员列表 每个数据成员后面跟一个放在括号中的初始化式 例如 include
  • 【科普】一分钟看懂WINDOWS系统、LINUX系统和苹果操作系统到底有什么区别?

    转自 首先 不管是WINDOWS操作系统 LINUX系统还是苹果操作系统 甚至包括操作系统的鼻祖UNIX操作系统 最早都是用C语言编写的 实际上UNIX操作系统和C语言都是由贝尔实验室的汤普森 Ken Thompson 和丹尼斯 里奇 De
  • RFC文档(中文翻译版本)

    RFC文档官方在线阅读地址 https tools ietf org rfc index 以下是部分中文翻译的文档连接 RFC文档目录 RFC1 主机软件 RFC2 主机软件 RFC3 文档规范 RFC4 网络时间表 RFC6 与 Bob
  • Jmeter导出测试报告

    不管是测接口还是性能 测试完毕之后我们总是希望有所产出 能看的更直观 Jmeter就提供了导出测试报告的功能 一起看看怎么玩 如果细心留意的话 会看到在启动jmeter时 dos窗口会有一行命令 实际上这个命令就阔以帮助我们导出测试报告 我
  • 强制Vue重新渲染组件的最佳方式(亲测完美解决问题)

    有时候 依赖 Vue 响应方式来更新数据是不够的 相反 我们需要手动重新渲染组件来更新数据 或者 我们可能只想抛开当前的DOM 重新开始 那么 如何让Vue以正确的方式重新呈现组件呢 强制 Vue 重新渲染组件的最佳方法是在组件上设置 ke
  • MySQL 使用两种方式清空表,删除表中的所有数据

    假设要删除book表中的所有数据 DELETE FROM book 或 TRUNCATE TABLE book 两者的区别在于 如果book表的主键Id设置为自增的整型 那么 第一次新建一条数据不指定Id Id自动赋值为1 如果使用Dele
  • 刷脸支付项目成本低是创业投资首选

    人工智能技术的改革 还可以说刷脸支付的应用开启了人工智能技术的改革 在以往的人工智能技术的应用而言还不是十分普及 而人工智能技术的在商业化的落地 对于全国店家而言还可以得到广泛的应用 随着各方从业人员的推广以及技术的不断更新 人工智能技术和
  • 打印杨辉三角

    要打印杨辉三角 我们首先要观察杨辉三角中数的规律 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 5 1 如图 我们可以把杨辉三角中前面的空格先省掉 观察数的规律 可以把这些数看做一个二维数组 1 二维数组第一列的
  • 一文了解 Redis

    Redis 简介 Redis Remote Dictionary Server 是一个开源的高性能键值对存储数据库 最初由 Salvatore Sanfilippo 开发 它在内存中存储数据 并提供了持久化功能 可以将数据保存到磁盘中 是一