Redis详解


 

Redis 简介

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

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

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

stringlisthashsetsorted 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 都能发挥出色的性能。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stephen Wolfram:那么…ChatGPT 在做什么,为什么它有效呢?

So … What Is ChatGPT Doing, and Why Does It Work? 那么…ChatGPT在做什么,为什么它有效呢? The basic concept of ChatGPT is at some level rather simple. Start from a huge sample of human-created text from the web, books, etc. Then train…

阿里云内容审核服务使用(图片审核)

说明:在项目中,我们经常会对用户上传的内容(如文字、图片)等资源内容进行审核,审核包括两方面,一方面是内容与描述不符,一方面是违反法律法规。本文介绍使用阿里提供的内容审核服务,…

mqttfx连上OneNET生成token时的一大坑,报用户名或密码错误

整个流程如下连接: MQTT.fx和MQTTX 链接ONENET物联网开发平台避坑细节干货。 其中在生成token时,搞了半天在连接后都会报用户名密码错误 最后发现是格式问题,输入所有字符后一定要双击看是否可以全选中,可以全选中说明字符的格式…

第G1周:生成对抗网络(GAN)入门

🍨 本文为[🔗365天深度学习训练营]内部限免文章(版权归 *K同学啊* 所有) 🍖 作者:[K同学啊] 一、理论基础 生成对抗网络(Generative Adversarial Networks, GAN)是近年来深度学习领域…

adb对安卓app进行抓包(ip连接设备)

adb对安卓app进行抓包(ip连接设备) 一,首先将安卓设备的开发者模式打开,提示允许adb调试 二,自己的笔记本要和安卓设备在同一个网段下(同连一个WiFi就可以了) 三,在笔记本上根据i…

【Git】安装以及基本操作

目录 一、初识Git二、 在Linux底下安装Git一)centOS二)Ubuntu 三、 Git基本操作一) 创建本地仓库二)配置本地仓库三)认识工作区、暂存区、版本库四)添加文件五)查看.git文件六)修改文…

【分布式技术专题】RocketMQ延迟消息实现原理和源码分析

痛点背景 业务场景 假设有这么一个需求,用户下单后如果30分钟未支付,则该订单需要被关闭。你会怎么做? 之前方案 最简单的做法,可以服务端启动个定时器,隔个几秒扫描数据库中待支付的订单,如果(当前时间-订…

RocketMQ双主双从同步集群部署

🎈 作者:互联网-小啊宇 🎈 简介: CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作,擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…

Java接口压力测试—如何应对并优化Java接口的压力测试

导言 在如今的互联网时代,Java接口压力测试是评估系统性能和可靠性的关键一环。一旦接口不能承受高并发量,用户体验将受到严重影响,甚至可能导致系统崩溃。因此,了解如何进行有效的Java接口压力测试以及如何优化接口性能至关重要…

Linux系统USB摄像头测试程序(二)_读取配置

1、收先安装gtk3,我的测试机器是ubutn16.04,只要执行下面的安装命令就可以了 apt-get install libgtk-3-dev 使用下列命令验证是否安装好gtk3: pkg-config --cflags --libs gtk-3.0 2、显示结果类似如下: -pthre…

这是一篇关于SQL 脚本表间连接join的可视化说明

使用SQL合并两个数据集可以通过JOINS来完成。JOIN是查询的FROM子句中的SQL指令,用于标识要查询的表以及它们应该如何组合。 主键和外键 通常,在关系数据库中,数据被组织到由属性(列)和记录(行&#xff09…

MySQL运维

日志 错误日志 show VARIABLES like %log_error%;使用 tail -f 错误文件路径 可以查看具体错误二进制日志 show variables like %log_bin%;在my.ini文件下的mysqlID下添加 log_binmysql-bin binlog-formatROW重启就开启binlog了 show VARIABLES like %binlog_format%;mys…

i18n 配置vue项目中英文语言包(中英文转化)

一、实现效果 二、下载插件创建文件夹 2.1 下载cookie来存储 npm install --save js-cookienpm i vue-i18n -S 2.2 封装组件多页面应用 2.3 创建配置语言包字段 三、示例代码 3.1 main.js 引用 i18n.js import i18n from ./lang// 实现语言切换:i18n处理element&#xff0c…

屏蔽socket 实例化时,握手阶段报错信息WebSocket connection to ‘***‘ failed

事情起因是这样的: 我们网站是需要socket链接实行实时推送服务,有恶意竞争对手通过抓包或者断网,获取到了我们的socket链接地址,那么他就可以通过java写一个脚本无限链接这个socket地址。形成dos攻击。使socket服务器资源耗尽&…

【运维】linkis安装dss保姆级教程与踩坑实践

文章目录 一. 安装准备二. 创建用户三. 准备安装包四. 修改配置1. 修改config.sh2. 修改db.sh 五、安装和使用1. 执行安装脚本2. 启动服务3. 查看验证是否成功 六. 报错处理报错一:The user is not logged in报错二:dss接口报错报错三:执行没…

算法随笔:图论问题之割点割边

割点 定义 割点的定义:如果一个点被删除之后会导致整个图不再是一个连通图,那么这个顶点就是这个图的割点。举例: 上图中的点2就是一个割点,如果它被删除,则整个图被分为两个连通分量,不再是一个连通图。…

vue3多条件搜索功能

搜索功能在后台管理页面中非常常见&#xff0c;本篇就着重讲一下vue3-admin-element框架中如何实现一个顶部多条件搜索功能 一、首先需要在vue页面的<template></template>中写入对应的结构 <!-- 搜索 --><div style"display: flex; justify-content…

突破大模型 | Alluxio助力AI大模型训练-成功案例(一)

更多详细内容可见《Alluxio助力AI大模型训练制胜宝典》 【案例一&#xff1a;知乎】多云缓存在知乎的探索:从UnionStore到Alluxio 作者&#xff1a;胡梦宇-知乎大数据基础架构开发工程师&#xff08;内容转载自InfoQ&#xff09; 一、背景 随着云原生技术的飞速发展&#xff…

ApacheCon - 云原生大数据上的 Apache 项目实践

Apache 软件基金会的官方全球系列大会 CommunityOverCode Asia&#xff08;原 ApacheCon Asia&#xff09;首次中国线下峰会将于 2023 年 8 月 18-20 日在北京丽亭华苑酒店举办&#xff0c;大会含 17 个论坛方向、上百个前沿议题。 字节跳动云原生计算团队在此次 CommunityOve…

Java多线程编程中的线程间通信

Java多线程编程中的线程间通信 基本概念&#xff1a; ​ 线程间通信是多线程编程中的一个重要概念&#xff0c;指的是不同线程之间如何协调和交换信息&#xff0c;以达到共同完成任务的目的。 线程间通信的目的 ​ 是确保多个线程能够按照一定的顺序和规则进行协作&#xff…