使用Redis存储相比直接使用Java内存的Map有以下几个优势:
持久化:Redis支持数据持久化,即使发生服务器重启或意外宕机,数据仍然可以被恢复。而使用Java内存的Map,当应用程序关闭或重启时,数据将会丢失。
分布式支持:Redis是一个分布式数据库,可以通过配置集群来水平扩展和处理大规模的数据集。相比之下,Java内存的Map仅限于单个应用程序实例,无法进行分布式部署。
高级数据结构:Redis提供了丰富的数据结构,如字符串、哈希表、列表、集合和有序集合等,并且支持在这些数据结构上执行各种原子操作和高级操作。这使得Redis能够更方便地处理复杂的数据操作和查询。而Java内存的Map只提供了基本的键值对数据结构。
缓存功能:Redis常用于作为缓存层,可以通过设置过期时间、LRU策略等来自动管理缓存数据,帮助减轻数据库的负载压力。而Java内存的Map没有提供像Redis一样的缓存管理功能。
数据类型灵活性:Redis支持多种数据类型并提供了相应的操作方法,可以满足不同场景下的需求。Java内存的Map只能存储简单的键值对。
需要注意的是,Redis作为一个独立的数据库服务,与应用程序通过网络进行通信,而Java内存的Map直接在应用程序内部使用。因此,使用Redis可能会引入一些额外的网络开销和延迟。对于较小规模的数据集和简单的数据需求,直接使用Java内存的Map可能更加适合。但对于大规模的、需要持久化、分布式支持以及复杂数据操作的场景,Redis是一个更强大和适用的选择。
为什么要用Redis?
从上面可知:Redis是基于内存,常用作于缓存的一种技术,并且Redis存储的方式是以key-value
的形式。
我们可以发现这不就是Java的Map容器所拥有的特性吗,那为什么还需要Redis呢?
- Java实现的Map是本地缓存,如果有多台实例(机器)的话,每个实例都需要各自保存一份缓存,缓存不具有一致性
- Redis实现的是分布式缓存,如果有多台实例(机器)的话,每个实例都共享一份缓存,缓存具有一致性。
- Java实现的Map不是专业做缓存的,JVM内存太大容易挂掉的。一般用做于容器来存储临时数据,缓存的数据随着JVM销毁而结束。Map所存储的数据结构,缓存过期机制等等是需要程序员自己手写的。
- Redis是专业做缓存的,可以用几十个G内存来做缓存。Redis一般用作于缓存,可以将缓存数据保存在硬盘中,Redis重启了后可以将其恢复。原生提供丰富的数据结构、缓存过期机制等等简单好用的功能。
1、本地缓存资源浪费
多个业务系统的节点每个都要存一份,10过节点的集群就浪费了9份。
2、本地缓存有内存一致性问题
不同节点的本地内存数据,版本会不一致。就是说A节点数据值是x2,而B节点还没来得及更新还是x1。这会导致不同用户请求,甚至同一个用户请求打到不同节点上,值不一样,造成业务错误。
3、本地缓存的机器内存有限
redis集群模式,是分片的,内存理论上可以无线扩展,轻松存个几百G。而业务程序不可能存的下。