这是我参与「第五届青训营」伴学笔记创作活动的第14天
前言
redis是后端开发中常用的中间件,本文主要介绍在实际开发中redis是如何使用的。
什么是redis
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
在实际开发中,由于数据量的不断增长和数据读写压力的不断增加,加之数据需求的不均衡,为了提高常用数据的读的速度,我们需要将这部分数据放在内存中,避免读写io造成访问瓶颈。在这个时候,我们就使用redis作为缓存来帮助我们管理在内存中的数据,同时简化变成难度。
Redis应用案例
连续签到
在连续签到应用中,我们将签到数据放入redis,并设置过期时间。如果签到,刷新redis的过期时间。如果过期,那么redis会自动删除这部分数据。
数据结构-sds
- 可以存储字符串、数字、二进制数据
- 通常配合expire
- 场景:存储计数、Session等
消息通知
使用List作为消息队列。当某事物更新时,就将更新后的事务推送到对应的处理平台供使用者处理
数据结构-QuickList
OuickList由一个双向链表和listpack实现
计数
一个用户有多项计数需求,可通过hash结构存储
数据结构-dict
- rehash:将ht[0]中的数据迁移到ht[1]中。适合在数据量小的情况下使用
- 渐进式rehash:逐步迁移数据。适合在数据量大的时候使用
排行榜
积分变化时,排名要实时更新。结合dict后,可实现通过key操作跳表的功能。
- 数据结构 zskiplist
限流
要求限定时间内通过指定个请求,超过则拒绝。
分布式锁
在并发场景下使用。要求一次只有一个协程可以使用。 可以使用redis的setnx实现。利用特性
- redis 单线程
- setnx只有设置过才能执行成功
注意事项
使用大key,热key
大key
使用大key的危害
- 读取成本高
- 容易导致慢查询(过期,删除)
- 主从复制异常,服务阻塞,无法响应正常请求
- 请求redis超时报错 消除大key的方法
- 拆分
- 压缩
- 集合类结构可以拆分和区分冷热
热key
读取量和读频率特别高的key。
解决热key的方式
- 设置cache:在服务侧设置cache,当服务侧cache未命中再去请求redis
- 拆分:将这个key分布放到若干个redis实例中。
- 设置访问代理
慢查询
解决方式
- 避免一次传入大量k-v
- 避免频繁使用zset
- 避免操作一个过大的value
- 避免删除、过期一个大key
缓存穿透、缓存雪崩
- 穿透:热点数据查询绕过缓存直接查询数据库
- 雪崩:大量缓存同时过期
穿透的危害
- 查询一个一定不存在的数据。容易引起整个服务宕机
- 缓存过期时,大量请求直接打到数据库上,引起数据库宕机
减少穿透
- 缓存空值
- 布隆过滤器
避免雪崩
- 缓存空值:将缓存失效时间设置为不同时间。
- 使用缓存集群
总结
在实际使用中,使用redis可以加快访问速度。但是使用不当会导致严重的事故。应当严格按照要求规范使用。