分布式中间件-redis相关概念介绍

文章目录

    • 什么是redis?
      • 示意图
      • Redis的主要特点
      • Redis的主要用途
      • Redis的工作原理
      • Redis的持久化与备份
    • redis 6.x新增特性
      • 多线程数据加载
      • 客户端缓存
      • 新的 RESP 3 协议支持
      • ACL(Access Control List)功能
      • `新增数据类型`
      • 性能改进
      • 配置文件的改进
      • 其他改进
    • redis数据类型有哪些?
    • redis 部署模式有哪些?
    • redis常见问题
      • 缓存击穿(Cache Stampede)
      • 缓存雪崩(Cache Avalanche)
      • 缓存穿透(Cache Penetration)
      • 数据一致性问题
      • 内存管理问题
      • 并发竞争问题
      • 连接池的使用
    • 其他概念
      • 布隆过滤器
        • 工作原理
        • 特性
        • 应用场景
        • 注意事项
      • 一致性哈希算法
      • 示意图
        • 虚拟节点(Virtual Nodes)
        • 优点
        • 应用场景
      • 实现注意事项
    • 参考文献

什么是redis?

Redis(Remote Dictionary Server)是一个开源的、基于内存的、使用ANSI C语言编写的Key-Value数据库。它支持多种数据结构,并提供丰富的API,使其成为高性能的缓存、消息队列、实时分析等场景的理想选择。以下是关于Redis的详细介绍:

示意图

redis示意图

Redis的主要特点

  • 内存存储:Redis将数据存储在内存中,因此具有非常高的读取和写入性能。
  • 丰富的数据结构:支持字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)、有序集合(Sorted Sets)等数据结构。
  • 持久化机制:支持两种持久化方式:RDB(Redis Database)和AOF(Append Only File)。
  • 分布式支持:通过集群方式支持分布式部署,提供分片、复制等功能。

Redis的主要用途

  • 缓存:Redis非常适合作为缓存系统,可以大幅提高系统的读写性能。
  • 消息队列:支持发布订阅机制,用于解耦系统的不同组件。
  • 分布式锁:提供原子性的操作,确保在分布式环境下对共享资源的互斥访问。
  • 会话存储:用于存储用户会话信息,提高网站的性能和扩展性。

Redis的工作原理

Redis采用单线程模型处理网络IO和键值对读写操作,避免了多线程带来的上下文切换和竞争条件问题。它使用异步I/O和事件驱动模型来提高并发读写的能力。

Redis的持久化与备份

Redis支持两种主要的持久化方式:RDBAOF。RDB通过生成数据快照文件存储到磁盘中,而AOF记录每一条收到的命令,确保数据的可靠性。
通过上述信息,我们可以看出Redis是一个功能强大、性能高、易用的数据存储和缓存解决方案,适用于多种应用场景。

redis 6.x新增特性

Redis 6.x 相对于之前的版本,引入了多项改进和新特性,增强了其性能、安全性以及功能性。以下是 Redis 6.x 中的一些重要新特性:

多线程数据加载

Redis 6.x 引入了一个实验性的多线程数据加载功能。这意味着在 Redis 启动时,可以从磁盘加载数据到内存的过程中利用多线程来加速这一过程。这对于大型数据库的启动时间有显著的改善作用。

客户端缓存

Redis 6.x 增加了客户端缓存的功能,允许客户端在本地缓存一些常用的数据。这样可以减少客户端与服务器之间的往返通信次数,从而减轻服务器的负载,提高访问速度和效率。

新的 RESP 3 协议支持

Redis 6.x 支持了新的 RESP 3 协议,该协议提供了更丰富的数据类型和更好的性能。RESP 3 协议相比之前的 RESP 2 协议,不仅增加了更多的数据类型和命令支持,还优化了数据传输的效率,提高了 Redis 的性能。

ACL(Access Control List)功能

Redis 6.x 引入了 ACL 功能,这是一项重要的安全特性。通过 ACL,管理员可以更精细地控制不同用户的权限,包括可以执行的命令和可以访问的键。这项功能增强了 Redis 的安全性,允许更复杂的访问控制策略。

新增数据类型

  • Bitmaps:虽然不是 Redis 6.x 新增的数据类型,但 Redis 6.x 对 Bitmaps 的支持更加完善,提供了更多针对 Bitmaps 的操作命令,使得在处理位图时更加方便。

性能改进

Redis 6.x 包含了一系列的性能改进,包括对内部数据结构的优化以及对命令处理流程的改进,旨在提高 Redis 的整体性能。

配置文件的改进

Redis 6.x 对配置文件进行了改进,使其更加易于理解和维护。例如,通过将一些默认配置项移到单独的配置文件中,简化了主配置文件的内容。

其他改进

除了上述特性外,Redis 6.x 还包含了一些其他改进,比如对 Lua 脚本的支持进行了增强,提供了更多的内置函数;对监控命令进行了改进,使得监控 Redis 实例的行为变得更加直观;以及其他一些小的特性和错误修复。

总的来说,Redis 6.x 的这些新特性使得 Redis 更加强大、灵活,并且更加适应现代分布式系统的需求。这些改进不仅提升了 Redis 的性能,还增强了其安全性和易用性。

redis数据类型有哪些?

Redis的数据类型主要包括以下几种:

  1. 字符串(String)

    • 最基本的数据类型,可以包含任何数据,如数字、字符串、二进制数据等。
    • 支持的操作包括设置值、获取值、追加、自增/自减等。
    • 应用场景:缓存、计数器、配置信息等。
  2. 哈希(Hash)

    • 哈希是一个键值对的集合,其中键是字符串,值也是字符串。哈希适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去)。
    • 常用命令:HSET, HGET, HGETALL, HDEL, HEXISTS, HINCRBY, HKEYS, HLEN, HMGET, HMSET, HVALS等。
  3. 列表(List)

    • 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到头部(左边)或者尾部(右边)。
    • 常用命令:LPUSH, RPUSH, LPOP, RPOP, LINDEX, LLEN, LRANGE, LINSERT, LREM, LSET等。
  4. 集合(Set)

    • 集合是字符串类型的无序集合。它是通过哈希表实现的,可以做到添加,删除,查找的时间复杂度都是O(1)。
    • 常用命令:SADD, SREM, SMEMBERS, SISMEMBER, SDIFF, SINTER, SUNION, SCARD, SRANDMEMBER等。
  5. 有序集合(Sorted Set)

    • 有序集合和集合相似,但每个字符串元素都会关联一个浮点数类型的分数。元素的分数用来排序,如果两个成员有相同的分数,那么他们的排名按照字典序计算。
    • 常用命令:ZADD, ZREM, ZRANGE, ZREVRANGE, ZINCRBY, ZRANK, ZREVRANK, ZCARD, ZSCORE, ZCOUNT, ZUNIONSTORE, ZINTERSTORE等。
  6. 地理空间(Geospatial)

    • Redis从3.2版本开始增加了对地理空间位置的支持,允许存储地理坐标并执行地理位置查询。
    • 常用命令:GEOADD, GEODIST, GEOHASH, GEOPOS, GEORADIUS, GEORADIUSBYMEMBER等。
  7. HyperLogLog

    • HyperLogLog是一种用于估计集合基数的数据结构,它提供了非常高效的基数估计功能,但会牺牲一定的准确性。
    • 常用命令:PFADD, PFCOUNT, PFMERGE等。
  8. Bitmaps

    • 虽然Redis没有专门的Bitmaps数据类型,但是可以通过使用字符串类型来模拟位图操作。Bitmaps非常适合于处理大量的位级数据,如用户在线状态、日活跃用户统计等。
    • 常用命令:SETBIT, GETBIT, BITCOUNT, BITOP等。

这些复杂数据类型使得Redis能够处理更加丰富的数据操作需求,适用于各种复杂的应用场景。

redis 部署模式有哪些?

  • 单机部署
    单机部署是最简单的部署方式,适合开发测试环境或者负载较低的应用场景。在单机模式下,所有数据都存储在一个节点上,这种方式易于管理和配置。

  • 主从复制(Master-Slave Replication)
    主从复制是提高 Redis 可用性和扩展性的常用方法。在这种架构中,一个或多个从节点(slave)会实时地从主节点(master)复制数据。当主节点出现故障时,可以将其中一个从节点提升为新的主节点,以减少服务中断的时间。此外,从节点也可以用来处理只读请求,以此来分散主节点的压力。

  • 哨兵机制(Sentinel)
    哨兵是 Redis 提供的一种高可用性解决方案。哨兵(sentinel)是一组运行在独立进程中的程序,它们负责监控主从集群中的各个节点状态,在主节点发生故障时自动完成故障转移,即从从节点中选出一个新的主节点,并重新调整客户端的连接。

  • 集群模式(Cluster)
    Redis 集群允许用户水平扩展 Redis 的内存和吞吐量。集群通过分区数据到不同的节点上来实现数据的分布存储,同时支持数据的自动迁移重新平衡。每个节点只负责数据的一个子集,且集群本身支持一定数量的节点故障。需要注意的是,集群模式下的数据操作是分布式的,因此某些命令可能不可用或者行为会有所不同。

redis常见问题

缓存击穿(Cache Stampede)

当缓存中某个热点数据失效的一瞬间,大量的并发请求直接打到数据库上,导致数据库压力过大。解决方法通常是使用互斥锁(Mutex)或者设置一个过期时间很短的临时缓存项来避免这种情况。

缓存雪崩(Cache Avalanche)

如果大量缓存数据在同一时间失效,会导致后端数据库突然承受大量请求,从而引发系统崩溃。为了避免缓存雪崩,可以采取以下措施:

  • 使缓存的过期时间分布开,而不是集中在同一时间段;
  • 使用限流策略,比如漏桶算法或令牌桶算法;
  • 设置热点数据永不过期;
  • 采用双删策略,即数据先删除,然后延迟一段时间后再真正删除。

缓存穿透(Cache Penetration)

缓存穿透指的是查询一个不存在的数据,如果没有处理好,这个查询就会直接到达数据库,如果没有有效拦截机制的话,如果存在恶意攻击或者代码 bug,就可能对数据库造成过大压力。可以通过以下方式解决:

  • 对于不存在的数据也进行缓存,但设置较短的过期时间;
  • 使用布隆过滤器(Bloom Filter)提前过滤掉不存在的数据;
  • 在应用层增加校验,防止恶意攻击。

数据一致性问题

当缓存和数据库中的数据不一致时,可能导致业务逻辑错误。为了保证数据一致性,可以采用以下方法:

  • 双写一致性,即更新缓存和数据库时,保证两者的顺序一致;
  • 缓存击穿和雪崩预防机制;
  • 使用消息队列来异步更新缓存;
  • 利用分布式事务或最终一致性来保证数据一致性。

内存管理问题

Redis 是内存数据库,所以内存管理非常重要。常见的内存管理问题有:

  • 内存溢出:当 Redis 达到最大内存限制时,需要合理配置 Redis 的内存策略(如 LRU 或 LFU),并定期检查和清理不再使用的缓存数据;
  • 内存碎片:长时间运行后可能会产生内存碎片,需要定期进行内存优化或重启 Redis 实例;
  • 内存占用过高:监控内存使用情况,合理设置 key 的过期时间(TTL),定期清理不必要的数据。

并发竞争问题

当多个并发请求试图修改同一个缓存条目时,可能会出现并发竞争的问题。可以使用 Redis 的原子操作(如 INCRDECR)、Lua 脚本或者分布式锁来解决这个问题。

连接池的使用

在高并发场景下,频繁创建和销毁 Redis 连接会造成不必要的性能损耗。使用连接池可以复用连接,减少系统的整体开销。
解决上述问题时,需要根据具体的业务场景和技术栈来综合考虑,确保系统稳定可靠的同时也要兼顾性能和成本。

其他概念

布隆过滤器

布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,它用于判断一个元素是否在一个集合中。布隆过滤器的特点是可以非常快速地检测一个元素是否存在于集合中,但是它的判断不是绝对准确的——可能存在一定的误报率(false positive rate),但是不会有误删(false negative),也就是说,如果布隆过滤器说某个元素不在集合中,那它确实不在;但如果它说某个元素在集合中,那这个判断可能是错误的。

工作原理

布隆过滤器由一个很长的二进制向量(bit array)和一系列随机映射函数(hash functions)组成。当一个元素被加入到过滤器时,它会被 k 个不同的哈希函数处理,每个哈希函数都会给出一个位置,这个位置上的比特位将被设置为 1。当需要查询一个元素是否存在于集合中时,同样的 k 个哈希函数会被应用到该元素上,如果所有的比特位都是 1,那么这个元素“可能”存在于集合中;如果其中任何一个比特位是 0,那么可以确定该元素肯定不在集合中。

特性
  1. 空间效率:相比其他数据结构,布隆过滤器可以使用更少的空间来表示一个集合。
  2. 插入和查询速度快:因为布隆过滤器的主要操作是位操作,所以它的速度非常快。
  3. 误报率:布隆过滤器允许有一定概率的误报,但不会有误删的情况。误报率受滤波器大小、哈希函数的数量以及插入的元素数量的影响。
应用场景

布隆过滤器适用于那些对误报有一定容忍度的应用场景,常见的应用场景包括:

  • 网络爬虫:用来判断网页是否已经被抓取。
  • 数据库系统:在数据库索引中,可以用来判断某条记录是否存在,以减少磁盘 I/O 操作。
  • 缓存系统:如 Redis 中的布隆过滤器插件,用来判断一个键是否存在,以减少不必要的缓存查找。
  • 垃圾邮件过滤:用来标记已知的垃圾邮件地址。
注意事项

使用布隆过滤器时需要注意以下几点:

  • 一旦某个元素被加入到布隆过滤器中,就不能再将其删除,除非重建整个过滤器。
  • 误报率随着加入元素数量的增加而增加,因此需要合理估计最大元素数量和分配足够的空间来保持较低的误报率。
  • 选择合适的哈希函数数目和滤波器大小对于控制误报率至关重要。
    总之,布隆过滤器是一个非常有用的工具,尤其是在需要高效存储和查询大量数据的情况下。但是,在使用时也需要考虑到它的局限性和适用场景。

一致性哈希算法

一致性哈希算法(Consistent Hashing)是一种特殊的哈希算法,设计目的是为了在分布式环境中解决数据分片(sharding)和负载均衡的问题。一致性哈希能够有效地应对节点动态变化的情况,比如节点的添加(scale up)或移除(scale down),并且能够尽量减少数据迁移的成本。这使得一致性哈希非常适合用于构建可伸缩的分布式系统,如缓存系统、负载均衡器、分布式存储等。

示意图

一致性哈希算法#### 工作原理
一致性哈希的基本思想是在一个虚拟的圆环上放置数据节点,并将数据项通过哈希运算映射到这个圆环上。每个节点也被哈希到圆环上的某个位置。数据项存储在它映射到的位置顺时针方向上最近的那个节点上。

  • 具体步骤如下:

    1. 计算节点的哈希值:将每个节点的名字(或其他标识符)通过哈希函数转换成一个整数,然后把这个整数映射到一个固定大小的圆环上。
    2. 计算数据的哈希值:同样地,将每个数据项(key)通过相同的哈希函数转换成一个整数,并映射到圆环上。
    3. 定位数据所在节点:对于每一个数据项,找到它在圆环上顺时针方向上的第一个节点,这个节点就是数据应该存储的地方。
虚拟节点(Virtual Nodes)

为了进一步提高负载均衡的效果,一致性哈希引入了虚拟节点的概念。每个物理节点可以在圆环上占据多个位置,这些位置称为虚拟节点。这样做可以增加哈希环上的节点数量,从而更均匀地分布数据。

优点
  1. 数据迁移最小化:当系统中添加或移除节点时,只有少量的数据需要被重新分布,大多数数据可以保持不变。
  2. 可预测性:即使在节点数量发生变化时,一致性哈希算法也能提供一种相对稳定的数据映射方式。
  3. 负载均衡:通过虚拟节点可以实现更好的负载均衡。
应用场景

一致性哈希算法广泛应用于各种分布式系统中,包括但不限于:

  • 分布式缓存:如 Amazon Dynamo 和 Memcached 都采用了类似的技术。
  • 负载均衡:用于分配请求到不同的服务器。
  • 分布式文件系统:如 Google 的 Bigtable 和 Apache 的 Cassandra。

实现注意事项

虽然一致性哈希具有很多优点,但在实际应用中也需要考虑一些问题,例如:

  • 当节点较少时,哈希环上的分布可能会不均匀,导致某些节点负载过重。
  • 节点的添加或移除仍然会对部分数据造成影响,需要权衡利弊。
  • 选择合适的哈希函数以及合理的虚拟节点数量也是实现过程中需要注意的问题。
    一致性哈希提供了一种优雅的方式来处理分布式系统中的数据分布问题,特别是在需要动态调整节点数量的情况下,能够有效地减少数据迁移带来的开销。

参考文献

  • 如果英文不好,可以点击这里,获得更加详细的说明信息。

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

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

相关文章

实用测评!7种方式将PDF导出为图片,pdf转jpg一键转换!

pdf怎么转换成jpg?pdf是一种通用的便携文件格式之一,而jpg是一种广泛使用的图像格式,平时处理这两种格式文件时,难免会遇到需要将pdf转成jpg格式的情况,例如在学术研究、创意设计、报告提交等领域。 pdf转jpg是一个很常…

应用层协议HTTP介绍

一、HTTP协议介绍 HTTP(HyperText Transfer Protocol,超文本传输协议)是一个至关重要的协议。它定义了客户端(如浏览器)与服务器之间如何通信,以交换或传输超文本。 超文本:视频,音…

在家找不到手机?除了语音助手,还可以用远程控制!

总说手机有定位功能,但手机定位一般只能用于室外较大范围,例如在某个街角交叉位置、某个公园位置,某幢楼的某层位置。如果是在室内,例如自己家,手机定位就显得没那么好用了。 在家里怎么找突然“失踪”的手机&#xff…

HarmonyOS 速记

目录 装饰器Entry(入口)Component(组件)State(状态)Prop(属性)Preview(预览)PreviewerInspector 结构体structbuild自定义组件自定义 Custom 组件 容器Row(行) & Column(列)RelativeContainer(相对布局容器)marginpaddingSwiper(轮播图)Grid(网格容器)List(列表) 组件Image…

CISP知识点,看完这个就够了!

内容较多,编辑了目录方便查看~ 一、信息安全保障 知识点:信息安全概念、信息安全属性、信息安全视角、信息安全发展阶段、信息安全保障新领域、安全保障框架模型、基于时间的PDR与PPDR模型、信息安全保障技术框架、信息系统安全保障评估框架、企业安全…

【Docker部署ELK】(7.15)

1、拉取镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.15.0 docker pull docker.elastic.co/kibana/kibana:7.15.0 docker pull docker.elastic.co/logstash/logstash:7.15.02、配置文件(解压资源到D盘DOCKER目录下) 2.1 配置文件…

【Lua】第四篇:字符串操作

文章目录 一. Lua中字符串的表示方法二. 获取字符串长度三. 字符串多行打印方法一:使用 \n 换行方法一:使用 [[ ]] 四. 字符串拼接五. 别的类型转字符串六. 常用字符串接口1. 把字符串内容全转为小写2. 把字符串内容全转为大写3. 字符串翻转4. 子串查找4…

【bug】通过lora方式微调sdxl inpainting踩坑

报错内容 ValueError: Attempting to unscale FP16 gradients. 报错位置 if accelerator.sync_gradients:params_to_clip (itertools.chain(unet_lora_parameters, text_lora_parameters_one, text_lora_parameters_two)if args.train_text_encoderelse unet_lora_parameters…

SpringBoot:Web开发(基于SpringBoot使用MyBatis-Plus+JSP开发)

目录 前期准备 构建项目(IDEA2023.1.2,JDK21,SpringBoot3.3.3) 添加启动器 Model准备 这里我们利用MybatisX插件生成我们所需要的实体类、数据访问层以及服务层 注意选择MyBatis-Plus3以及Lombok 然后再在service接口中定义…

达梦数据库导入xml迁移到达梦数据库大文件导致中断问题解决方案记录?

问题:我将同事给我的xml文件迁移到盗梦数据库,xml文件大约2G,在导入过程中,总是导入一半都不到就失败了。 原因:我的原因是我的电脑的系统的运行内存是16G的,后来我发现在没导入之前,其他进程已…

android 老项目中用到的jar包不存在,通过离线的方法加载

1、之前的项目用的jar包,已经不在远程仓库中,只能手工去下载,并且安装。 // implementation com.github.nostra13:Android-Universal-Image-Loader // implementation com.github.lecho:hellocharts-android:v1.5.8 这…

Java进阶之集合框架(Set)

【基本内容】 二、Set接口(接上一章) Set是Java集合框架中不允许有重复元素的无序集合,其典型的实现类是HashSet,它完全是遵循Set接口特性规范实现的,无序且不允许元素重复;而Set接口下的实现类还有LinkedHashSet和TreeSort&#…

前后端分离Vue美容店会员信息管理系统o7grs

目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取 技术栈介绍 本课题的研究方法和研究步骤基本合理,难度适中,本选题是学生所学专业知识的延续,符合…

java项目之疫情下图书馆管理系统源码(springboot)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的疫情下图书馆管理系统。项目源码以及部署相关请联系风歌,文末附上联系信息。 项目简介: 疫情下图书馆管理系…

【OJ刷题】双指针问题6

这里是阿川的博客,祝您变得更强 ✨ 个人主页:在线OJ的阿川 💖文章专栏:OJ刷题入门到进阶 🌏代码仓库: 写在开头 现在您看到的是我的结论或想法,但在这背后凝结了大量的思考、经验和讨论 目录 1…

OpenAI o1——人工智能推理能力的飞跃,助力高级问题解决

前言 开放人工智能 新模型, OpenAI o1 或草莓,代表了 人工智能。它以 OpenAI 的 GPT 系列等先前模型为基础,并引入了增强的推理能力,从而加深了科学、编码和数学等各个领域的问题解决能力。与主要擅长处理和生成文本的前辈不同&a…

Pandas的入门操作-Series对象

Pandas的数据结构 Series对象 class pandas.Series(dataNone, indexNone) data参数 含义:data是Series构造函数中最主要的参数,它用来指定要存储在Series中的数据。 数据类型:data可以是多种数据类型,例如: Python 列…

【JavaEE初阶】多线程6(线程池\定时器)

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 实例3:线程池 参数解释 核心线程数, 最大线程数 允许空闲的最大时间 ,时间单位 任务队列(阻塞队列) 线程工厂>工厂设计模式 拒绝策略 使用举例 模拟实现一个线…

leetcode:最高乘法得分

用auto可以过 class Solution { public:long long maxScore(vector<int>& a, vector<int>& b) {int n b.size();vector<vector<long long>> memo(4,vector<long long>(b.size(), LLONG_MIN));auto dfs [&](auto&& dfs, i…

构建自己的文生图工具:Python + Stable Diffusion + CUDA

构建自己的文生图工具&#xff1a;Python Stable Diffusion CUDA 前言概述环境搭建安装PyTorch安装Stable Diffusion编写Python代码结论结语 前言 在这个数字化和人工智能飞速发展的时代&#xff0c;图像生成技术正逐渐成为现实。想象一下&#xff0c;只需输入几个关键词&…