什么是Redis?
使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的数据库,Redis 可以存储键和五种不同类型的值之间的映射;键的类型只能为字符串,值支持五种数据类型:String,List,Set,Zset,Hash
数据类型 | 含义 |
---|---|
字符串(String) | 最基本的数据类型,可以存储字符串、整数或浮点数。常用于缓存、计数器和简单的键值存储 |
列表(List) | 有序的字符串集合,可以在列表的两端进行插入和删除操作。常用于消息队列、最新消息的存储和排行榜等场景 |
有序集合(Zset) | 有序的字符串集合,每个成员都关联一个分数,可以根据分数排序。常用于排行榜、优先级队列等场景 |
集合(Set) | 无序的字符串集合,不允许重复元素。可以进行交集、并集、差集等操作,例如每个用户只能参与一次活动、一个用户只能中奖一次等等去重场景 |
哈希(Hash) | 键值对的集合,可以存储多个字段和对应的值。常用于保存结构体信息 |
与传统数据库不同的是 Redis 的数据是存在内存中的,所以读写速度非常快, 因此 redis 被广泛应用于缓存方向,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。另外,Redis 也经常用来做分布式锁。除此之外,Redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案
Redis有哪些优缺点?
为什么要用 Redis 而不用 map做缓存?
Redis | Map | |
---|---|---|
内存管理 | Redis是专门设计用于内存存储的数据库,它有着高效的内存管理机制,Redis会对存储的数据进行优化和压缩,以提高内存利用率 | 使用普通的Map做缓存,需要手动管理内存,容易导致内存泄漏或者内存溢出的问题 |
持久化支持 | Redis支持数据的持久化,可以将内存中的数据保存到磁盘上,以便在重启后恢复数据 | Map只是内存中的数据结构,重启后数据会丢失 |
多种数据结构支持 | Redis不仅仅是一个简单的键值存储,它支持多种数据结构,如字符串、列表、哈希、集合和有序集合等;Redis可以更灵活地处理不同类型的数据 | Map只能存储简单的键值对 |
分布式支持 | Redis可以通过主从复制和集群模式实现数据的分布式存储和高可用性 | 使用Map做缓存,需要开发者自行实现分布式缓存机制,增加了复杂性和开发成本 |
其他功能支持 | Redis还提供了其他功能,如发布订阅、事务处理和Lua脚本执行等;使得Redis在缓存、消息队列和计数器等场景下有更广泛的应用 |
Redis为什么这么快/为啥 redis 单线程模型也能效率这么高?
避免线程切换开销 | 在多线程模型中,线程之间的切换会带来额外的开销,包括上下文切换、线程调度等;而Redis单线程模型避免了这些开销,减少了不必要的资源消耗 |
---|---|
内存操作效率高 | Redis主要依赖于内存进行数据存储和操作,而内存操作的速度远远快于磁盘操作;单线程模型使得Redis能够充分利用内存的高速读写能力,从而提高了数据访问的效率 |
高效的事件驱动机制 | Redis采用事件驱动的方式处理客户端请求和其他操作;通过使用I/O多路复用技术,Redis能够同时监听多个文件描述符上的事件,实现高效的事件驱动;这种机制使得Redis能够在单线程下处理大量的并发请求,提高了系统的吞吐量 |
高效的数据结构和算法 | Redis内部使用了高效的数据结构和算法,如哈希表、跳跃表、压缩列表等;这些数据结构和算法在内存占用和操作效率上都进行了优化,能够提供高性能的数据访问和操作 |
异步非阻塞I/O | Redis采用非阻塞I/O来实现网络通信,避免了线程阻塞等待I/O完成的情况;通过异步非阻塞的方式,Redis能够在等待网络数据时继续处理其他请求,提高了系统的并发能力和响应速度 |
需要注意的是,尽管Redis的单线程模型能够在大部分场景下提供高效率,但在面对大量的计算密集型操作时,单线程模型可能会受到性能影响;在这种情况下,可以考虑使用多个Redis实例或集群来进行水平扩展,以提高系统的整体性能