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

news/2024/9/22 16:01:30/

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设计问题,并采取相应的解决措施。


http://www.ppmy.cn/news/1509128.html

相关文章

两行代码永久关闭windows 更新

两行代码永久关闭windows 更新 date: 2024-8-14 13:27:00 categories: daily 原文链接:两行代码永久关闭windows 更新 导言 windows每次更新都会占用很长时间,而且会多出一堆没用的功能,最气人的时有时候会在你急需使用的时候强制更新. 有时候电脑风扇突然狂转,…

Unity游戏开发002

Unity游戏开发002 目录 第一章:Hello,Unity!第二章:创建一个游戏体 本文目录 Unity游戏开发 Unity游戏开发002目录本文目录前言一、创建一个游戏体1. 编辑器语言设置2. 创建游戏对象的两种方法3. 快速复制和粘贴物体4. 注意事项…

Netty 之 NioEventLoop 源码阅读

文章目录 1. 概述2. EventExecutorGroup实例3. 源码3.1 构造函数3.1.1 DefaultEventLoopGroup 构造函数3.1.2 NioEventLoop 构造函数 3.2 run 方法3.2.1 SelectStrategy3.2.2 select3.2.3 processSelectedKeys3.2.3.1 processSelectedKeysOptimized3.2.3.2 processSelectedKeys…

华为设备支持的逻辑接口类型及逻辑接口配置

逻辑接口简介 逻辑接口是指能够实现数据交换功能但物理上不存在、需要通过配置建立的虚拟接口。 本节主要介绍设备支持的几种类型的逻辑接口。 - Eth-Trunk 接口 具有二层特性和三层特性的逻辑接口,把多个以太网接口在逻辑上等同于一个逻辑接口,比以…

Python 之Scikit-learn(七) -- Scikit-learn 中的不同度量指标详细介绍

Scikit-learn 提供了多种度量指标(metrics)来评估分类、回归、聚类等机器学习任务的性能。这些度量指标有助于判断模型的表现和优化模型参数。下面将详细介绍一些常用的度量指标及其适用情况。 1、分类任务的度量指标 准确率(Accuracy&…

Elasticsearch 文档操作:Spring Boot 集成实践

Elasticsearch(简称 ES)是一个强大的搜索引擎,它提供了丰富的文档操作功能,包括索引、查询、更新和删除等。这些操作是 ES 的核心功能,对于实现高效的数据检索和分析至关重要。本文将通过一个 Spring Boot 应用中的示例…

【C#】中IndexOf的用法

在 C# 中&#xff0c;IndexOf 方法是字符串和列表&#xff08;如 List<T>&#xff09;等数据结构中常用的方法&#xff0c;用于查找指定元素或子串首次出现的位置。以下是针对不同情况使用 IndexOf 的示例。 对于字符串 对于字符串类型&#xff0c;IndexOf 方法返回子字…

超详细!!!electron-vite-vue开发桌面应用之开启调试工具(二)

云风网 云风笔记 云风知识库 上篇已经初步搭建完项目&#xff0c;这次配置比较重要的一部分&#xff0c;那就是开启调试工具&#xff0c;这是开发项目比较重要且基础的部分 vite.config.ts配置更新 main: {// Shortcut of build.lib.entry.entry: electron/main.ts,onstart(ar…