Redis官网进行了详细的自我介绍
Redis是一个在内存中存储数据的中间件,用作数据库,用作数据缓存,在分布式系统中大展拳脚
核心能力:
In-memory data structures
Well-known as a "data structure server", with support for strings, hashes, lists, sets, sorted sets, streams, and more.
在内存中以键值对的形式存储数据,key均为String类型,vlaue则是上述的数据结构。MySQL 是以表的形式来存储组织数据的属于关系型数据库,Redis是以键值对的形式来存储组织数据的属于非关系型数据库。
Programmability
Server-side scripting with Lua and server-side stored procedures with Redis Functions.
可编程性:可以使用 Lua 编写服务器端脚本,使用 Redis Functions 编写服务器端存储过程。
Redis可以直接通过简单的交互式命令进行操作,也可以通过编写脚本进行批量操作。
Extensibility
A module API for building custom extensions to Redis in C, C++, and Rust.
用于在 C、C++ 和 Rust 中构建 Redis 自定义扩展的模块 API。
可自己取扩展Redis的功能,使其支持更多的数据结构和命令。Redis扩展本质上是动态链接库,比如Windows系统的.dll文件可以让.exe文件去调用,里面包含很多代码,Linux的动态链接库是.so。
Persistence
Keeps the dataset in memory for fast access, but can also persist all writes to permanent storage to survive reboots and system failures.
持久化:将数据集保留在内存中以进行快速访问,但也可以将所有写入保存到永久存储中,以便在重新启动和系统故障时幸存下来。
Redis的数据存储在内存上,内存的数据不具有持久性,容易丢失。Redis会把数据备份在硬盘上,重启Redis是会重新加载数据到内存,恢复到重启之前的状态,内存为主,硬盘为辅。
Clustering
Horizontal scalability with hash-based sharding, scaling to millions of nodes with automatic re-partitioning when growing the cluster.
集群:通过基于哈希的分片实现水平可扩展性,在扩展集群时通过自动重新分区扩展到数百万个节点。
redis作为分布式系统的中间件,需要具有支持集群的功能,一个redis能存储的数据是有限的,引入多个主机,部署多个Redis节点,每个节点存储部分数据。
High availability
Replication with automatic failover for both standalone and clustered deployments.
高可用性:具有自动故障转移功能的复制,适用于独立部署和群集部署。
Redis自身也是支持主从结构的,从节点就相当于主节点的备份了。
Redis快的原因:
这里的快是相对于MYSQL等数据库而言的。
Redis的数据存储在内存之中,访问速度要比存储在硬盘的数据库快很多
Redis的核心功能都是比较简单逻辑,都是简单的操作内存中的数据结构
从网络的角度来看,Redis使用里IO多路复用(使用一个线程管理很多个)的方式(epoll)
Redis使用的是单线程模型(高版本中引入了多线程),减少了不必要的线程之间的竞争开销
有人说Redis是用C写的,所以快,但是MySQL也是C写的
在处理CPU密集型人物时使用多线程可以提高效率,因为此时多个线程和以充分利用CPU的多核资源
使用案例:
Real-time data store
Redis' versatile in-memory data structures enable building data infrastructure for real-time applications that require low latency and high-throughput.
使用Redis数据库,数据库不仅要大,有时候也要快。有些场景适合使用Redis.比如说浏览器的广告会选择把redis当作数据库。
Caching & session storage
Redis' speed makes it ideal for caching database queries, complex computations, API calls, and session state.
使用Redis通常作为缓存使用。
比如使用redis缓存session,我们之前一直是把session存储在服务器的内存上的。
如果将session存储在服务器的内存中,在分布式系统的登陆场景中,第一次用户请求A服务器,A服务器会存储了session,第二次请求负载均衡器可能会转发给B服务器,此时B服务器并没有存储session就会导致用户重新登陆。
如果将session存储在Redis中,第一次用户请求A服务器,会把session存储到Redis中,第二次请求被转发给了B服务器,B服务器可以通过redis得到session,系统就可以得知用户已经登陆了。而且即使redis重启也没有影响,因为redis持久化的特性会把数据加载到硬盘中,重启后重新加载到内存。redis可以设置数据保存的寿命。
Streaming & messaging
The stream data type enables high-rate data ingestion, messaging, event sourcing, and notifications.
充当消息队列,Redis开发者的初心是开发消息队列,后来发现作为缓存很好用,就无心插柳柳成荫了,但依然保存了充当消息队列的功能。当系统已经使用了redis作为缓存,又需要使用消息队列的时候不想引入别的以来比如kafuka,就可以使用redis同时充当消息队列。
Redis不能做的事情:
存储大规模数据,因为redis的数据是存储在内存中的,一方面是内存本身就不够大,另外就是容量大了就可变慢。
总之:redis是一个使用内存存储数据的中间件