Redis基础

对Redis的初步认识和配置

NoSQL型数据库

NoSQL(Not Only SQL)是指一类不使用传统关系型数据库结构的数据库。NoSQL数据库通常用于大规模数据存储、处理和快速访问的场景。与关系型数据库不同,NoSQL数据库不要求数据必须存储为表格形式,也不需要固定的模式(schema)。它们通常具有更高的扩展性、灵活性和适应性。

四大分类

  • 键值存储(Key-Value Stores)
    • 数据以键值对的形式存储。
    • 适合快速访问单个值。
    • 例如:Redis、Amazon DynamoDB。
  • 列族存储(Column Family Stores)
    • 数据按列而非行来存储。
    • 高效地存储和查询大规模的、非结构化的数据。
    • 例如:Apache Cassandra、HBase。
  • 文档存储(Document Stores)
    • 存储类似JSON、BSON或XML的文档数据,文档中可以包含嵌套的数据。
    • 适合存储和查询灵活的、层次化的数据。
    • 例如:MongoDB、CouchDB。
  • 图数据库(Graph Databases)
    • 以图形结构(节点、边和属性)存储数据,用于表示实体之间的关系。
    • 适合复杂的关系型数据查询。
    • 例如:Neo4j、ArangoDB。

与SQL数据库的对比

SQL NoSQL
数据结构 结构化 非结构化
数据关联 不同数据之间具有关联性 无关联性
查询方式 SQL标准 无标准
事务特性 ACID BASE
存储方式 磁盘 内盘
拓展性 垂直 水平
使用场景 数据结构固定
相关业务对数据安全性,一致性要求较高
数据结构不固定
对一致性、安全性要求不高
对性能要求

Redis缓存中间件

Redis(Remote Dictionary Server)是一个开源的内存数据库,遵守 BSD 协议,它提供了一个高性能的键值(key-value)存储系统,常用于缓存、消息队列、会话存储等应用场景。

基本特点

  • 性能极高: Redis 以其极高的性能而著称,能够支持每秒数十万次的读写操作24。这使得Redis成为处理高并发请求的理想选择,尤其是在需要快速响应的场景中,如缓存、会话管理、排行榜等。
  • 丰富的数据类型: Redis 不仅支持基本的键值存储,还提供了丰富的数据类型,包括字符串、列表、集合、哈希表、有序集合等。这些数据类型为开发者提供了灵活的数据操作能力,使得Redis可以适应各种不同的应用场景。
  • 原子性操作: Redis 的所有操作都是原子性的,这意味着操作要么完全执行,要么完全不执行。这种特性对于确保数据的一致性和完整性至关重要,尤其是在高并发环境下处理事务时。
  • 持久化: Redis 支持数据的持久化,可以将内存中的数据保存到磁盘中,以便在系统重启后恢复数据。这为 Redis 提供了数据安全性,确保数据不会因为系统故障而丢失。
  • 支持发布/订阅模式: Redis 内置了发布/订阅模式(Pub/Sub),允许客户端之间通过消息传递进行通信。这使得 Redis 可以作为消息队列和实时数据传输的平台。
  • 单线程模型: 尽管 Redis 是单线程的,但它通过高效的事件驱动模型来处理并发请求,确保了高性能和低延迟。单线程模型也简化了并发控制的复杂性。
  • 主从复制: Redis 支持主从复制,可以通过从节点来备份数据或分担读请求,提高数据的可用性和系统的伸缩性。

使用场景

  • 缓存 :Redis 最常用的场景是作为缓存层,以减少数据库的负载,提高数据读取速度。

    • 因为 Redis 是基于内存的,其读写速度比 MySQL 基于磁盘的方式要快很多,所以其作为热点数据的缓存是非常合适的。使用 Redis 缓存可以极大地提高应用的响应速度和吞吐量。
  • 实时系统

    • Redis 支持快速的数据写入和读取,非常适合用于实时分析,如网站点击统计、实时排行榜等。
  • 消息队列

    • 利用 Redis 的 List 和 Pub/Sub 功能,可以实现轻量级的消息队列,适用于任务处理和异步消息传递。
  • 分布式锁

    • Redis 可以用作分布式锁的实现,确保在分布式系统中资源的安全访问,避免竞态条件。
  • 计数器

    • Redis 的原子性操作非常适合用作计数器。

Redis的服务端命令

进入redis的安装根目录的命令行可以启动redis服务

  • 启动临时redis服务(不会在window Service列表出现Redis服务名称和状态,此窗口关闭,服务会自动关闭。):redis-server.exe redis.windows.conf
  • 注册redis服务:redis-server.exe --service-install redis.windows.conf --service-name redisserver1 --loglevel verbose
  • 启动服务:redis-server.exe --service-start --service-name redisserver1
  • 停止服务:redis-server.exe --service-stop --service-name redisserver1
  • 卸载服务:redis-server.exe --service-uninstall--service-name redisserver1

可以在主机中配置多个端口的redis服务,参见博客

Redis的客户端命令

redis 在安装后就自带命令行客户端 redis-cli ,客户端的通用命令格式为

1
redis-cli [option] [commands]

常见的option如下

  • -h ip_address :指定要连接的redis节点的IP地址,默认是127.0.0.1(回环地址,表示访问本机)
  • -p port:指定要连接的redis节点的端口,默认是6379
  • -a password :指定redis的访问密码

commands是redis的操作命令

Redis的基本数据结构

Redis 提供了丰富的数据类型。

基本的有五种数据类型

  • String(字符串) :Redis中最基本的数据类型,可以存储任何类型的数据,包括文本、数字和二进制数据。它的最大长度为512MB。
    • 缓存:存储临时数据,如用户会话、页面缓存。
    • 计数器:用于统计访问量、点赞数等,通过原子操作增加或减少。
  • Hash(哈希) :哈希是一个键值对集合,适合存储对象的属性。Redis内部使用哈希表实现,适合小规模数据。
    • 商品详情:存储商品的各个属性,方便快速检索。
  • List(列表) :列表是有序的字符串集合,支持从两端推入和弹出元素,底层实现为双向链表。
    • 消息队列:用于简单任务调度、消息传递等场景,通过LPUSHRPOP操作实现生产者消费者模式。
    • 历史记录:存储用户操作的历史记录,便于快速访问。
  • Set(集合) :集合是无序且不重复的字符串集合,使用哈希表实现,支持快速查找和去重操作。
    • 标签系统:存储用户的兴趣标签,避免重复。
    • 唯一用户集合:记录访问过某个页面的唯一用户,方便进行分析。
  • Zset(有序集合) :有序集合类似于集合,但每个元素都有一个分数(score),用于排序。底层使用跳表实现,支持快速的范围查询。
    • 排行榜:存储用户分数,实现实时排行榜。
    • 任务调度:根据任务的优先级进行排序,方便调度执行。

后面又支持了四种数据类型:

  • BitMap :BitMap 是一种以位为单位存储数据的高效方式,适合用来表示布尔值(如存在性、状态等)。每个 bit 可以表示一个状态(0 或 1),使用空间少且操作快速。
    • 统计每天用户的在线状态,可以用 Bitmap 记录每个用户是否在线:
  • HyperLogLog :HyperLogLog 是一种概率性数据结构,主要用于估算基数(不同元素的数量),内存占用固定,适合处理大规模数据的去重和计数。
  • GEO :GEO 是 Redis 提供的一种用于存储地理位置信息的数据结构,可以存储经纬度信息并支持空间查询,例如计算距离和获取范围内的坐标。
  • Stream :Stream 是 Redis 提供的一种日志数据结构,适合于存储时间序列数据或消息流。支持高效的消息生产和消费模式,具有持久性和序列化特性。

Redis的通用命令

Keys命令

Redis 键命令用于管理 redis 的键。

基本格式

1
redis 127.0.0.1:6379> COMMAND KEY_NAME

常见操作

  • 删除键
    • 删除已存在的键:DEL KEY_NAME
      • 返回值:被删除 key 的数量。
      • 不存在的 key 会被忽略
  • 查找键
    • 检查键是否存在:EXISTS KEY_NAME
      • 返回值:若 key 存在返回 1 ,否则返回 0 。
    • 查找符合格式的键:KEYS PATTERN
      • 返回值:符合给定模式的 key 列表 (Array)。
    • 查看键的过期时间:TTL KEY_NAME
      • 返回值:当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间。
  • 设置键
    • 设置键的过期时间:Expire KEY_NAME TIME_IN_SECONDS
      • 返回值:设置成功返回 1 。 当 key 不存在返回 0 。
    • 移除键的过期时间:PERSIST KEY_NAME
      • 返回值:当过期时间移除成功时,返回 1 。 如果 key 不存在或 key 没有设置过期时间,返回 0 。
    • 将当前数据库的 key 移动到给定的数据库 db 当中:MOVE KEY_NAME DESTINATION_DATABASE
      • 返回值:移动成功返回 1 ,失败则返回 0 。
    • 将键重新命名:RENAME OLD_KEY_NAME NEW_KEY_NAME
      • 返回值
        • 改名成功时提示 OK
        • 失败时候返回一个错误。当 OLD_KEY_NAME 和 NEW_KEY_NAME 相同,或者 OLD_KEY_NAME 不存在时,返回一个错误。

提示

Key的层级结构

Redis 中,Key 的层级格式 其实是一种命名约定,并没有真正的“层级”结构(不像关系型数据库中的表或目录结构)。

通常使用 : 分隔层级

1
namespace:object_type:id:field

数据库命令

Redis默认有16个数据库,默认使用编号为0的数据库

  • 切换数据库:select db_num
  • 查看当前数据库key的数量:DBSIZE
  • 清除当前数据库:flushdb
  • 清除所有数据库:flushall
最后更新于 2025-04-16 14:45 UTC
그 경기 끝나고 좀 멍하기 있었는데 여러분 이제 살면서 여러가
使用 Hugo 构建
主题 StackJimmy 设计