redis 入门常用数据类型和场景应用

redis 简介

开源的高性能 键值对 k-v 结构存储数据库,它在内存中存储数据,并提供了持久化功能,可以将数据保存到磁盘中,属于NoSQL( not-only sql 非关系型数据库)的数据库的一种。

特点优势

  • 多种数据结构:字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)
  • 支持 两种持久化方式 RDB 和 AOF
  • 高性能:内存数据库,数据存储在内存中,因此读写速度非常快。它采用单线程模型,避免多线程竞争问题
  • 支持事务:可以将多个命令打包执行,保证这些命令要么全部执行成功,要么全部失败,保持数据的一致性
  • 高可用与分布式: 支持主从复制、哨兵和集群等
  • 简单队列:支持发布/订阅模式,可以实现消息的发布和订阅,实现实时通信

为什么快

内存存储:Redis将数据存储在内存中,而不是像传统的磁盘存储数据库那样将数据写入到硬盘上。由于内存的读写速度远远快于磁盘,因此Redis能够实现极快的读写性能。

单线程模型:Redis采用单线程模型,每个Redis实例都由单个主线程来处理所有的客户端请求。虽然单线程看起来似乎会限制其性能,但这实际上是Redis的一大优势。单线程模型消除了多线程之间的竞争和锁等开销,使得Redis能够充分利用CPU资源,并且避免了多线程带来的复杂性。此外,Redis在内部使用了I/O多路复用技术(例如epoll或kqueue)来处理并发请求,使得单线程能够同时处理多个客户端连接。

非阻塞IO:Redis使用了非阻塞IO,也就是在读写操作时不会阻塞其他操作。在读取数据时,如果内存中没有所需的数据,Redis会立即返回一个空结果,而不会等待数据从磁盘加载进来。这样即使在高并发情况下,Redis也能够快速地响应请求。

高效的数据结构:Redis支持多种高效的数据结构,比如字符串、哈希、列表、集合、有序集合等。这些数据结构的设计和实现都非常高效,能够在常量时间内完成查找、插入、删除等操作,保证了Redis的高速性能。

异步操作:Redis支持异步操作,比如异步持久化和异步复制。异步操作能够让Redis在进行磁盘持久化和主从复制时不会阻塞其他操作,提高了整体的性能。

优化的网络协议:Redis使用RESP(Redis Serialization Protocol)作为网络协议,RESP是一种简单、高效的二进制协议。RESP协议的设计使得网络传输的数据量尽可能地减少,减少了网络传输的开销,提高了性能。

原子性操作:Redis支持很多原子性操作,比如INCR、DECR、SETNX等。原子性操作能够在一条命令中完成多个操作,而且这些操作是不可中断的,保证了数据的一致性

常用数据类型

常见的有五种:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合), 后面 Redis 版本的更新,新增四种数据类型: BitMap(2.2 版新增)、HyperLogLog(2.8 版新增)、GEO(3.2 版新增)、Stream(5.0 版新增)

应用场景

缓存: 作为缓存数据库,Redis 可以将经常访问的数据存储在内存中,避免频繁读写数据库,提高应用的响应速度。缓存可以存储热点数据,减轻后端数据库的压力,提高系统的吞吐量。比如商品信息,用户信息,表单信息等等。

计数器: 利用 Redis 的原子性操作,可以实现高效的计数器功能,比如网站的点赞、浏览次数等统计功能。由于 Redis 原子性操作的特性,计数器的更新可以并发执行而不会出现竞争问题。

消息队列: Redis 的发布订阅功能和列表数据结构可以实现简单的消息队列,用于解耦系统的各个模块。生产者将消息发布到指定频道,消费者订阅感兴趣的频道并处理消息,实现异步消息传递。

排行榜: 使用有序集合数据结构,可以实现排行榜功能,比如游戏中的玩家排名。通过有序集合的分数属性,可以对玩家的得分进行排序和排名,实时显示排行榜。

会话缓存: 在 Web 应用中,可以使用 Redis 存储用户的会话数据,实现分布式会话管理。用户登录后,可以将会话数据存储在 Redis 中,从而实现多台服务器之间的会话共享。比如单点登录、用户固定访问某台服务器

过滤器: 比如布隆过滤器