Redis缓存入门

41 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天

Redis基础

一、什么是redis

Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。

二、为什么需要Redis

  • 数据库从单表,演进出了分库分表

  • MySQL从单机演进出了集群

    • 数据量增长

    • 读写数据压力的不断增加

      image-20230215190340840

  • 数据分冷热

    • 热数据:经常被访问的数据
  • 将热数据存储到内存中

    image-20230215190402177

三、Redis的数据结构

string类型

SDS即简单动态字符串(Simple Dynamic String),是redis自定义的,用于存储字符串的数据结构,SDS是二进制安全的

  • 可以存储字符串、数字、二进制数据

SDS结构定义

image-20230215191212371

  • len:buf的已用空间
  • alloc:buf的总空间
  • flags:数据类型
  • buf:实际字符串存储的空间

hash类型dict

Hash对象的实现方式有两种分别是ziplist、hashtable,其中hashtable的存储方式key是String类型的,value也是以key value的形式进行存储

image-20230215192548664

list

ziplist

压缩列表(ziplist)是一组连续内存块组成的顺序的数据结构,压缩列表能够节省空间,压缩列表中使用多个节点来存储数据

Quicklist

quicklist由双向链表和listpack实现

image-20230215192800137

set集合

Redis中列表和集合都可以用来存储字符串,但是Set是不可重复的集合,而且set集合是无序的

Set的底层实现是ht和intset

  • ht:哈希表
  • inset:整数集合,它可以保存int16_tint32_t 或者int64_t 的整数值

Zset集合

ZSet是有序集合,底层实现是ziplistskiplist实现的

  • skiplist也叫做跳跃表,跳跃表是一种有序的数据结构

    image-20230215193603459

四、redis基本工作原理

  • 数据从内存中读写

  • 数据保存到硬盘上防止数据丢失

    • 增量数据保存到AOF文件

    • 全量数据保存到RDB文件

      image-20230215195531291

  • 单线程处理所有命令

    image-20230215194521753

五、redis注意事项

大key

大key的定义

image-20230215195819884

大key的危害

  • 读取成本高

  • 容易导致慢查询(过期、删除)

  • 主从复制异常,服务阻塞无法响应正常请求

    image-20230215200030100

消除大key的方法

  1. 拆分

    将大key拆分成小key

    image-20230215200233783

  2. 压缩

    image-20230215200246502

  3. 集合类结构hash、set、list、zset

    image-20230215200307433

热key

热key的定义

image-20230215200347878

消除热key的方法

  1. 设置localcache

    image-20230215200444948

  2. 拆分

    image-20230215200542230

容易导致redis慢查询的操作

image-20230215200642218

缓存穿透

热点数据绕过缓存,直接查询数据库

缓存穿透的危害

image-20230215200812194

减少缓存穿透

image-20230215200834797

缓存雪崩

大量缓存数据同时过期

如何避免缓存雪崩