Redis特性介绍
In-memory data structrues
众所周知,MySQL是一种关系型数据库,其通过表的结构存储数据,就类似于建立了一个excel表格来存储数据。但是像视频这类数据并不适合存储在关系型数据库中,因此存在非关系型数据库——通过键值对存储数据
redis中存储的key都是string,而value可以是string,hashes,lists,sets,sorted sets,streams等等
Programmability
可以通过基础的交互式命令操作redis,也可以通过脚本(Lua)来批量的进行操作
Extensibility
redis提供了一组API,让我们可以在redis原有的功能上进行扩展(C,C++,Rust),例如让redis支持更多的数据结构,更多的命令
Persistence
Redis将数据存储在内存中,这保证了能够更快的获取数据,但是内存中的数据在系统重启后就会消失,因此Redis还在硬盘中备份了内存中的内容,保证数据的持久性
Clustering
Redis支持集群,也就是水平扩展,类似于分库分表,多个服务器中部署多个Redis节点,让数据分散存储
High availability
Redis支持主从结构,从节点是主节点的备份,当主节点有问题时,从节点可以替代主节点继续工作,因此Redis是高可用的
Redis读写数据迅速的原因
- Redis的数据存储在内存中,读写内存比读写硬盘快好几个数量级
- Redis的核心功能实现的比较简单,没有关系型数据库那么复杂的外键等等约束,因此读写数据迅速
- Redis通过IO多路复用的方式处理网络请求(使用一个线程管理多个socket)
- Redis使用单线程模型,减少了线程竞争的开销
- Redis是用C语言开发的
Redis使用场景
Real-time data store
将Redis当作数据库存储数据,实时性要求较高,高吞吐的场景。例如搜索引擎需要较快的响应速度,这时就需要将需要检索的数据存储在内存中
Caching & session storage
由于计算机中的数据也存在二八原则(80%的用户需要的是20%的热点数据),因此可以将Redis中存储这20%的热点数据作为缓存
而要理解session storage首先要理解下面这个概念:
http中的cookie是用来实现用户信息的保存的,其需要session的配合完成。服务器这边存储了用户的数据,而cookie是让浏览器存储用户的身份标识(sessionId)
但如果应用了分布式系统,存在多个应用服务器。与用户登录时可能将用户会话信息存储在a服务器中,但是用户下次访问请求可能发送到c服务器中,而c服务器中没有用户的会话信息
解决方法:
- 负载均衡器始终将同一个用户的请求发送到同一台服务器中
- 将会话信息单独存储在一台服务器中,并且当服务器重启后会话信息不能丢失
显然,Redis就可以负责存储分布式系统下的用户的会话信息
Streaming & messaging
Redis可以作为消息队列,是一个网络版本的生产者消费者模型,消息队列可以解耦合,削峰填谷