这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天
Redis基础
一、什么是redis
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。
二、为什么需要Redis
-
数据库从单表,演进出了分库分表
-
MySQL从单机演进出了集群
-
数据量增长
-
读写数据压力的不断增加
-
-
数据分冷热
- 热数据:经常被访问的数据
-
将热数据存储到内存中
三、Redis的数据结构
string类型
SDS即简单动态字符串(Simple Dynamic String),是redis自定义的,用于存储字符串的数据结构,SDS是二进制安全的
- 可以存储字符串、数字、二进制数据
SDS结构定义
- len:buf的已用空间
- alloc:buf的总空间
- flags:数据类型
- buf:实际字符串存储的空间
hash类型dict
Hash对象的实现方式有两种分别是ziplist、hashtable,其中hashtable的存储方式key是String类型的,value也是以key value的形式进行存储
list
ziplist
压缩列表(ziplist)是一组连续内存块组成的顺序的数据结构,压缩列表能够节省空间,压缩列表中使用多个节点来存储数据
Quicklist
quicklist由双向链表和listpack实现
set集合
Redis中列表和集合都可以用来存储字符串,但是Set是不可重复的集合,而且set集合是无序的
Set的底层实现是ht和intset
- ht:哈希表
- inset:整数集合,它可以保存
int16_t、int32_t或者int64_t的整数值
Zset集合
ZSet是有序集合,底层实现是ziplist和skiplist实现的
-
skiplist也叫做跳跃表,跳跃表是一种有序的数据结构
四、redis基本工作原理
-
数据从内存中读写
-
数据保存到硬盘上防止数据丢失
-
增量数据保存到AOF文件
-
全量数据保存到RDB文件
-
-
单线程处理所有命令
五、redis注意事项
大key
大key的定义
大key的危害
-
读取成本高
-
容易导致慢查询(过期、删除)
-
主从复制异常,服务阻塞无法响应正常请求
消除大key的方法
-
拆分
将大key拆分成小key
-
压缩
-
集合类结构hash、set、list、zset
热key
热key的定义
消除热key的方法
-
设置localcache
-
拆分
容易导致redis慢查询的操作
缓存穿透
热点数据绕过缓存,直接查询数据库
缓存穿透的危害
减少缓存穿透
缓存雪崩
大量缓存数据同时过期