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

详解Redis

一.Redis的基本概念

首先,什么是Redis?

Redis(Remote Dictionary Server)是一个开源的、高性能的键值对内存数据库,常被用作缓存、消息队列、分布式锁等。

二.Redis的基本数据类型

1. 字符串(String)

  • 特点:Redis 中最基础的数据类型,是二进制安全的,意味着它可以包含任何数据,比如图片或者序列化的对象,一个键最大能存储 512MB 数据。
  • 常见操作
    • SET key value:设置键值对。
    • GET key:获取键对应的值。
    • INCR key:将键的值递增 1,如果键不存在,会先将其值初始化为 0 再递增。
  • 应用场景:缓存、计数器、分布式锁等。

2. 哈希(Hash)

  • 特点:键值对的集合,适合存储对象,比如一个用户的信息可以用哈希来存储,每个字段和值对应着用户的属性和属性值。
  • 常见操作
    • HSET key field value:为哈希表中的字段赋值。
    • HGET key field:获取哈希表中指定字段的值。
    • HGETALL key:获取哈希表中所有的字段和值。
  • 应用场景:存储对象信息,如用户信息、商品信息等。

3. 列表(List)

  • 特点:简单的字符串列表,按照插入顺序排序,可以在列表的头部(LPUSH)或者尾部(RPUSH)插入元素,也可以从头部(LPOP)或者尾部(RPOP)弹出元素。
  • 常见操作
    • LPUSH key value1 [value2]:将一个或多个值插入到列表头部。
    • RPOP key:移除并获取列表的最后一个元素。
    • LRANGE key start stop:获取列表指定范围内的元素。
  • 应用场景:消息队列、最新消息排行等。

4. 集合(Set)

  • 特点:无序且唯一的字符串集合,支持交集、并集、差集等操作。
  • 常见操作
    • SADD key member1 [member2]:向集合中添加一个或多个成员。
    • SMEMBERS key:返回集合中的所有成员。
    • SINTER key1 [key2]:返回给定所有集合的交集。
  • 应用场景:去重、共同好友、兴趣标签等。

5. 有序集合(Sorted Set)

  • 特点:和集合类似,也是唯一的,但每个成员都会关联一个分数(score),根据分数对成员进行排序。
  • 常见操作
    • ZADD key score1 member1 [score2 member2]:向有序集合中添加一个或多个成员。
    • ZRANGE key start stop [WITHSCORES]:返回有序集合中指定区间内的成员。
    • ZREM key member [member ...]:移除有序集合中的一个或多个成员。
  • 应用场景:排行榜、热门列表等。

6. 其他特殊类型(在 Redis 4.0 及以上版本)

  • Bitmaps:它不是实际的数据类型,而是在字符串类型上定义的一组面向位的操作。可以用来实现高效的布尔数组,非常适合处理大量的布尔信息,如统计用户的签到情况。
  • HyperLogLogs:用于进行基数统计的概率性数据结构,它可以用极小的内存空间来统计集合中唯一元素的数量,比如统计网站的日活用户数。
  • Geospatial:用于存储地理位置信息,并对其进行操作,例如计算两个地理位置之间的距离、查找某个位置附近的地点等。

三.Redis高性能的原因

  1. 内存直接操作:数据存储在内存中,读写速度极快(读约 10 万次 / 秒,写约 8 万次 / 秒),避免磁盘 IO 瓶颈。
  2. 单线程模型:避免多线程上下文切换和锁竞争,基于非阻塞 IO(如 epoll)处理大量并发连接,事件驱动架构高效处理请求。
  3. 高效数据结构:内置哈希、跳表、压缩列表等数据结构,操作复杂度低(如 O (1) 或 O (logN)),且底层实现经过高度优化。
  4. 管道(Pipeline)与批量操作:支持一次性发送多个命令到服务端批量执行,减少网络传输开销。

四。Redis用作数据库的原因

  1. 持久化支持:通过 RDB(快照)和 AOF(日志重放)实现数据持久化,确保内存数据可落地存储,兼顾性能与数据可靠性。
  2. 丰富数据模型:支持 String、Hash、List、Set、Sorted Set 等多种数据类型,满足复杂业务场景(如缓存、计数器、排行榜、消息队列等)。
  3. 数据库级特性:支持事务(原子性)、LUA 脚本、过期策略、数据淘汰机制,以及基于键的复杂查询(如模糊匹配、范围查询)。
  4. 高可用性与扩展性:通过主从复制、哨兵(Sentinel)和集群(Redis Cluster)实现高可用和水平扩展,适合大规模数据存储。
  5. 极简架构与易用性:单进程模型部署简单,API 简洁,生态成熟(如与 Spring Data Redis 集成),降低开发和维护成本。

五.Redis 缓存穿透、缓存击穿和缓存雪崩问题

  • 缓存穿透:指查询一个不存在的数据,导致请求直接穿透缓存到数据库。解决方案有:对不存在的数据也进行缓存(如缓存空值);使用布隆过滤器提前过滤掉不可能存在的数据。
  • 缓存击穿:指一个热点 key 在缓存中过期,此时大量请求同时访问该 key,导致请求直接打到数据库。解决方案有:设置热点 key 永不过期;使用互斥锁,只允许一个线程去更新缓存。
  • 缓存雪崩:指大量缓存同时过期,导致大量请求直接打到数据库。解决方案有:设置不同的过期时间,避免缓存同时失效;使用分布式锁限制并发访问数据库的线程数;使用多级缓存。

六. Redis 的持久化

  • RDB(Redis Database)
    • 优点:文件紧凑,适合备份和灾难恢复;恢复速度快。
    • 缺点:可能会丢失最后一次快照后的所有数据;在快照过程中可能会阻塞主线程。
  • AOF(Append Only File)
    • 优点:数据安全性高,可配置不同的同步策略;日志文件以追加方式写入,不会丢失数据。
    • 缺点:AOF 文件通常比 RDB 文件大;恢复速度相对较慢。

七. Redis 分布式锁

实现原理:Redis 分布式锁通常基于 SETNX(SET if Not eXists)命令实现。

当一个线程尝试获取锁时,使用 SETNX 命令设置一个特定的 key,如果返回 1 表示获取锁成功,返回 0 表示锁已被其他线程持有。

为了避免死锁,还需要为锁设置一个过期时间。

http://www.xdnf.cn/news/322669.html

相关文章:

  • 第三章—导数和微分错题
  • 【深度学习-Day 7】精通Pandas:从Series、DataFrame入门到数据清洗实战
  • 什么情况下会触发Full GC?
  • 【软件设计师:数据结构】2.数据结构基础(二)
  • Prometheus实战教程:k8s平台-Redis监控案例
  • 微软输入法常用快捷键介绍以及调教技巧
  • 新能源汽车BMS开发工程师视频教程合集(100+节课)
  • 【详细教程】ROC曲线的计算方式与绘制方法详细介绍
  • XMP-Toolkit-SDK 编译与示例程序
  • 大数据处理利器:Hadoop 入门指南
  • 代码随想录图论part4
  • 【Python Number(数字)】
  • 欧姆龙 PLC串口转网口模块cjcp系列SG-CJCP-110
  • 2021-11-11 C++泰勒sin(x)以2步进乘方除以阶乘加减第N项
  • 学习Linux的第四天
  • 前后端开发---分离 和 不分离开发
  • python批量配置交换机简单实现
  • 多功能气体检测报警系统,精准监测,守护安全
  • 【MATLAB代码解析】基于蜜蜂交配优化算法的排列组合优化问题MATLAB实现
  • ECMAScript 2016(ES2016):JavaScript 生态的精细化完善
  • 【Python】在for循环里记录报错的次数error,如果遇到连续发生错误 X次时,则跳出循环的写法
  • 追踪大型语言模型的思想(上)(来自针对Claude的分析)
  • 可视化魔法指南
  • Whistle无权限访问本地文件
  • 【javascript】console对象
  • 邮件发送频率如何设置?尊重文化差异是关键!
  • 双线性配对
  • 算法设计与分析实验题-序列对齐
  • 电商双11美妆数据分析(二)
  • Unity WebGL、js发布交互