Redis学习笔记 | 青训营

90 阅读5分钟

Redis是一种开源的内存数据结构存储系统,它可以用作数据库、缓存和消息中间件。"Redis"是"Remote Dictionary Server"的缩写,它允许将数据存储在内存中,并通过网络访问和操作这些数据。不同于关系型数据库,它是一种KV数据库。

Redis支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合。它提供了丰富的操作命令,使开发人员可以对这些数据结构进行高效的读取、写入和查询操作。Redis还具有一些特殊功能,例如发布/订阅、事务和持久化选项,使其成为一个功能强大的工具。

由于Redis将数据存储在内存中,它具有非常快的读取和写入速度,适用于需要高性能数据存储和访问的场景。它经常用于缓存频繁访问的数据,以减轻后端数据库的负载,提高应用程序的响应速度。此外,Redis还支持数据的持久化,可以将数据写入磁盘以防止数据丢失。

Redis是一个流行的工具,被广泛应用于Web应用程序、分布式系统和实时数据处理等领域。它提供了多种编程语言的客户端库,使开发人员可以方便地在各种应用程序中使用Redis。

安装redis

查看官方文档:Get started with Redis | Redis
安装redis在WSL2上:

sudo apt update
sudo apt install redis

启动redis服务:redis-server,然后使用另一个终端redis-cli连接,进行ping测试:

image.png

Redis应用案例

连续签到

使用set命令生成一个字符串的kv,key表示用户名id,value是连续签到的天数。
调用两次连续签到功能,由原来的252天,变成了254天。

image.png

image.png 过期时间也变为了两天之后。

消息通知

用list作为消息队列。 推送消息:

image.png 收到消息: image.png

计数

通过hash结构来进行计数相关存储。这种有许多关联到一起的数据,就像字典一样,用kv来实现类似关系数据库中的存储方式。

image.png

排行

使用redis的有序集合实现该需求。redis的有序集合以跳表为基础的数据结构,能够实现有序的快速查找,类似于红黑树,但优势是能够快速定位一段有序的区间。

Redis使用注意事项

大key和热key

对于string类型,如果值大于了10KB就认为是大key。对于复杂类型,元素数量大于5000个或者总占用超过10MB就是大Key。大key的读取和删除成本高,容易导致慢查询,从而产生一系列问题,包括主从复制异常,服务阻塞等。
消除大key的常见方式是分块和压缩。一种是直接将大key分开,一种是先将数据压缩再存入redis。而对于复杂类型例如hash,可以采用冷热分隔的方式,只存储热数据,冷数据访问数据库获取。
热key指用户访问一个key的QOS很高,导致CPU负载突增或者不均。解决热key可以在业务侧设置本地缓存,让用户在访问时,优先访问本地缓存中的数据,另外一种方式就是拆分,将热key放到多个实例上,当然这要面临数据短暂不一致的风险。

慢查询场景

  • 一次传入的kv太多
  • zadd时间复杂度为O(logn)当n变大后,即使只插入一个元素,也会消耗比较久的时间
  • 操作的当个value过大,也就是大key

缓存穿透和缓存雪崩

缓存穿透是热点数据绕过缓存,直接查询数据库,缓存雪崩是大量缓存直接过期。
当查询一个一定不存在的数据时,这种数据一定不会被缓存,因此也就会去询问db,如果遇到大量这种查询,会大大增加db的压力。
同一时间有大量key过期,也会导致大量请求直接落到db上,导致查询变慢。
减少缓存穿透的方法,缓存空值和布隆过滤器。
避免缓存雪崩的方法,将缓存失效的时间分开,也就是增加一个随机值,对热点数据,缓存时间设置的长一点,而冷数据则短一些;使用缓存集群,避免单机宕机产生的缓存雪崩。

redis集群部署方式

  • 主从复制 Master-Slave Replication 一个主节点,负责写操作和部分读操作,其他作为从节点,负责读操作。主节点负责写操作的原始数据,从节点通过异步复制主节点的数据来提供读操作的负载均衡和高可用性。
  • 哨兵模式 Sentinel 多个哨兵监控主节点状态,在主节点故障时自动提升为主节点,实现故障切换和自动恢复。
  • Redis Cluster 通过分区将数据分布在不同的节点上,使用hash slots管理数据分布,在节点故障时进行自动迁移和重新分配,客户端可以直接连接到任何一个节点,节点会协调数据的读写操作。