文章目录
1、为什么要使用Redis做缓存?
缓存的好处
使用缓存的目的就是提升读写性能。而实际业务场景下,更多的是为了提升读性能,带来更高的并发量。
Redis的好处
- 读取速度快,单机轻松10W+并发。
- 支持多种数据结构,包括字符串、列表、集合、有序集合、哈希等
- 拥有其他丰富的功能,主从复制、集群、数据持久化等
- 可以实现其他功能,消息队列、分布式锁等
2、为什么Redis单线程模型效率也能那么高?
- C语言实现,效率高:C语言程序运行时要比其他语言编写的程序快得多,因为它“离底层机器很近”
- 单线程的优势:使用了单线程后可以省去多线程的CPU上下文会切换的时间,也不用去考虑锁导致的性能消耗等问题,可维护性高
- Pipeline:Redis主要受限于内存和网络,几乎不会占用太多CPU。利用pipeline操作,减少命令在网络上的传输时间,将多次网络IO缩减为一次网络IO
- 存储实现优化:Redis的基础数据结构每一种至少有2种及2种以上的实现,在不同的大小或长度下选用适合的数据类型,达到极致的存储效率,从而提高写入和读取速度
3、Redis6.0为什么要引入多线程呢?
多线程只是针对IO线程,执行命令还是单线程。
Redis服务器可以处理80,000到100,000QPS,对于80%的公司来说,单线程的Redis已经足够使用了。但随着越来越复杂的业务场景,有些公司动不动就上亿的交易量,因此需要更大的QPS。所以Redis作者在6.0引入了多线程,性能提升至少一倍以上。当然集群方案也可以解决更大QPS的问题,但是集群方案还是有一些问题的:
- 常见集群方案是对数据进行分区并采用多个服务器,但该方案有非常大的缺点,例如要管理的Redis服务器太多,维护代价大
- 某些适用于单个Redis服务器的命令不适用于数据分区
- 数据分区无法解决热点读/写问题;数据倾斜、重新分配变得更加复杂等等
4、Redis常见数据结构以及使用场景
字符串(String)
使用场景
- 计数:使用Redis 作为计数的基础工具,它可以实现快速计数、查询缓存的功能,同时数据可以异步落地到其他数据源
- 共享Session:使用Redis将用户的Session进行集中管理,避免在访问分布式服务时Session不存在导致重新登录
- 限速:短信接口不被频繁访问,例如一分钟不能超过5次
哈希(Hash)
Java里提供了HashMap,Redis中也有类似的数据结构,就是哈希类型。但是要注意,哈希类型中的映射关系叫作field-value,注意这里的value是指field对应的值,不是键对应的值。
使用场景
哈希类型比较适宜存放对象类型的数据,我们可以比较下,如果数据库中表记录user为:
id | name | age |
---|---|---|
1 | test1 | 18 |
2 | test2 | 20 |
使用String类型
set user