Redis(一)基础

2024 年 4 月 25 日 星期四(已编辑)
/
91
1
这篇文章上次修改于 2024 年 7 月 22 日 星期一,可能部分内容已经不适用,如有疑问可询问作者。

Redis(一)基础

Redis是什么✨

Redis是一个数据库,不过与传统关系性数据库(RDBM)不同,Redis属于NoSQL,也就是非关系型数据库,它的存储结构是Key-Value。或者说Redis是一个基于内存、支持多种数据结构的存储系统。Redis的数据直接存在内存中,读写速度非常快,因此 Redis被广泛应用于缓存,消息队列、分布式锁等场景

Redis 提供了多种数据类型来支持不同的业务场景,比如 String(字符串)、Hash(哈希)、 List (列表)、Set(集合)、Zset(有序集合)、Bitmaps(位图)、HyperLog(基数统计)、GEO(地理信息)、Stream(流),并且对数据类型的操作都是原子性的,因为执行命令由单线程负责的,不存在并发竞争的问题。

除此之外,Redis 还支持事务 、持久化、Lua 脚本、多种集群方案(主从复制模式、哨兵模式、切片机群模式)、发布/订阅模式,内存淘汰机制、过期删除机制等等。

Redis为什么这么快✨✨✨

  1. Redis 基于内存,内存的访问速度比磁盘快很多
  2. Redis 内置了多种优化过后的数据类型/结构实现,性能非常高
    • 整个 Redis 就是一个全局哈希表,他的时间复杂度是 O(1);
    • 对数据存储进行了优化,如压缩表,listpack,对短数据进行压缩存储,再如,跳表,使用有序的数据结构加快读取的速度。
  3. Redis对数据的操作是单线程的,不存在资源竞争问题,避免抢锁带来的性能消耗
  4. Redis使用多路复用技术,可以处理并发的连接。采用了epoll+Reactor。通过epoll,内核会一直监听多个 Socket 上的连接请求或数据请求。一旦有请求到达,就会交给 Redis 线程处理,假如说 Redis 拿到了可读写的描述符,就会执行对应的读写操作;如果 Redis 拿到了创建连接的文件描述符,就会完成连接的初始化,然后准备监听这个连接上的读写事件。这就实现了一个 Redis 线程处理多个 IO 流的效果。((四)Redis线程模型 - 一打木 (taitres.com)
  5. Redis使用RESP协议,实现简单、解析快、人类可读(例如一个SET 命令:*3\r\n$3\r\nSET\r\n$3\r\nkey\r\n$5\r\nvalue\r\n
Note

那既然都这么快了,为什么不直接用 Redis 当主数据库呢?主要是因为内存成本太高且 Redis 提供的数据持久化仍然有数据丢失的风险。

Redis 和 Memcached 的区别和共同点?✨✨

共同点

  1. 都是基于内存的数据库,一般都用来当做缓存使用;
  2. 都有过期策略;
  3. 两者的性能都非常高。

区别

  1. 数据类型:Redis 支持更丰富的数据类型(支持更复杂的应用场景)(String、Hash、List、Set、ZSet),而 Memcached 只支持最简单的 key-value 数据类型;
  2. 数据持久化:Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而 Memcached 没有持久化功能,数据全部存在内存之中,Memcached 重启或者挂掉后,数据就没了;
  3. 集群模式支持:Redis 原生支持集群模式,Memcached 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;
  4. 特性支持:Redis 支持发布订阅模型、Lua 脚本、事务等功能,而 Memcached 不支持。并且,Redis 支持更多的编程语言;
  5. 过期数据删除:Memcached 过期数据的删除策略只用了惰性删除,而 Redis 同时使用了惰性删除与定期删除。

为什么要用 Redis?(为什么用 Redis 作为 MySQL 的缓存?)✨

为什么要用 Redis:访问速度快,高并发,功能全面(Redis 除了可以用作缓存之外,还可以用于分布式锁、限流、消息队列、延时队列等场景)

为什么用 Redis 作为 MySQL 的缓存:MySQL是数据库系统,对于数据的操作需要访问磁盘,而将数据放在Redis中,需要访问就可以直接从内存获取,避免磁盘I/O,提高操作的速度。 使用Redis+MySQL结合的方式可以有效提高系统QPS(Redis 单机的 QPS 能轻松破 10w,而 MySQL 单机的 QPS 很难破 1w)

什么是 Redis Module?有什么用?

通过 Module 来扩展其功能以满足特殊的需求。这些 Module 以动态链接库(so 文件)的形式被加载到 Redis 中

我们每个人都可以基于 Redis 去定制化开发自己的 Module,比如实现搜索引擎功能、自定义分布式锁和分布式限流。

如:

如何理解Redis原子性操作原理

  • API:Redis提供的API都是单线程串行处理的
  • 网络模型:采用单线程的epoll的网络模型,用来处理多个Socket请求
  • 请求处理:Redis会fork子进程来出来类似于RDB和AOF的操作,不影响主进程工作

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...