以下内容转自掘金
作者:哪吒编程
同样是缓存,用map不行吗?
- Redis可以存储几十个G的数据,Map行吗?
- Redis的缓存可以进行本地持久化,Map行吗?
- Redis可以作为分布式缓存,Map只能在同一个JVM中进行缓存;
- Redis支持每秒百万级的并发,Map行吗?
- Redis有过期机制,Map有吗?
- Redis有丰富的API,支持非常多的应用场景,Map行吗?
Redis为什么是单线程的?
- 代码更清晰,处理逻辑更简单;
- 不用考虑各种锁的问题,不存在加锁和释放锁的操作,没有因为可能出现死锁而导致的性能问题;
- 不存在多线程切换而消耗CPU;
- 无法发挥多核CPU的优势,但可以采用多开几个Redis实例来完善;
Redis真的是单线程的吗?
- Redis6.0之前是单线程的,Redis6.0之后开始支持多线程;
- Redis内部使用了基于epoll的多路服用,也可以多部署几个Redis服务器解决单线程的问题;
- Redis主要的性能瓶颈是内存和网络;
- 内存好说,加内存条就行了,而网络才是大麻烦,所以Redis6内存好说,加内存条就行了;
- 而网络才是大麻烦,所以Redis6.0引入了多线程的概念,
- Redis6.0在网络IO处理方面引入了多线程,如网络数据的读写和协议解析等,需要注意的是,执行命令的核心模块还是单线程的。
Redis优缺点
1.优点
- Redis是KV数据库,MySQL是关系型数据库,Redis速度更快;
- Redis数据操作主要在内存中,MySQL主要将数据存储在硬盘,Redis速度更快;
- Redis同样支持持久化(RDB+AOF),Redis支持将数据异步将内存的数据持久化到硬盘上,避免Redis宕机出现数据丢失的问题;
- Redis性能极高,读的速度是110000次/秒,写的速度是81000次/秒;
- Redis数据类型丰富,不仅支持KV键值对,还支持list、set、zset、hash等数据结构的存储;
- Redis支持数据的备份,即master-slave模式的数据备份;
- Redis支持简单的事务,操作满足原子性;
- Redis支持读写分离,分担读的压力;
- Redis支持哨兵模式,实现故障的自动转移;
- 单线程操作,避免了频繁的上下文切换;
- 采用了非阻塞I/O多路复用机制,性能卓越;
2.缺点
- 数据存储在内存,容易造成数据丢失;
- 存储容量受内存的限制,只能存储少量的常用数据;
- 缓存和数据库双写一致性问题;
- 用于缓存时,容易出现内存穿透、缓存击穿、缓存雪崩的问题;
- 修改配置文件后,需要进行重启,将硬盘中的数据同步到内存中,消耗的时间较长,而且数据同步的时间里Redis不能提供服务;
Redis常见业务场景
- Redis是基于内存的nosql数据库,可以通过新建线程的形式进行持久化,不影响Redis单线程的读写操作
- 通过list取最新的N条数据
- 模拟类似于token这种需要设置过期时间的场景
- 发布订阅消息系统
- 定时器、计数器
- 缓存加速、分布式会话、排行榜、分布式计数器、分布式锁;
- Redis支持事务、持久化、LUA脚本、发布/订阅、缓存淘汰、流技术等特性;
总结
Redis是一个key-value存储系统,支持10种数据类型,总结了为何要用Redis替代map作为程序缓存、Redis为什么是单线程的、Redis的优缺点、Redis的常用场景,做了一次Redis的快速入门。