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

news2024/10/10 13:41:39

目录

    • 1. Redis 概述
      • 什么是 Redis
      • Redis 应用场景
    • 2. 安装与启动
      • Redis 安装步骤
        • 源代码安装
        • 使用包管理器安装(以 Ubuntu 为例)
      • 编译与启动命令
      • 编客户端连接
    • 3. Redis 存储结构
      • KV 存储结构
      • 数据结构类型
        • String(字符串)
        • List(列表)
        • Hash(哈希)
        • Set(集合)
        • Zset(有序集合)
    • 4. 基础命令
      • String 相关命令
      • List 相关命令
      • Hash 相关命令
      • Set 相关命令
      • Zset 相关命令
    • 5. Redis 高级应用
      • 分布式锁
      • 位运算
      • 累加器
      • 阻塞队列与异步消息队列
      • 分布式定时器
    • 6. Redis 使用场景
      • 朋友圈点赞与评论
      • 购物车实现
      • 抽奖应用
      • 时间窗口限流
      • 百度热榜与延时队列
      • 参考

在现代应用开发中,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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2202143.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

selenium有多个frame页时的操作方法(5)

之前文章我们提到,在webdriver.WebDriver类有一个switch_to方法,通过switch_to.frame()可以切换到不同的frame页然后才再定位某个元素做一些输入/点击等操作。 比如下面这个测试网站有2个frame页:http://www.sahitest.com/demo/framesTest.h…

支付宝开放平台-开发者社区——AI 日报「10 月 10 日」

1 AI逆向绘画火了!一键重绘梵高《星空》,来自华盛顿大学 量子位|阅读原文 这项魔法来自华盛顿大学,项目名为Inverse Painting,相关论文已入选SIGGRAPH Asia 2024,其中两位作者还是东北大学(Bo…

车载SerDes历史和发展概述

1. 场景起源 1.1 原始时代: 在古老的很久很久以前,摄像头和显示屏等接口是多种多样的,丰富多彩的。大家各凭本事,各显神通,在各种地盘上成立各种帮派。比如CVBS、DVP、AHD、USB。 CVBS,包括后面的AHD&a…

【puppeteer】wvp-puppeteer制作 过程

、 制作 docker build -t dxw-pupet4 -f .\dockerfile2 . docker run -itd --name dxw4 -p 35105:35105 dxw-pupet4 推送到私库 docker tag dxw-pupet4:latest dualvenregistry:5000/wvp-puppeteer:v1.0 docker push dualvenregistry:5000/wvp-puppeteer:v1.0 重启桌面上…

2024.10.9 QT事件

1.思维导图 2.一个圆形根据wsad上下左右移动&#xff0c;超出界限则不移动。鼠标点击和双击事件测试。 1.main.cpp #include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.show();re…

JAVA《接口》

文章目录 一、接口是什么&#xff1f;1.1 接口的概念1.2 接口与类的相似点和区别1.3 接口的特性 二、接口的使用2.1 接口的实现2.2 实现多个接口2.3 接口之间的扩展(继承) 三、接口的使用实例3.1 Comparable接口3.2 Comparator接口3.3 Clonable接口3.3.1 使用Clonable接口3.3.2…

Linux——cp-mv-rm命令

cp命令 复制文件 cp test01.txt test02.txt 复制文件夹 cp -r hsy01 hsy02 mv命令 移动文件/文件夹 rm命令 删除文件 rm test.txt 删除文件夹&#xff08;目录 rm -r hsy01 通配符 * 匹配任意内容 注意* 位置 强制删除-f root超级管理员

数字化转型的深度解析:塑造未来企业的关键策略

在当今技术飞速发展的背景下&#xff0c;数字化转型&#xff08;_Digital Transformation_&#xff09;已成为企业保持竞争力的必要手段。随着云计算、物联网&#xff08;IoT&#xff09;、大数据和人工智能等技术的不断成熟&#xff0c;企业通过数字化手段优化业务流程、提升客…

ESXI 的下载 2024 版

ESXI 的下载 前言 最近收到了部分小伙伴的反馈&#xff0c;VMware 的下载官网上 ESXI 自动跳转进入了 BroadCom 的支持页面&#xff0c;难以找到 ESXI 的官方资源&#xff0c;这里我将为大家做出下载的相关指引。 ESXI 下载指引 跳转进入 BroadCom 的支持页面 &#x1f449; …

Python | Leetcode Python题解之第467题环绕字符串中唯一的子字符串

题目&#xff1a; 题解&#xff1a; class Solution:def findSubstringInWraproundString(self, p: str) -> int:dp defaultdict(int)k 0for i, ch in enumerate(p):if i > 0 and (ord(ch) - ord(p[i - 1])) % 26 1: # 字符之差为 1 或 -25k 1else:k 1dp[ch] max…

Web Service Sender ParseError Invalid byte 1 of 1-byte UTF-8 sequence

说明 发送webservice报错 Invalid UTF-8 start byte 0xfc when using Web Service Sender Web Service Sender error ERROR MESSAGE: Error creating web service dispatch com.sun.xml.ws.streaming.XMLStreamReaderException: XML reader error: javax.xml.stream.XMLStream…

k8s之ingress-nginx-controller安装

作者&#xff1a;程序那点事儿 日期&#xff1a;2024/01/30 01:25 要在master节点上安装 helm repo add ingress-nginx Welcome - Ingress-Nginx Controller helm search repo ingress-nginx helm pull ingress-nginx/ingress-nginx --version 4.4.2 mv ingress-nginx-4.4.…

为Floorp浏览器添加搜索引擎及搜索栏相关设置. 2024-10-08

Floorp浏览器开源项目地址: https://github.com/floorp-Projects/floorp/ 以下内容同样适用于firefox和大部分基于firefox的桌面版浏览器 1.第一步 为Floorp浏览器添加搜索栏 (1.工具栏空白处 次键选择 定制工具栏 (2. 把 搜索框 拖动至工具栏 2.添加搜索引擎 以添加 搜狗搜索…

Ubuntu 18.04安装storcli查看阵列信息

rootCeph03:/opt/MegaRAID/storcli# cat /etc/issue Ubuntu 18.04.5 LTS \n \l 准备好storcli的安装包 解压 解压之后可以看到 根据系统版本选择 把storcli_1.18.11_all.deb包传到服务器 使用命令dpkg -I storcli_1.18.11_all.deb ./storcli64 show ./storcli64 /c1 show …

Acwing 贪心算法遗留

1.Huffman树 Acwing 148.合并果子 实现思路&#xff1a;构建一颗哈夫曼树&#xff0c;求最短带权路径长度&#xff08;树中所有的叶结点的权值乘上其到根结点的路径长度&#xff09; 每次选择重量最小的两堆进行合并使用小根堆存储每一堆果子&#xff0c;每次两次弹出堆顶元…

ML 系列:机器学习和深度学习的深层次总结( 15) — KNN — 第 1 部分

一、说明 K-最近邻 (KNN) 算法是一种流行的监督机器学习算法&#xff0c;用于分类和回归任务。它是非参数惰性学习算法的一个典型例子。KNN 被认为是一种惰性学习算法&#xff0c;因为它在训练阶段不对底层数据分布做出任何假设&#xff0c;也不从训练数据中学习特定模型。相反…

uniapp开发 使用vscode代替hbuilderx开发工具

前言&#xff1a;最近接手了一个uniapp项目&#xff0c;很久没有使用hbuilderx了&#xff0c;用着实在难受&#xff0c;并且还总报奇奇怪怪的错误&#xff0c;首次运行要下载很多插件&#xff0c;搜索文件也用不习惯&#xff0c;加上很多鼠标操作&#xff0c;实在是太影响开发效…

【MATLAB源码-第241期】基于simulink的异步buck降压电路仿真,输出UL IL UR以及PWM波形。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 Buck变换器是一种直流降压转换器&#xff0c;旨在将较高的输入电压转换为较低的输出电压&#xff0c;并广泛应用于各种电源管理系统中。图中的Buck变换器模型通过一系列的电力电子元件和控制信号实现降压功能。 首先&#xf…

QT:“提升为“使用(自定义控件)

目录 一.步骤与作用 1.步骤 2.作用 二.使用 1.mainwindow.ui ->拖一个 Push Button 控件到画布->右击Push Button弹出对话框->单击"提升为" 2.输入提升类名称MyButton->点击添加 3.选择基类名称为QPushButton,点击提升 4.新建MyButton文件 5.在…

《Java基础》变量和数据类型

综述 在开始学习变量之前&#xff0c;我们思考一下为什么需要使用变量。 首先我们从小开始学习加法减法的时候&#xff0c;后来我们再学更难的东西就是代数&#xff0c;其中的x和y是我们要求解的内容&#xff0c;这些内容就是变量。 变量是人的思维的提升&#xff0c;没有变量…