Redis初探

34 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第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

image.png 使用大key的危害

  • 读取成本高
  • 容易导致慢查询(过期,删除)
  • 主从复制异常,服务阻塞,无法响应正常请求
  • 请求redis超时报错 消除大key的方法
  • 拆分
  • 压缩
  • 集合类结构可以拆分和区分冷热

热key

读取量和读频率特别高的key。

解决热key的方式

  • 设置cache:在服务侧设置cache,当服务侧cache未命中再去请求redis
  • 拆分:将这个key分布放到若干个redis实例中。
  • 设置访问代理

慢查询

解决方式

  • 避免一次传入大量k-v
  • 避免频繁使用zset
  • 避免操作一个过大的value
  • 避免删除、过期一个大key

缓存穿透、缓存雪崩

  • 穿透:热点数据查询绕过缓存直接查询数据库
  • 雪崩:大量缓存同时过期

穿透的危害

  • 查询一个一定不存在的数据。容易引起整个服务宕机
  • 缓存过期时,大量请求直接打到数据库上,引起数据库宕机

减少穿透

  • 缓存空值
  • 布隆过滤器

避免雪崩

  • 缓存空值:将缓存失效时间设置为不同时间。
  • 使用缓存集群

总结

在实际使用中,使用redis可以加快访问速度。但是使用不当会导致严重的事故。应当严格按照要求规范使用。