这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天,今天主要了解了Redis的基本概念和一些使用的注意点,重点学习了Redis内部的SDS和哈希数据结构。
基本概念
为什么需要Redis
随着数据量的不断增长,数据库的读写压力不断增加,可将热数据存储到内存中加快访问速度。
Redis原理
- 数据从内存读写
- 数据库存硬盘,增量数据AOF,全量数据RDB
- 单线程处理所有操作命令
场景
本章节是借一些场景介绍了Redis的常用数据结构
string数据结构-SDS
| len | alloc | flags | buf |
|---|
key指向sds指针,向左找元数据,flag数据类型,alloc内存多长,len实际用到了多少。向右读取数据。
flag可表示五种数据类型,分别是 sdshdr5、sdshdr8、sdshdr16、sdshdr32 和 sdshdr64。其len和alloc的数据类型不同。可灵活存储不同大小的字符串,从而节省内存空间。
hash
- 哈希冲突:链式哈希 利用链表把映射到同一个bucket里边的键连接起来。
- 扩容的rehash开销:渐进式rehash
准备两个哈希表,用于rehash时交替保存数据。正常存
ht[0];开始rehash,键值对被迁移到哈希表ht[1];迁移完成ht[1]赋值给ht[0],ht[1]清空。
注意事项
大key
大key如 大于10KB的string
大key危害:1. 读取成本高;2. 导致慢查询;3. 主从复制异常。
业务层表现:超时
消除办法:1.拆分,大key查分成若干小key,2.压缩,选择合适的压缩算法,3.冷热分离\
热key
QPS超过500就是热key 方案
- localcache:业务服务侧设置Localcache,降低Redis的QPS
- 拆分:代价是更新要更新多个key,可能存在数据不一致的状态
慢查询
- 批量一次性传入过多的key
- zset大小超过5K以上
- 大key
缓存
缓存穿透:热点数据查询绕过缓存
bloom filter算法价差key是否合法
缓存雪崩:大量缓存同时过期
原有失效时间基础上加一个随机值,防止同时过期