这是我参与「第五届青训营」伴学笔记创作活动的第 18 天
在项目搭建过程中使用到Redis,结合前几天所讲过的redis相关课程,在这里予以记录。
Redis基础
Redis基础扫盲
Redis:Remote DIctionary Server,key-value 存储系统,是跨平台的非关系型数据库。
Redis中所用到的数据结构:
- 字符串(String)
- 哈希(Hash)
- 列表(list)
- 集合(sets)
- 有序集合(sorted sets)
等类型
从需求侧来看Redis的出现必要性:
- 数据从单表演进出了分库分表。
- MySQL从单机演进出了集群,数据量增长,读写数据的压力不断增大(不断有Request访问数据库)
久而久之,人们就将数据类型依据访问量分出冷热的概念:
- 热数据:存储在内存中的数据
- 冷数据:存储在磁盘中
Redis原理(面试热点)
首先明确:Redis 的数据存储在内存中,如果数据全都在内存里,单线程的去操作就是效率最高的。
为什么呢?
在多线程的情况中,上下文切换所花费的时间远大于直接从内存中读取数据所花费的时间。如果这其中没有了上下文的切换,那么速度耗时方面就会大大优化——没有上下文切换/单线程 是最优解。
Redis 用单个 CPU 绑定一块内存的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成的,所以它是单线程处理。
但是一个正式的 Redis Server 运行的时候并不止一个线程,例如 Redis 进行持久化的时候会以子进程或者子线程的方式执行。
Redis的IO复用:
redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放到文件事件分派器,事件分派器将事件分发给事件处理器。
Redis使用记录
什么是大Key?
对于String类型: value的字节个数大于10KB即为大Key
对于Hash/Set等复杂数据类型:元素个数大于5K或总Value字节大于10MB,即为大Key。
大Key的危害:
- 读取成本高
- 容易导致查询过慢(过期、删除)
- 主从复制异常、服务阻塞、无法响应请求
消除大Key的方法:
将一个大Key拆分为多个小Key
或者将Value压缩后再写入redis,解压后再使用。通过压缩算法解压中,压缩率高,则耗时越长
热Key
顾名思义:读取量特别大、次数特别多
解决热Key的方法:
- 设置Local Cache:在访问Redis前,在业务服务侧设置Local Cache,降低访问Redis的QPS。如果Local Cache缓存过期或未命中,则从Redis中将数据更新到Local Cache。
- 拆分热Key为多个
三大常见概念-缓存穿透、击穿、雪崩
该部分内容在实际开发中还没遇到过(访问量确实没有辣么大 = =),在这里仅仅是对概念进行记录。
缓存穿透
指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。
缓存击穿
是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
缓存雪崩
是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至宕机。
未完待续~