学了redis不会实战?看这篇就够了
适用人群:熟悉redis的指令,但不了解使用场景的人群。
本文会详细描述各个场景的伪代码和对应的redis指令,至于为什么只是伪代码是因为每个语言操作redis的方式不一致,但是思想是一致的,只需要根据这个思想去找对应的api即可。
String 命令实战
String的命令主要是有三大运用场景:分别是分布式锁的运用,限流操作和业务缓存。
1.业务缓存
场景复现:某个活动即将在 11月11日开展。预期数据库的访问压力陡增。
解决方案:利用Redis,提前将要被多次访问的数据放入redis,做到“缓存预热”。让用户进入我们活动页面的时候,先去搜索缓存,不直接访问数据库,做到释放数据库的压力。
对应redis中的指令
set data "data"
get data
复制代码
伪代码
void cacheData(){
//1.从数据库中获取热点数据
//2.将此类数据序列化
//3.将 (data-data的id) 作为key,序列化的data作为value,利用string的set方法,存入redis。将活动的持续时间作为TTL
}
void getData(id){
//1.将data和id拼接作为key,根据key聪redis中根据string的get指令,进行查询。
//2.1查询到,直接返回
//2.2没有查询到,根据id去数据库中查找,如果有,就直接返回,并存入redis中。
}
复制代码
2.分布式锁
场景复现:多个服务去抢夺资源,有并发,线程安全问题。
解决方案:利用redis的set ... nx命令,实现分布式锁的效果。
为什么它叫分布式锁呢?其实是因为多个服务都可以连接到一个redis中,相当于,水库里的水很多,但是总要从一个管道里流出一样,这个管道就相当于控制,同一时间内,只有一部分水可以流出。
对应redis中的指令
set key value NX
复制代码
当目标key不存在的时候,才允许写入这个key,如果key已经存在,这个key就写不进去
伪代码
void tryLock(id){
//1.不断抢锁直到抢到
while(true){
//1.1.把 (update+传入的id)作为key,当前线程的名称作为value,使用nx指令,设置5s的过期时间(避免因为系统原因未能释放,则导致锁无法释放,这是兜底措施)
//1.2.1.如果1.1步骤失败,说明抢锁失败,进入下一次循环,继续抢锁。
//1.2.2.如果成功,就break,结束循环
}
//2.执行业务逻辑
//3.删除 (update+传入的id)的key的值,相当于释放锁。
}
复制代码
3.限流
场景复现:高并发场景下,抢购,秒杀等,流量峰值很高,但是后端业务的资源很有限