首页 > 数据库 >Redis 完整指南:命令与原理详解

Redis 完整指南:命令与原理详解

时间:2024-10-11 12:47:48浏览次数:9  
标签:指南 哈希 Redis redis 列表 详解 key 集合

目录


在现代应用开发中,Redis 作为一个高性能的键值存储数据库,凭借其卓越的性能和丰富的数据结构,广泛应用于缓存、消息队列、实时分析等多个领域。

1. Redis 概述

什么是 Redis

Redis(Remote Dictionary Server)是一个开源的、高性能的键值对(Key-Value)存储数据库,广泛用于数据库、缓存和消息代理。由 Salvatore Sanfilippo 于 2009 年创建,Redis 具备以下显著特点:

  • 内存存储:所有数据存储在内存中,提供极高的读写速度。
  • 多种数据结构:支持字符串、列表、哈希、集合、有序集合等多种数据类型,满足不同的应用需求。
  • 持久化:提供 RDB 和 AOF 两种持久化机制,确保数据在服务器重启后不丢失。
  • 原子操作:所有操作都是原子性的,支持事务处理。
  • 丰富的功能:包括发布/订阅、Lua 脚本、主从复制、哨兵和集群模式,适应各种复杂应用场景。

Redis 应用场景

Redis 的高性能和多样的数据结构使其适用于多种场景,包括但不限于:

  • 缓存:缓存数据库查询结果、会话数据等,提升系统性能。
  • 消息队列:通过列表或发布/订阅模式实现消息队列功能。
  • 排行榜和计数器:利用有序集合和计数器功能实现实时排行榜和计数器。
  • 实时分析:进行实时数据分析和统计,如网站访问量、在线用户数等。
  • 分布式锁:在分布式系统中实现锁机制,保证资源的安全访问。
  • 持久化存储:在需要高性能读写且数据量较小的场景下作为主数据存储。

2. 安装与启动

Redis 安装步骤

Redis 的安装方式多种多样,常见的有源代码安装和使用包管理器安装。以下以源代码安装和 Ubuntu 系统下的包管理器安装为例,详细介绍 Redis 的安装步骤。

源代码安装
  1. 下载源码

    wget http://download.redis.io/redis-stable.tar.gz
    tar xzf redis-stable.tar.gz
    cd redis-stable
    
  2. 编译

    make
    make test  # 可选,运行测试确保编译正确
    sudo make install
    
  3. 配置
    Redis 默认配置文件为 redis.conf,可以复制一份进行修改:

    cp redis.conf /etc/redis.conf
    # 以管理员身份登录
    sudo -i
    cd /etc/redis/
    #备份
    cp redis.conf redis.conf.copy
    
  4. 启动 Redis

    redis-server /etc/redis.conf
    
使用包管理器安装(以 Ubuntu 为例)
  1. 更新包列表

    sudo apt update
    
  2. 安装 Redis

    sudo apt install redis-server
    
  3. 启动 Redis 服务

    sudo systemctl start redis
    sudo systemctl enable redis  # 设置开机自启动
    

编译与启动命令

编译 Redis 源代码的主要命令如下:

  • 编译

    make
    
  • 运行测试(可选):

    make test
    
  • 安装

    sudo make install
    
  • 配置

    sudo vim /etc/redis/redis.conf
    
    # 守护进程,修改为yes后即后台运行
    daemonize yes
    # 监听的地址,默认127.0.0.1,会导致只能在本地访问,修改为0.0.0.0则可以在任意IP范文
    bind 0.0.0.0
    # 密码,设置后访问redis必须输入密码
    requirepass 123456
    # 监听端口号,默认6379
    port 6379
    
    
    #重启 redis
    sudo service redis restart
    

启动 Redis 服务器的命令:

redis-server /path/to/redis.conf

常用选项包括:

  • 后台运行
    redis.conf 中设置 daemonize yes,或使用命令行参数 --daemonize yes

  • 指定配置文件

    redis-server /etc/redis/redis.conf
    

停止 Redis 服务器:

redis-cli shutdown

编客户端连接

redis-cli [options] [commonds]
-h 指定要连接的redis节点的IP地址,默认是127.0.0.1
-p 指定要连接的redis节点的端口,默认是6379
-a 指定redis的访问密码 

#例如
redis-cli -h 127.0.0.1 -a 123456

3. Redis 存储结构

Redis 支持多种数据结构,每种数据结构适用于不同的应用场景。以下是 Redis 的主要存储结构详解。

KV 存储结构

Redis 的基本数据模型是键值对(Key-Value)。每个键都是唯一的,可以关联不同类型的值。键通常是字符串,值可以是多种数据类型,包括字符串、列表、哈希、集合和有序集合。
在这里插入图片描述

数据结构类型

String(字符串)
  • 描述:最基本的 Redis 数据类型,类似于键值对中的值。
  • 特点
    • 可以包含任何类型的数据,如文本、数字、二进制数据。
    • 最大值为 512 MB。
  • 常用命令
    • SET key value:设置键的值。
    • GET key:获取键的值。
    • INCR key:将键的值递增。

示例

SET name "Alice"
GET name  # 返回 "Alice"
List(列表)
  • 描述:一个有序的字符串列表,可以从两端推入或弹出元素。
  • 特点
    • 支持队列和栈操作。
    • 双端链表实现,适合频繁的头尾操作。
  • 常用命令
    • LPUSH key value:在列表左侧推入一个值。
    • RPUSH key value:在列表右侧推入一个值。
    • LPOP key:弹出左侧第一个值。
    • RPOP key:弹出右侧第一个值。

示例

LPUSH mylist "a"
RPUSH mylist "b"
LRANGE mylist 0 -1  # 返回 ["a", "b"]
Hash(哈希)
  • 描述:键对应的值是一个键值对集合,类似于对象或字典。
  • 特点
    • 适合存储对象的属性。
    • 内存占用较少。
  • 常用命令
    • HSET key field value:设置哈希字段的值。
    • HGET key field:获取哈希字段的值。
    • HGETALL key:获取哈希中所有字段和值。

示例

HSET user:1000 name "Alice" age "30"
HGETALL user:1000  # 返回 {"name": "Alice", "age": "30"}
Set(集合)
  • 描述:一个无序的字符串集合,所有元素都是唯一的。
  • 特点
    • 支持集合间的交、并、差运算。
    • 适合存储标签、好友列表等。
  • 常用命令
    • SADD key member:向集合添加一个成员。
    • SREM key member:从集合中移除一个成员。
    • SMEMBERS key:获取集合中的所有成员。

示例

SADD myset "a" "b" "c"
SMEMBERS myset  # 返回 ["a", "b", "c"]
Zset(有序集合)
  • 描述:一个带有分数的有序集合,成员按分数排序。
  • 特点
    • 支持按分数范围查询。
    • 适合实现排行榜、优先队列等。
  • 常用命令
    • ZADD key score member:向有序集合添加成员及其分数。
    • ZRANGE key start stop [WITHSCORES]:按分数范围获取成员。
    • ZREM key member:移除有序集合中的成员。

示例

ZADD leaderboard 100 "Alice"
ZADD leaderboard 200 "Bob"
ZRANGE leaderboard 0 -1 WITHSCORES  # 返回 ["Alice", "100", "Bob", "200"]

4. 基础命令

Redis 提供了丰富的命令集来操作不同的数据结构。以下是各数据类型的一些常用基础命令。

String 相关命令

  • SET:设置键的值。

    SET key value
    
  • GET:获取键的值。

    GET key
    
  • INCR:将键的值递增 1。

    INCR key
    
  • DECR:将键的值递减 1。

    DECR key
    
  • APPEND:向键的值追加字符串。

    APPEND key value
    

List 相关命令

  • LPUSH:在列表左侧推入一个或多个值。

    LPUSH key value1 [value2 ...]
    
  • RPUSH:在列表右侧推入一个或多个值。

    RPUSH key value1 [value2 ...]
    
  • LPOP:弹出列表左侧第一个值。

    LPOP key
    
  • RPOP:弹出列表右侧第一个值。

    RPOP key
    
  • LRANGE:获取列表指定范围的值。

    LRANGE key start stop
    

Hash 相关命令

  • HSET:设置哈希字段的值。

    HSET key field value
    
  • HGET:获取哈希字段的值。

    HGET key field
    
  • HDEL:删除哈希中的一个或多个字段。

    HDEL key field1 [field2 ...]
    
  • HGETALL:获取哈希中所有字段和值。

    HGETALL key
    
  • HEXISTS:检查哈希中是否存在某个字段。

    HEXISTS key field
    

Set 相关命令

  • SADD:向集合添加一个或多个成员。

    SADD key member1 [member2 ...]
    
  • SREM:从集合中移除一个或多个成员。

    SREM key member1 [member2 ...]
    
  • SMEMBERS:获取集合中的所有成员。

    SMEMBERS key
    
  • SISMEMBER:检查成员是否在集合中。

    SISMEMBER key member
    
  • SCARD:获取集合的成员数量。

    SCARD key
    

Zset 相关命令

  • ZADD:向有序集合添加一个或多个成员及其分数。

    ZADD key score1 member1 [score2 member2 ...]
    
  • ZRANGE:按分数范围获取成员。

    ZRANGE key start stop [WITHSCORES]
    
  • ZREM:移除有序集合中的一个或多个成员。

    ZREM key member1 [member2 ...]
    
  • ZSCORE:获取成员的分数。

    ZSCORE key member
    
  • ZCARD:获取有序集合的成员数量。

    ZCARD key
    

5. Redis 高级应用

Redis 不仅是一个简单的键值存储,还支持许多高级功能,适用于复杂的应用场景。以下是 Redis 的几种高级应用详解。

分布式锁

在分布式系统中,分布式锁用于确保多个进程或线程之间对共享资源的互斥访问。Redis 通过 SETNX 命令和过期时间来实现分布式锁。

实现步骤

  1. 尝试获取锁

    SET key value NX PX timeout
    
    • NX:只有在键不存在时才设置键。
    • PX timeout:设置键的过期时间,防止死锁。
  2. 释放锁
    通过 Lua 脚本确保释放锁的原子性:

    if redis.call("GET", key) == value then
        return redis.call("DEL", key)
    else
        return 0
    end
    

示例

SET mylock "unique_value" NX PX 30000  # 尝试获取锁,30秒过期

位运算

Redis 提供了对位(bit)的操作,通过 BITOP 和相关命令可以进行高效的位操作。

常用命令

  • SETBIT:设置位值。

    SETBIT key offset value
    
  • GETBIT:获取位值。

    GETBIT key offset
    
  • BITCOUNT:统计位为 1 的数量。

    BITCOUNT key [start end]
    
  • BITOP:对多个键的位进行操作(AND, OR, XOR, NOT)。

    BITOP operation destkey key1 [key2 ...]
    

应用场景

  • 用户活跃度统计。
  • 布隆过滤器实现。
  • 权限控制。

累加器

累加器用于对数值进行累加操作,常用于统计和计数。

实现方式

利用 Redis 的 INCRINCRBY 等命令对键的值进行递增操作。

示例

INCR page_views  # 将 page_views 键的值递增 1
INCRBY page_views 10  # 将 page_views 键的值递增 10

阻塞队列与异步消息队列

Redis 的列表可以用作阻塞队列,通过 BLPOPBRPOP 命令实现。
在这里插入图片描述

阻塞队列

生产者通过 RPUSH 将消息推入队列,消费者通过 BLPOP 从队列左侧阻塞获取消息。

示例

# 生产者
RPUSH queue "message1"

# 消费者
BLPOP queue 0  # 阻塞等待直到有消息

发布/订阅模式

利用 Redis 的发布/订阅功能实现消息广播。

示例

# 订阅者
SUBSCRIBE channel1

# 发布者
PUBLISH channel1 "Hello, World!"

分布式定时器

分布式定时器用于在分布式系统中实现定时任务,可以利用 Redis 的有序集合和定时任务调度机制。

实现步骤

  1. 存储定时任务
    将定时任务存储在有序集合中,分数为执行时间戳。

    ZADD timers timestamp task_data
    
  2. 调度执行
    定期检查有序集合中分数小于等于当前时间的任务并执行。

    ZRANGEBYSCORE timers -inf current_timestamp
    
  3. 执行并移除任务
    执行任务后,将其从有序集合中移除。

    ZREM timers task_data
    

6. Redis 使用场景

Redis 的高性能和多样化的数据结构使其适用于多种实际应用场景。以下是一些典型的使用案例。

朋友圈点赞与评论

在社交应用中,用户的点赞和评论操作需要高并发处理。Redis 的高性能读写能力可以有效应对这种场景。

实现方式

  • 点赞计数
    使用字符串或哈希存储每条动态的点赞数量。

    INCR post:1000:likes
    
  • 用户点赞记录
    使用集合记录用户对哪些动态进行了点赞,防止重复点赞。

    SADD user:1000:liked_posts 2000
    
  • 评论存储
    使用列表存储动态的评论。

    RPUSH post:1000:comments "Great post!"
    

购物车实现

在电商平台中,购物车需要快速响应用户的添加、删除和更新操作。Redis 的哈希和列表结构非常适合此类需求。

实现方式

  • 用户购物车
    使用哈希存储每个用户购物车中的商品及数量。

    HSET cart:user1000 item123 2
    HSET cart:user1000 item456 1
    
  • 购物车列表
    使用列表记录购物车中的商品顺序,支持展示和排序。

    RPUSH cart:user1000:items "item123" "item456"
    

抽奖应用

抽奖应用需要高效随机抽取中奖用户,Redis 的集合和有序集合提供了良好的支持。

实现方式

  • 用户集合
    使用集合存储所有参与抽奖的用户。

    SADD lottery:participants user1 user2 user3 ...
    
  • 随机抽取
    使用 SRANDMEMBER 命令随机抽取中奖用户。

    SRANDMEMBER lottery:participants 1
    

时间窗口限流

为了防止系统被过多请求压垮,可以使用 Redis 实现基于时间窗口的限流。

实现方式

  • 滑动时间窗口
    使用有序集合记录请求的时间戳,并在每次请求时清理过期记录,判断当前请求数是否超过限制。

    ZADD user:1000:requests timestamp
    ZREMRANGEBYSCORE user:1000:requests -inf (current_time - window_size)
    ZCARD user:1000:requests
    
  • 固定时间窗口
    使用计数器在固定时间窗口内计数。

    INCR user:1000:count
    EXPIRE user:1000:count window_size
    

百度热榜与延时队列

百度热榜
利用有序集合实现实时的热点榜单,根据关键词的热度(分数)排序展示。

实现方式

ZINCRBY hotwords 1 "keyword1"
ZRANGE hotwords 0 -1 WITHSCORES

延时队列
使用有序集合和定时任务调度实现延时任务,如定时发送邮件、订单超时处理等。

实现方式

ZADD delayed_tasks execute_timestamp "task_data"

定期检查并执行到期任务:

ZRANGEBYSCORE delayed_tasks -inf current_timestamp

参考

0voice · GitHub

标签:指南,哈希,Redis,redis,列表,详解,key,集合
From: https://blog.csdn.net/weixin_43925427/article/details/142813085

相关文章

  • 机器学习四大框架详解及实战应用:PyTorch、TensorFlow、Keras、Scikit-learn
    目录框架概述PyTorch:灵活性与研究首选TensorFlow:谷歌加持的强大生态系统Keras:简洁明了的高层APIScikit-learn:传统机器学习的必备工具实战案例图像分类实战自然语言处理实战回归问题实战各框架的对比总结选择合适的框架1.框架概述机器学习框架在开发过程中起着至......
  • 《算法竞赛进阶指南》 第六章 287. 积蓄程度
    //502extra.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*287.积蓄程度https://www.acwing.com/problem/content/289/有一个树形的水系,由N−1条河道和N个交叉点组成。我们可以把交叉点看作树中的节点,编号为1∼N,河道则看作树中的无向边。每条......
  • Nuxt.js 应用中的 kit:compatibility 事件钩子详解
    title:Nuxt.js应用中的kit:compatibility事件钩子详解date:2024/10/11updated:2024/10/11author:cmdragonexcerpt:kit:compatibility是处理浏览器兼容性问题的有效工具。正如本篇文章中所述,合理地利用这一钩子可以提升用户体验,并确保应用在不同环境中都能稳定运行......
  • 『Mysql进阶』Mysql explain详解(五)
    目录Explain介绍Explain分析示例explain中的列1.id列2.select_type列3.table列4.partitions列5.type列6.possible_keys列7.key列8.key_len列9.ref列10.rows列11.filtered列12.Extra列Explain介绍    EXPLAIN语句提供有关M......
  • JVM系列(四) -内存布局详解
    一、摘要熟悉Java语言特性的同学都知道,相比C、C++等编程语言,Java无需通过手动方式回收内存,内存中所有的对象都可以交给Java虚拟机来帮助自动回收;而像C、C++等编程语言,需要开发者通过代码手动释放内存资源,否则会导致内存溢出。尽管如此,如果编程不当,Java应用程序......
  • AI 时代就业指南:Java 程序员如何转行做大模型?
    前言在人工智能(AI)迅速发展的背景下,从传统的编程领域如Java程序员转向大模型开发是一个既充满挑战也充满机遇的过程。对于Java程序员来说,这也是一个实现职业转型、提升薪资待遇的绝佳机遇。一、明确大模型概念简单来说,大模型就是具有大量参数和强大计算能力的人工智能模......
  • 《算法竞赛进阶指南》 第六章 325. 计算机
    /*325.计算机https://www.acwing.com/problem/content/description/327/一所学校前一段时间买了第一台计算机(所以这台计算机的ID是1)。近年来,学校又购买了N−1台新计算机。每台新计算机都与之前买进的计算机中的一台建立连接。现在请你求出第i台计算机到距离其最远......
  • AI产品经理入门全指南资料库,非常详细收藏我这一篇就够了
    ......
  • 多层嵌套json字符串(jsonStr)写入redis
    1、连接redisJedisjedis=newJedis("localhost",6379);2、将字符串转为json格式JSONObjectjs=JSONObject.fromObject(jsonStr);3、对json格式进行解析4、将json写入redispublicstaticvoidRedisSet(JSONObjectjs,Jedisjs01){//获取json中的所有key......
  • Linux安装Jenkins指南
    Linux安装Jenkins指南Jenkins,作为一款开源的自动化服务器,广泛用于持续集成和持续部署(CI/CD)流程中。它提供了强大的插件生态系统,使得集成各种开发工具、版本控制系统和构建工具变得简单高效。本文将详细介绍如何在Linux系统上安装和配置Jenkins。一、准备工作机器要求:内存不少......