Redis简介,特性和使用场景
(一).概念
Redis是一个在内存中存储数据的中间件,用于作为数据库,数据缓存,等等。Redis在分布式系统中能够发挥主要作用。
(二).特性
1.内存数据结构
Redis能够在内存中存储数据,支持strings,hashes,lists,sets,sorted sets,streams 等数据结构。
对于Mysql来说,主要是通过“表”的方式存储和组织数据的,这种数据库被称为“关系型数据库”;
对于Redis来说,主要是通过“键值对”的方式来存储组织数据的,这种数据库被称为“非关系型数据库”。
在Redis种,key都是String类型,value可以是上面提到的类型。
2.可编程性
我们可以针对Redis的操作,直接通过简单的交互式命令来进行操作,也可以通过一些脚本的方式,批量执行一些操作。例如,Lua编程语言。
3.可扩展性
可以使用C,C++,Rust等编程语言,可以在Redis原有的功能基础上再进行扩展。
4.持久化
Redis是把数据存放在内存上,但是内存上的数据是“易失”的,当进程退出或者系统重启,这些数据就丢失了。但是,Redis除了会将数据存放在内存上,Redis也是会将数据存放在硬盘上的,采取“内存为主,硬盘为辅”。如果Redis重启了,就会在重启的时候加载硬盘中的备份数据,使Redis的内存恢复到重启前的状态。
5.集群
Redis作为一个分布式系统的中间件,能够支持集群也是很关键的,这个类似于“分库分表”
对于Redis来说,能存储的数据是有限的,此时就可以引入多个主机,部署多个Redis节点,每个Redis存储数据的一部分
6.高可用
高可用,就意味着对数据进行了“冗余备份”
Redis自身也支持“主从结构”,“从节点”就相当于“主节点”的备份。
7.快
Redis “快”的原因有以下几个
(1).Redis数据存放在内存中,访问速度就比访问硬盘快很多
(2).Redis的核心功能都是比较简单的逻辑,其核心功能就是操作内存的数据结构
(3).从网络角度上,Redis使用了IO多路复用的方式
(4).Redis使用的是单线程模型,虽然高版本的Redis引入了多线程。Redis的单线程模型,减少了不必要的线程之间的竞争开销。
注意:可能有人会问,多线程不就是为了提高性能的的,为什么这里说单线程是提高性能的?
这是因为,多线程提高效率的前提是,执行的是CPU密集型的任务,此时,使用多线程可以充分利用CPU多核资源。但是Redis的核心任务,主要是操作内存的数据结构,这个操作不会吃很多CPU。
(三).使用场景
1.数据库
关于数据存储,在一些业务场景中,考虑的还是“快”,此时就可以把Redis当作数据库,存储全量数据,这里面的数据是不能随便丢的。
2.缓存
对于Mysql来说,存储的数据量大,但是速度慢,此时,就可以把一些热点数据存放在Redis中。
Redis中存放是部分数据,全量数据以mysql为主,即使Redis中的数据没了,还可以从mysql这边再加载回来。
3.消息队列
基于Redis可以实行一个网络版本的生产者/消费者模型。
对于分布式系统来说,服务器和服务器之间,有时候也是需要使用到生产者/消费者模型的。优势在于,解耦合 和 削峰填谷
4.会话存储
前面在介绍JavaEE进阶的http协议阶段,介绍到过cookie和session,通过sessionId建立连接,实现用户身份信息的存储,将用户数据存储到服务器上。
但是在“分布式系统”中,就会有问题
当用户第一次访问的时候,访问的第一个应用服务器,然后在客户端中保存下了SessionId
但是,当第二次访问,如果访问的是第三个服务器
此时,第三个服务器通过Cookie中的SessionId,并没有找到Session,此时,用户还是需要重新登陆。这就出现了问题,明明用户已经登录过了,现在还是需要重新登陆。如果下一次访问的第二个服务器,那么还是需要重新登陆,这显然不太好。
那么该如何解决上述问题?
①.让负载均衡器把同一个用户的而请求始终打到同一个机器上。即对于用户1来说,每次都让用户1访问第一个服务器。
②.把会话数据单独拎出来,放到一组独立的而机器上存储,例如Redis
此时,无论第一次客户端访问的是那个服务器,都会到Redis中存储会话。然后下次再访问的时候,也是从Redis中查看是否够存在Session。
这样,即使服务器挂了,会话也不会丢失,一直在Redis中存着。