关于Redis,你真的懂吗?

一.同样是缓存,map和Redis的区别

  1. Redis是一种高性能的非关系型数据库,它可以存储大量的数据。相比之下,Java中的Map只能存储有限的数据,通常不能超过JVM的堆大小限制。

  1. 除了存储大量的数据,Redis还支持本地持久化,这意味着数据可以在磁盘上持久保存,以便在重启Redis时恢复数据。Java中的Map无法进行本地持久化。

  1. Redis还支持作为分布式缓存,这意味着数据可以在多个节点上进行缓存和访问。然而,Java中的Map只能在同一个JVM中进行缓存,无法跨越多个节点。

  1. Redis还具有很高的并发性能,它可以支持每秒百万级的并发。相比之下,Java中的Map无法达到这种高性能水平。

  1. Redis还具有过期机制,可以让存储的数据在一定时间后自动过期并被删除。Java中的Map没有内置的过期机制。

  1. Redis具有非常丰富的API,可以支持各种不同的应用场景。相比之下,Java中的Map功能相对简单,无法满足一些复杂的应用需求。

二.Redis单线程的优点

使用单线程的代码更加清晰,其处理逻辑也更加简单。相比于多线程的代码,它不需要考虑各种锁的问题,避免了加锁和释放锁的操作,并消除了因死锁而导致的性能问题。此外,单线程的代码也不会存在因多线程切换而消耗CPU的问题。

然而,单线程的代码无法充分发挥多核CPU的优势。为了克服这个问题,可以通过启动多个Redis实例来完善。虽然这样会增加管理和部署的复杂度,但能够更好地利用计算资源,并提高整体的性能。

三.Redis一直都是单线程吗

在Redis的早期版本中,它是单线程的。但是在Redis 6.0之后,它开始支持多线程。为了解决单线程带来的性能瓶颈,Redis内部采用了基于epoll的多路复用技术,并可以部署多个Redis服务器来提高性能。

Redis主要的性能瓶颈是内存和网络。增加内存是比较简单的,但网络方面却是一个大问题。因此,在Redis 6.0中,它引入了多线程的概念,并且在网络IO处理方面进行了优化,包括网络数据的读写和协议解析等。需要注意的是,虽然Redis 6.0引入了多线程,但执行命令的核心模块仍然是单线程的,这是为了保证数据的一致性和避免竞争条件的发生。

四.Redis优点有哪些?

  1. Redis是KV数据库,MySQL是关系型数据库,Redis比MySQL更快;

  1. Redis主要的数据操作在内存中进行,而MySQL主要将数据存储在硬盘中,所以Redis更快;

  1. Redis支持持久化,可以将内存中的数据异步地保存到硬盘上,以避免Redis宕机时数据的丢失;

  1. Redis具有很高的性能,读取速度为110000次/秒,写入速度为81000次/秒;

  1. Redis支持多种数据结构,包括KV键值对、列表、集合、有序集合、哈希表等;

  1. Redis支持数据备份,可以通过主从复制来备份数据;

  1. Redis支持简单的事务,确保操作的原子性;

  1. Redis支持读写分离,可以减轻读取的压力;

  1. Redis支持哨兵模式,可以实现故障的自动转移;

  1. Redis采用单线程操作,避免了频繁的上下文切换;

  1. Redis采用非阻塞I/O多路复用机制,性能卓越。

五.Redis缺点有哪些?

  1. 数据存储在内存中,容易造成数据丢失。当Redis宕机或重启时,未被持久化到硬盘的数据将会丢失,因此需要使用持久化机制来避免这种情况。

  1. 存储容量受内存的限制,只能存储少量的常用数据。当数据量增大时,需要增加内存容量或使用其他的数据存储方式。

  1. 缓存和数据库双写一致性问题。当使用Redis作为缓存时,需要考虑缓存与数据库之间的数据一致性问题,例如如何保证缓存数据与数据库数据的同步。

  1. 容易出现内存穿透、缓存击穿、缓存雪崩等问题。当缓存数据过期或被清空时,会导致大量请求直接落到数据库上,导致数据库压力过大。

  1. 修改配置文件后,需要进行重启,将硬盘中的数据同步到内存中,消耗的时间较长,而且数据同步的时间里Redis不能提供服务。需要注意配置文件的修改和重启操作对服务的影响。

六.Redis常见业务场景

  1. 分布式集群:Redis提供了分布式集群方案Redis Cluster,可以实现数据的分片存储和高可用性,适用于大规模分布式系统。

  1. 队列服务:Redis的list数据结构可以用作队列,提供了LPUSH、RPUSH、LPOP、RPOP等操作,支持多个消费者并发地处理队列中的任务。

  1. 实时排行榜:Redis的有序集合数据结构可以用于实现排行榜功能,支持高效地添加、删除和查询成员,还可以通过ZREVRANGE、ZRANK等操作获取成员在排行榜中的位置。

  1. 分布式缓存:Redis可以作为分布式缓存,用于缓存热点数据和减少数据库的读取次数,提高系统的性能和响应速度。

  1. 会话存储:Redis可以用于存储用户的会话信息,提供了操作如SET、GET、EXPIRE等方法,还可以通过key前缀的方式实现多用户的会话存储。

  1. 地理位置服务:Redis的地理位置数据类型可以用于实现地理位置服务,支持快速地查询附近的位置、计算距离等操作,适用于LBS应用场景。

  1. 消息队列:Redis的发布/订阅功能可以用于实现消息队列,支持多个订阅者同时监听一个频道,实现高效的消息传递和通知。

七.Redis的常见数据类型

一.String

String 是最基本的 key-value 结构,key 是唯一标识,value 是具体的值,value其实不仅是字符串, 也可以是数字(整数或浮点数),value 最多可以容纳的数据长度是 512M。

二.List

List 列表是一个简单的字符串列表,它们按照插入顺序进行排序,并且可以从头部或尾部添加元素。

每个列表支持超过 40 亿个元素,最大长度为 2^32 - 1。

List 主要有 push/pop 功能,一般用于栈、队列、消息队列等场景。

left 或 right 方向都可以进行插入操作,如果键不存在,会创建一个新的链表。如果键存在,则会将新内容追加到列表中。如果列表中的值全部被移除,则对应的键也会被删除。

三.Hash

Hash 是一个键值对(key - value)集合,value也是一个hash,相当于 Map<String,Map<Object,Object>>。

四.Set

Set 类型是一个无序并唯一的键值集合,它的存储顺序不会按照插入的先后顺序进行存储。 一个集合最多可以存储 2^32-1 个元素。概念和数学中个的集合基本类似,可以交集,并集,差集等等,所以 Set 类型除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集。

五.Zset

Zset 类型(有序集合类型)相比于 Set 类型多了一个排序属性 score(分值),对于有序集合 ZSet 来说,每个存储元素相当于有两个值组成的,一个是有序结合的元素值,一个是排序值。

有序集合保留了集合不能有重复成员的特性(分值可以重复),但不同的是,有序集合中的元素可以排序

六.BitMap

Bitmap,即位图,是一串连续的二进制数组(0和1),可以通过偏移量(offset)定位元素。BitMap通过最小的单位bit来进行0|1的设置,表示某个元素的值或者状态,时间复杂度为O(1)

七.BitField

通过bitfield命令可以一次性操作多个比特位,它会执行一系列操作并返回一个响应数组,这个数组中的元素对参数列表中的相应操作的执行结果。

八.HyperLogLog

Redis HyperLogLog 是 Redis 2.8.9 版本新增的数据类型,是一种用于「统计基数」的数据集合类型,基数统计就是指统计一个集合中不重复的元素个数。但要注意,HyperLogLog 是统计规则是基于概率完成的,不是非常准确,标准误算率是 0.81%。

所以,简单来说 HyperLogLog 提供不精确的去重计数。

HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的内存空间总是固定的、并且是很小的。

在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数,和元素越多就越耗费内存的 Set 和 Hash 类型相比,HyperLogLog 就非常节省空间。

九.GEO

Redis GEO 是 Redis 3.2 版本新增的数据类型,主要用于存储地理位置信息,并对存储的信息进行操作。

在日常生活中,我们越来越依赖搜索“附近的餐馆”、在打车软件上叫车,这些都离不开基于位置信息服务(Location-Based Service,LBS)的应用。LBS 应用访问的数据是和人或物关联的一组经纬度信息,而且要能查询相邻的经纬度范围,GEO 就非常适合应用在 LBS 服务的场景中。

十.Stream

Redis Stream 是 Redis 5.0 版本新增加的数据类型,Redis 专门为消息队列设计的数据类型。

猜你喜欢

转载自blog.csdn.net/MaoXiaoMiaoYa/article/details/129626683