当前位置: 首页 > news >正文

Redis热点知识速览(redis的数据结构、高性能、持久化、主从复制、集群、缓存淘汰策略、事务、Pub/Sub、锁机制、常见问题等)

Redis是一个开源的、使用内存作为存储的、支持数据结构丰富的NoSQL数据库。它的高性能、灵活性和简单易用使其在许多场景下成为首选的缓存解决方案。以下是Redis的常见和热点知识总结。

数据结构

Redis支持五种基本数据结构:

  1. String:字符串是Redis中最基本的数据类型,用于存储简单的键值对。
  2. List:列表是有序的字符串集合,支持从两端插入、删除和查找元素。
  3. Set:集合是无序的、不重复的字符串集合,支持快速添加、删除和查找元素。
  4. Hash:散列表是键值对的集合,类似于Java中的Map。
  5. Zset:有序集合与普通集合类似,但每个元素都有一个分数,支持按照分数排序。

Redis的高性能

Redis之所以快,是因为它使用了以下几种技术:

  1. 内存存储:所有数据都存储在内存中,读写速度非常快。
  2. 单线程模型:Redis使用单线程来处理所有客户端请求,避免了线程切换的开销。
  3. 非阻塞I/O:Redis使用epoll等机制来实现非阻塞I/O,能够在单线程下处理多个客户端连接。
  4. 数据持久化:Redis提供了两种数据持久化方式:RDB和AOF,确保数据不会因服务器重启而丢失。

Redis的持久化

RDB持久化

RDB持久化是将当前内存中的数据集快照,保存到磁盘文件中。可以设置定时保存策略,也可以手动触发保存操作。

AOF持久化

AOF持久化是将每个写操作都记录到日志文件中,类似于MySQL的binlog。当服务器重启时,会根据日志文件中的命令来重建数据集。

Redis的主从复制

主从复制是Redis的一种高可用性机制,可以将数据从一个主服务器同步到多个从服务器。这样即使主服务器宕机,仍然可以通过从服务器继续提供服务。

全量复制

全量复制是指在初次建立主从关系时,将主服务器的所有数据复制到从服务器上。

增量复制

增量复制是指在全量复制完成后,主服务器只会将新写入的数据同步到从服务器上。

Redis的集群

Redis Cluster是官方提供的去中心化的集群解决方案,支持水平扩展和高可用性。它将数据分散存储在多个节点上,每个节点都可以处理一部分键空间的读写请求。

哈希槽

Redis Cluster使用哈希槽来分配数据到不同的节点上。每个键都被分配到一个固定的哈希槽中。

故障转移

当集群中的某个节点出现故障时,集群会自动将该节点的哈希槽重新分配到其他节点上,保证服务不中断。

Redis的缓存淘汰策略

当Redis内存用完时,需要从现有的数据中选择一些数据进行淘汰。Redis提供了以下几种缓存淘汰策略:

  1. noeviction:不进行淘汰,直到内存不足时才报错。
  2. allkeys-lru:根据所有键的LRU算法淘汰最不经常使用的键。
  3. allkeys-random:随机选择一个键进行淘汰。
  4. volatile-lru:根据设置了过期时间的键的LRU算法淘汰最不经常使用的键。
  5. volatile-random:随机选择一个设置了过期时间的键进行淘汰。
  6. volatile-ttl:淘汰即将过期的键。
  7. allkeys-lfuo:LFU算法淘汰最不经常使用的键。

Redis的事务

Redis的事务(Transaction)是一系列命令的集合,它们要么全部执行,要么都不执行。Redis的事务保证了操作的原子性。

事务的特点

  1. 单独序列化:事务中的命令会被单独序列化,保证原子性。
  2. 不支持回滚:一旦事务执行失败,无法回滚到事务开始前的状态。

Redis的Pub/Sub

Redis的发布订阅(Pub/Sub)功能允许消息的发送者(发布者)和接收者(订阅者)之间进行异步通信。发布者可以向一个或多个频道发送消息,而订阅者可以订阅一个或多个频道来接收消息。

Pub/Sub的优点

  1. 实时性:消息可以实时地从发布者传递到订阅者。
  2. 解耦:发布者和订阅者之间没有直接的依赖关系。

Redis的锁机制

Redis提供了两种锁机制:SETNX和RedLock。

SETNX

SETNX命令可以用来实现分布式锁。它会在设置键的同时检查该键是否存在,如果不存在则设置成功并获取锁。

RedLock

RedLock是一种高可用的分布式锁机制,使用了多个Redis实例来避免单点故障。

Redis的管道和批处理

管道

管道(Pipeline)可以将多个命令打包成一个请求发送到服务器,减少了网络交互的次数,提高了执行效率。

批处理

批处理(Batch)与管道类似,但它不保证命令的原子性。批处理主要用于非原子性操作的性能优化。

Redis的配置和优化

内存管理

  1. maxmemory:设置Redis的最大内存使用量。
  2. maxmemory-policy:设置缓存淘汰策略。

网络优化

  1. tcp-keepalive:设置TCP连接的保活时间,避免长时间空闲的连接被关闭。
  2. timeout:设置客户端与服务器之间的超时时间。

数据压缩

  1. compression:开启数据压缩功能,减少内存和网络带宽的使用。

Redis的常见问题

Redis的并发问题

由于Redis是单线程模型,高并发场景下可能会出现性能瓶颈。解决方法包括使用管道、批处理和分片等。

Redis的内存问题

Redis的内存使用量可能会很大,需要注意内存的管理和优化。可以使用RDB或AOF持久化、设置合理的缓存淘汰策略等来避免内存问题。

Redis的key设计问题

Redis的key设计对性能和可维护性有很大影响。应该避免使用过长的key,使用合理的命名规则和前缀,尽量避免key冲突等。

总结

Redis是一款功能强大、性能卓越的NoSQL数据库,广泛应用于缓存、消息队列、会话管理等场景。了解它的数据结构、持久化、复制、集群、事务、锁机制等特性以及相应的优化方法,可以帮助我们更好地使用Redis,提高系统的性能和可靠性。同时,也需要注意一些常见问题,例如并发问题、内存问题和key设计问题,并采取相应的解决措施。

相关文章:

Redis热点知识速览(redis的数据结构、高性能、持久化、主从复制、集群、缓存淘汰策略、事务、Pub/Sub、锁机制、常见问题等)

Redis是一个开源的、使用内存作为存储的、支持数据结构丰富的NoSQL数据库。它的高性能、灵活性和简单易用使其在许多场景下成为首选的缓存解决方案。以下是Redis的常见和热点知识总结。 数据结构 Redis支持五种基本数据结构: String:字符串是Redis中最…...

【C++浅析】lambda表达式:基本结构 使用示例

基本结构 [捕获列表](参数列表) -> 返回类型 { // 函数体 } 捕获列表 ([ ]): 用于指定外部变量的捕获方式。可以: 通过值捕获:[x]通过引用捕获:[&x]捕获所有变量通过值:[]捕获所有变量通过引用:[&]自…...

利用Redis获取权限的多种方式

更多实战内容,可前往无问社区查看http://www.wwlib.cn/index.php/artread/artid/10333.html Redis是我们在实战中经常接触到的一款数据库,因其在前期打点中被利用后可直接影响服务器安全所以在攻防过程中也备受红队关注,在本文中会重点分享一…...

LeetCode - LCR 146- 螺旋遍历二维数组

LCR 146题 题目描述: 给定一个二维数组 array,请返回「螺旋遍历」该数组的结果。 螺旋遍历:从左上角开始,按照 向右、向下、向左、向上 的顺序 依次 提取元素,然后再进入内部一层重复相同的步骤,直到提取完…...

如何获取Bing站长工具API密钥

Bing站长工具近期悄然上线了网站URL推送功能,似乎有意跟随百度的步伐。这个新功能允许站长通过API向Bing提交链接数据,当然也可以通过Bing站长工具手动提交。 本文将详细介绍如何通过Bing站长工具生成用于网站链接推送的API密钥。 首先,访问…...

NC 调整数组顺序使奇数位于偶数前面(一)

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 输入一个长度…...

Unity异步把图片数据从显存下载到内存(GPU->CPU)

Unity异步把图片数据从显存下载到内存(GPU->CPU) 1.c#核心代码 using System.Collections; using System.Collections.Generic; using Unity.Collections; using UnityEditor.PackageManager.Requests; using UnityEngine; using UnityEngine.Rende…...

【MySQL】C/C++连接MySQL客户端,MySQL函数接口认知,图形化界面进行连接

【MySQL】C/C引入MySQL客户端 安装mysqlclient库mysql接口介绍初始化mysql_init链接数据库mysql_real_connect下发mysql命令mysql_query获取出错信息mysql_error获取执行结果mysql_store_result获取结果行数mysql_num_rows获取结果列数mysql_num_fields判断结果列数mysql_field…...

Wireshark分析工具

简单用例 首先打开软件,左上角点文件,选中要分析的文件列表。 导入用tcpdump抓的包后进行分析,这里要输入过滤条件,对网络包进行一定的过滤处理。(这里172网段是阿里云的地址,用自己写的python2脚本对阿里…...

linux网络配置脚本

通过脚本&#xff0c;设置静态ip以及主机名 因为企业9的网络配置文件和企业7的不一样所以&#xff0c;我们以rhel9和rhel7为例 rhel7/centos7/openeuler #!/bin/bash cat > /etc/sysconfig/network-scripts/ifcfg-$1 << EOF DEVICE$1 ONBOOTyes BOOTPROTOnone IPAD…...

IT管理:我与IT的故事4

首先&#xff0c;宣布一个“坏消息”。最近Herry童鞋的办公邮箱似乎有些“抽抽”了&#xff0c;所以邮件出现了延迟、拒收、被拒收、甚至是石沉大海的现象。为了能够更好的和大家进行沟通&#xff0c;大家如果发邮件到我办公邮箱的时候&#xff0c;若不嫌麻烦&#xff0c;可以抄…...

短链接系统设计方案

背景 需要设计一个短链接系统&#xff0c;主要功能主要有如下几点&#xff1a; ToB&#xff1a; 输入一个长链接&#xff0c;转换成短链接。这个短链接有时效性&#xff0c;可以设定指定过期时间。这个系统的每天会生成千万级别的短链接。数据具备可分析功能。 ToC&#xf…...

Cisco交换机SSH使用RSA公钥免密登录(IOS与Nexus,服务器以RHEL8为例)

目录 需求实验步骤0. 实验环境1. Linux2. CiscoIOS基础设置保存密钥登陆测试 3. CiscoNexus基础配置保存密钥登陆测试 需求 在实际工作中&#xff0c;常会遇到自动化的需求&#xff0c;那么在自动采集、配置等对网络设备的自动化需求中&#xff0c;不可避免的会遇到需要登录-&…...

QT判断操作系统类型和CPU架构

一、判断操作系统类型 1.在.pro文件中判断 macx { # mac only } unix:!macx{ # linux only } win32 { # windows only }2.在代码中判断 可以包含QGlobal头文件&#xff0c;判断预定义宏 #include <QtGlobal> ... #ifdef Q_OS_MAC // mac #endif#ifdef Q_OS_LINUX // …...

input[type=checkbox]勾选框自定义样式

效果图&#xff1a; <template> <input class"rule-checkbox" type"checkbox" checked v-model"isChecked" /> </template><script setup lang"ts"> import { ref } from vue; const isChecked ref(); </…...

鼠害监测系统:科技守护农业安全

在农业生产中&#xff0c;鼠害一直是威胁作物安全、影响产量的重要因素。然而&#xff0c;随着科技的飞速发展&#xff0c;鼠害监测系统正逐步成为现代农业防治鼠害的重要利器。 鼠害监测系统巧妙融合了现代光电、数控及物联网技术&#xff0c;实现了诱鼠、投喂鼠药、鼠情监测及…...

Ubuntu20.04如何安装配置JDK

资源准备 官方下载地址&#xff08;根据自己的系统版本选择不同版本进行下载即可&#xff09;&#xff1a;Java Downloads | Oracle 如无特殊需要可直接移步至下方JDK1.8安装包 https://download.csdn.net/download/qq_43439214/89646731 安装步骤 创建Java目录 sudo mkdir …...

Python3网络爬虫开发实战(9)代理的使用 (需补充代理池的构建)

文章目录 一、代理的设置1.1 urllib 的代理设置1.2 requests 的代理设置1.3 httpx 的代理设置1.4 aiohttp 的代理设置1.4 Selenium 的代理设置1.6 Playwright 的代理设置 二、代理池的构建和维护2.1 代理池的模块构成2.2 代理池的实现 网站为了避免爬虫采集数据可能会采取一些反…...

人际关系中的价值交换原理,在人类社会的复杂网络中,人际关系犹如一根根交织的丝线,将我们彼此紧密相连

人际关系中的价值交换原理,在人类社会的复杂网络中,人际关系犹如一根根交织的丝线,将我们彼此紧密相连。无论是亲情、友情还是爱情,这些关系在表面的情感纽带之下,实则都涉及到价值交换的原理。这种价值交换并非仅仅局限于物质层面,而是涵盖了情感、心理等人类所需的一切…...

西安电子科技大学萌新智慧指南(校区篇)

本次是西安电子科技大学南校区【本部南校区】 刚刚进入校园 相信大家对校园环境还很陌生 接下来就用一张地图 带大家迅速了解一下南校区的构造 宿舍 学生宿舍主要分为三部分 竹园公寓 1-4 海棠公寓 5-10 丁香公寓 11-15 研究生们主要居住在 海棠续建5、丁香14、丁香1…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...