8.4 Redis缓存实战分析

8.4.1 缓存不存在的键,以防穿透

代码已经实现.见8.3.4 模拟缓存穿透现象

8.4.2 合理设置超时时间,以防内存溢出

代码已经实现.见8.3.5 模拟内存使用不当的场景

8.4.3 超时时间外加随机数,以防穿透

我们在之前设置的所有超时时间均为1小时(3600秒).假设我们在某一时刻批量添加了几千个缓存数据,那么按照之前程序设置的超时时间,在1小时之后,这几千个key会同时失效.那么对这批数据的请求会被同时发送到MySQL(当然我们是假定会有对这几千个key的请求),那么MySQL同样有可能崩溃.

解决方法:设置超时时间的数值采用整数 + 随机数的方式

在8.3小节的代码基础上修改:

工程结构如下:

(base) yanglei@yuanhong mysqlAndRedis % tree ./
./
├── biz
│   └── student.go
├── cache
│   ├── conf.go
│   ├── conn.go
│   ├── genExpireSecond.go
│   └── student.go
├── controller
│   └── student.go
├── db
│   ├── conf.go
│   ├── conn.go
│   └── student.go
├── go.mod
├── go.sum
├── lib
│   └── randInt.go
├── main.go
├── request
│   └── student
│       └── getStudentById.go
└── resp
    └── response.go

8 directories, 15 files

lib/randInt.go:

cache/genExpireSecond.go:

cache/student.go:

运行后查询id = 1id = 2的数据:

可以看到,各个键的生存时间都有所区别了

Last updated