【力扣数据库知识手册】关于redis

Key-Value 数据库(键值数据库)是一种非关系型数据库(NoSQL),它使用简单的键值对(key-value)方式来存储数据,是最简单的数据库模型之一。

Redis定义

全称为Remote Dictionary Server,本质上是一个Key-Value类型的内存数据库,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据写入磁盘或把修改操作写入追加的记录文件,并且在此基础上实现Master-Slave(主从)同步。它支持存储的Value类型多样,包括String、List、Set、zset和Hash,这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,其适用主要场景局限在较小数据量大高性能操作和运算上。

Redis缓存的特点

作为一个高性能的Key-Value 数据库,Redis与其它Key-Value缓存产品相比,有以下三个特点:

  • Redis运行在内存中但是可以持久化到磁盘,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还支持List,Set,Sorted set,hash等数据结构的存储。
  • Redis还支持数据的备份,即Master-Slave主从模式的数据备份。

Redis和MySQL的区别

  • 类型不同:
    • MySQL是关系型数据库,采用表格的存储方式,数据以行列组织,遵守了传统的数据库的ACID原则,这些要求在记录重要数据(如用户账号密码,银行户头等)时是必须的。
    • Redis是NoSQL,不严格遵守ACID原则,采用Key-Value存储组织数据,大量使用缓存来读写数据,周期性地把更新数据写入磁盘或在追加文件中写入修改操作,以及同步分布数据库等。这些特点大大提高了Redis在极大并发量的读写性能。由于不以表格方式组织数据,Redis的数据扩展十分灵活方便。
  • 功能不同:
    • MySQL主要用于持久化的存储数据到硬盘,功能强大,但是读取速度较慢。
    • Redis将使用频繁的数据存储在缓存中,缓存的读取速度快,但是一般在使用中,Redis缓存数据保存时间是有限的。
  • 运行机制不同:
    • MySQL作为典型的关系型数据库,为了严格遵守ACID规则必须采取保守的缓存策略。为了保证数据的一致性,牺牲了许多读写性能。
    • 现在互联网许多应用场景面临海量用户的访问请求,对数据库并不需要非常强的一致性(在一致性和可用心之间做出权衡,CAP理论)。Redis等非关系型数据库往往以不再满足ACID为代价求得更高的吞吐容量。NoSQL通常采用极大的缓存、分布式服务来提高读写性能。
  • CAP理论背景
    在分布式系统中,三个核心特性无法同时完美满足:
    • Consistency(一致性):所有节点看到的数据是相同的
    • Availability(可用性):每个请求都能获得响应(不保证最新数据)
    • Partition tolerance(分区容错性):系统在网络分区时仍能运行。
      互联网应用通常选择 AP系统(优先保证可用性和分区容错),牺牲强一致性。
  • 以Twitter为例的典型场景:
    • 不强求一致性:允许"10秒内的新推文可能暂时不可见"
    • 用户刷新时间线时,系统可能返回略微过期的缓存数据(比如10秒前的最新状态)
    • 背后的数据库可能采用最终一致性模型(Eventually Consistent)
  • 坚决保障可用性:拒绝"5秒以上的等待"
    • 即使用户看到的数据不是绝对最新,也必须快速响应(如200ms内返回结果)
    • 避免用户遭遇"卡死"体验
  • 为什么Key-Value数据库适合这种场景?
    您最初提问的Key-Value数据库恰好是这类需求的最佳选择之一,因为:
    • 天然AP倾向:多数KVDB默认优先保证可用性
    • 超高性能:简单数据结构带来微秒级读写(如Redis可达10万+ QPS)
    • 灵活过期控制:可设置TTL(Time-To-Live)自动淘汰旧数据
    • 水平扩展易:通过分片(Sharding)轻松应对海量请求

Redis和MongoDB的区别

两者都是NoSQL,采用结构型数据存储,二者主要区别为:

  • 性能方面:二者都很高,TPS(每秒事务数)方面Redis要大于MongoDB;
  • 可操作性上:MongoDB支持丰富的数据表达、索引,最类似于关系数据库,支持丰富的查询语言,操作比Redis更为便利;
  • 内存及存储方面:MongoDB适合大数据量存储,依赖操作系统虚拟做内存管理,采用镜像文件存储,内存占有率比较高;Redis2.0后增加虚拟内存特性,数据可以设置时效性;
  • 对于数据持久化和数据恢复,MongoDB1.8后采用binlog方式(同MySQL)支持持久化,增加了可靠性;而Redis依赖快照进行持久化、AOF增强可靠性,但是增强可靠性的同时,也会影响访问性能;
  • 数据一致性:MongoDB不支持事务,靠客户端自身保证,而Redis支持事务,能保证事务中操作按顺序进行。
  • 数据分析上,MongoDB内置数据分析功能(mapreduce),Redis不支持数据分析。

Redis有哪些数据类型

五大常用数据类型:String、Hash、List、Set、Sorted set。

如何实现Redis的定时机制

  • Redis服务器是一个事件驱动程序,服务器需要处理以下两类事件:文件事件(服务器对套接字操作的抽象)和时间事件(服务器对定时操作的抽象)。
  • Redis的定时操作即借助时间事件实现的。一个时间事件主要由以下三个属性组成:id - 时间事件标识号;when - 记录时间事件的到达时间;timeProc - 时间事件处理器,当时间事件到达时,服务器就会调用相应的处理器来处理时间。一个时间事件根据时间事件处理器的返回值来判断是定时事件还是周期性事件。

单线程Redis高效的原因

虽然Redis文件事件处理器以单线程方式运行,但是通过使用I/O多路复用程序来监听多个套接字,文件事件处理器既实现了高性能的网络通信模型,又可以很好地与Redis服务器中其他同样以单线程运行的模块进行对接,这保持了Redis内部单线程设计的简单性。

  • 什么是I/O多路复用程序?
    彻底理解 IO 多路复用实现机制
    I/O多路复用

Redis有哪些数据淘汰策略

Redis内存数据量达到一定限制的时候,就会实行数据淘汰策略(回收策略)。Redis会根据maxmemory-policy配置策略,来决定具体的行为:

  • no-eviction:不删除策略,达到最大内存限制时刻,如果需要更多内存,直接返回错误信息;
  • allkey-lru:从所有Key的哈希表(server.db[i].dict)中随机挑选多个Key,然后在选到的Key中利用lru算法淘汰最近最少使用的数据;
  • volatile-lru:从已设置过期时间的哈希表(server.db[i].expires)中随机挑选多个Key,然后在选到的Key中利用lru算法淘汰最近最少使用的数据;
  • volatile-random:从已设置过期时间的哈希表(server.db[i].expires)中随机挑选Key淘汰掉;
  • allkey-random:从所有Key的哈希表(server.db[i].dict)中随机挑选数据淘汰;
  • volatile-ttl:从已设置过期时间的哈希表(server.db[i].expires)中随机挑选多个Key,然后在选到的Key中选择剩余时间最短的数据淘汰掉。

你可能感兴趣的:(数据库八股,数据库,redis)