Redis
Redis
是什么:基于内存的key-value结构的数据库
特点:
- 基于内存存储,读写性能高
- 适合存储热点数据(热点商品、资讯、新闻)
数据类型
常用命令:
字符串:
- set key value—设置指定key的值
- get key—获取指定key的值
- setex key seconds value—设置指定key的值,并在seconds后过期(常用于验证码)
- setnx key value—只有在key不存在时设置key的值
哈希:
- hset key field value—设置指定key的字段和值
- hget key field—获取指定key的字段的值
- hdel key field—删除指定key的字段
- hkeys key—显示所有字段
- hvals key—显示所有值
列表:
集合:
有序集合:
通用命令:
Java中操作Redis
常见问题的解决方式
缓存击穿
是指一个热点数据的过期导致大量的请求给到数据库,可能会造成数据库宕机。
解决方式:
永不过期(不推荐):设置热点数据永不过期或者过期时间比较长。
加锁(看情况):在缓存失效后,通过设置互斥锁确保只有一个请求去查询数据库并更新缓存。
缓存雪崩
缓存在同一时间大面积的失效,导致大量的请求都直接落到了数据库上,对数据库造成了巨大的压力。
解决方式:
针对 Redis 服务不可用的情况:
- Redis 集群:采用 Redis 集群,避免单机出现问题整个缓存服务都没办法使用。Redis Cluster 和 Redis Sentinel 是两种最常用的 Redis 集群实现方案。
- 多级缓存:设置多级缓存,例如本地缓存+Redis 缓存的二级缓存组合,当 Redis 缓存出现问题时,还可以从本地缓存中获取到部分数据。
针对大量缓存同时失效的情况:
- 设置随机失效时间(可选):为缓存设置随机的失效时间,例如在固定过期时间的基础上加上一个随机值,这样可以避免大量缓存同时到期,从而减少缓存雪崩的风险。
- 提前预热(推荐):针对热点数据提前预热,将其存入缓存中并设置合理的过期时间,比如秒杀场景下的数据在秒杀结束之前不过期。
- 持久缓存策略(看情况):虽然一般不推荐设置缓存永不过期,但对于某些关键性和变化不频繁的数据,可以考虑这种策略。
缓存穿透
缓存穿透说简单点就是大量请求的 key 是不合理的,根本不存在于缓存中,也不存在于数据库中。这就导致这些请求直接到了数据库上,根本没有经过缓存这一层,对数据库造成了巨大的压力,可能直接就被这么多请求弄宕机了。
解决方式:
1)缓存空对象
2)布隆过滤器
3)接口限流
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 dmw's blog!
评论