Redis 安装与数据模型-2

来源: 豆包ai接上章redis原理

一、Redis 安装与配置

  • 前置依赖

    yum install -y gcc gcc-c++ make
    
  • Redis 官网 获取最新稳定版(本文以 8.2.3 为例)官网我这老500用[github下载](Releases · redis/redis)

    # 用浏览器下载
    https://codeload.github.com/redis/redis/tar.gz/refs/tags/8.2.3
    
    # 解压
    tar xf redis-8.2.3.tar.gz 
    cd redis-8.2.3
    
  • 编译与安装

    # 编译(生成 redis-server、redis-cli 等可执行文件)
    make
    # 安装(默认路径 /usr/local/bin,可通过 PREFIX 指定自定义路径
    make install PREFIX=/data/redis
    
  • 验证

    # 查看 Redis 版本,输出如下表示安装成功
    [root@localhost redis-8.2.3]# cd /data/redis/bin
    [root@localhost bin]# ./redis-server --version
    Redis server v=8.2.3 sha=00000000:0 malloc=jemalloc-5.3.0 bits=64 build=2febbfd48623c680
    
  • 配置与启动

    • 临时启动-前台启动

      # 启动成功后,终端会显示 Redis 日志(包含默认端口 6379、进程 PID 等信息),关闭终端则服务停止。
      redis-server
      
    • 配置文件启动

      • 复制配置文件

        回到安装包里面 cd /解压路径/redis-8.2.3
        cp redis.conf /data/redis/bin/redis.conf  # 复制默认配置
        
        [root@localhost bin]# ls /data/redis/bin/
            redis-benchmark
            redis-check-aof -> redis-server
            redis-check-rdb -> redis-server
            redis-cli
            redis.conf    <-----  配置文件,其它都是redis程序
            redis-sentinel -> redis-server
            redis-server
        
      • 编辑配置文件

        vim /etc/redis/redis.conf
        
        # 允许后台运行(默认 no,改为 yes)
        daemonize yes
        
        # 绑定地址(默认 127.0.0.1,仅本地访问;需远程连接则改为 0.0.0.0 或指定服务器 IP)
        bind 0.0.0.0
        
        # 端口(默认 6379,可自定义,如 6380)
        port 6379
        
        # 设置访问密码(生产环境必配,避免未授权访问)
        requirepass your_strong_password
        
        # 持久化配置(按需开启)
        save 900 1    # 900秒内有1次写操作,触发 RDB 快照
        save 300 10   # 300秒内有10次写操作,触发 RDB 快照
        appendonly no  # 关闭 AOF 持久化
        appendfsync everysec  # AOF 刷盘策略:每秒刷盘(平衡性能与一致性)
        
        # 过期策略优化(默认已配置,可按需调整)
        maxmemory-policy allkeys-lru  # 内存满时,淘汰最近最少使用的键
        
      • 启动开机自启

        vim /usr/lib/systemd/system/redis.service
        [Unit]
        Description=Redis In-Memory Data Store
        After=network.target  # 网络启动后再启动 Redis
        
        [Service]
        User=root
        Group=root
        ExecStart=/data/redis/bin/redis-server /data/redis/bin/redis.conf  # 启动命令
        ExecStop=/data/redis/bin/redis-cli -h 127.0.0.1 -p 6379 -a xiong shutdown  # 停止命令
        Restart=always  # 故障时自动重启
        
        [Install]
        WantedBy=multi-user.target
        
      • 启动相关命令

        # 重新加载系统服务(使配置生效)
        systemctl daemon-reload
        
        # 设置开机自启
        systemctl enable redis
        
        # 启动服务
        systemctl start redis
        
        # 查看服务状态(active (running) 表示正常)
        systemctl status redis
        
        # 停止服务(如需)
        systemctl stop redis
        
  • 查看并连接

    # 查看 Redis 进程
    ps -ef | grep redis
    
    # 连接 Redis 客户端(验证服务可用)
    redis-cli -h 127.0.0.1 -p 6379 -a your_strong_password
    
    # 执行 ping 命令,返回 PONG 表示正常
    127.0.0.1:6379> ping
    PONG
    

二、数据模型

2.1、数据结构选型对比表

数据结构 核心特性 核心优势 适用场景
String 二进制安全、简单键值 操作高效、支持过期 缓存、计数器、分布式锁、会话存储
Hash 对象字段级操作、去重 灵活修改、节省内存 用户信息、商品属性、配置存储
List 有序可重复、两端操作 天然支持栈 / 队列、阻塞操作 消息队列、最新列表、临时任务队列
Set 无序唯一、集合运算 高效去重、关系计算 标签去重、共同好友、抽奖
ZSet 有序唯一、分数排序 范围查询、排名支持 排行榜、延迟队列、优先级队列
Bitmap 位级存储、节省空间 高效状态标记、统计 签到、状态标记、布隆过滤器
HyperLogLog 近似基数统计 占用空间极小、支持大数据 UV 统计、关键词去重数
Geospatial 地理坐标存储、距离计算 地理相关操作便捷 附近的人、地理位置筛选
Stream 多生产者多消费者、持久化 消费确认、消费组 复杂消息队列、事件流处理

2.2、数据结构示例

我这拿 String、Hash、List、Set、ZSet 五种核心数据结构,提供「创建 - 查询 - 修改 - 删除」完整流程示例

2.2.1、String(字符串)
  • 核心场景:缓存用户信息、计数器

  • 示例

    # 1. 新增(设置)字符串
    set user:101 '{"id":101,"name":"张三","age":25}' EX 3600  # 缓存1小时
    set article:read:202 0  # 文章202阅读量初始化
    
    # 2. 查询
    get user:101  # 获取用户信息
    get article:read:202  # 获取阅读量(返回"0")
    strlen user:101  # 获取字符串长度
    
    # 3. 修改
    append user:101 ', "gender":"男"'  # 追加字符串
    incr article:read:202  # 阅读量+1(变为1)
    set user:101 '{"id":101,"name":"张三","age":26}' EX 3600  # 覆盖更新
    
    # 4. 删除操作
    del user:101  # 直接删除整个键(返回1表示成功)
    exists user:101  # 验证是否删除(返回0表示不存在)
    expire article:read:202 0  # 通过设置过期时间为0间接删除(等效del)
    
2.2.1、Hash(哈希)
  • 核心场景:存储用户属性、商品详情

  • 示例

    # 1. 新增(设置哈希字段)
    hset user:102 id 102 name "李四" age 28 phone "13800138000"
    hmset product:301 name "Redis实战" price 59 stock 100 sales 0  # 批量设置
    
    # 2. 查询
    hget user:102 name  # 获取单个字段(返回"李四")
    hgetall user:102  # 获取所有字段和值
    hmget product:301 price stock  # 批量获取字段(返回59、100)
    hexists user:102 phone  # 检查字段是否存在(返回1表示存在)
    
    # 3. 修改
    hset user:102 age 29  # 直接更新字段值
    hincrby product:301 sales 5  # 销量+5(变为5)
    hset user:102 email "lisi@example.com"  # 新增字段
    
    # 4. 删除操作
    hdel user:102 phone  # 删除单个字段(返回1表示成功)
    hdel product:301 sales stock  # 批量删除字段(返回2表示成功)
    del product:301  # 删除整个哈希键(返回1表示成功)
    hexists product:301 name  # 验证是否删除(返回0表示不存在)
    
2.2.1、List(列表)
  • 核心场景:消息队列、最新消息列表

  • 示例

    # 1. 新增(插入元素)
    lpush notify:user:101 "您的订单已支付" "账户余额变动+100"  # 左侧插入(队首)
    rpush msg:queue "任务1" "任务2" "任务3"  # 右侧插入(队尾)
    linsert notify:user:101 before "账户余额变动+100" "您的优惠券已到账"  # 指定元素前插入
    
    # 2. 查询
    lrange notify:user:101 0 -1  # 获取所有元素(从左到右)
    lrange msg:queue 0 1  # 获取前2个元素(返回"任务1"、"任务2")
    llen msg:queue  # 获取列表长度(返回3)
    lindex notify:user:101 1  # 获取索引1的元素(返回"您的优惠券已到账")
    
    # 3. 修改
    lset notify:user:101 0 "您的订单已支付成功"  # 按索引修改元素
    
    # 4. 删除操作
    lpop msg:queue  # 左侧弹出并删除元素(返回"任务1")
    rpop msg:queue  # 右侧弹出并删除元素(返回"任务3")
    lrem notify:user:101 1 "账户余额变动+100"  # 删除指定元素(1=删除1个,-1=删除所有)
    del msg:queue  # 直接删除整个列表(返回1表示成功)
    exists msg:queue  # 验证是否删除(返回0表示不存在)
    
2.2.1、Set(集合)
  • 核心场景:标签去重、好友关系、抽奖活动

  • 示例

    # 1. 新增(添加元素)
    sadd tag:article:401 技术 Redis 数据库 缓存  # 自动去重
    sadd lottery:202511 user1 user2 user3 user4 user5
    
    # 2. 查询
    smembers tag:article:401  # 获取所有元素(无序)
    sismember lottery:202511 user3  # 检查元素是否存在(返回1表示存在)
    scard lottery:202511  # 获取集合大小(返回5)
    sinter tag:article:401 tag:article:402  # 求两个集合的交集(如共同标签)
    
    # 3. 修改
    smove lottery:202511 lottery:202512 user5  # 将元素从一个集合移动到另一个集合
    
    # 4. 删除操作
    srem tag:article:401 缓存  # 删除单个元素(返回1表示成功)
    srem lottery:202511 user1 user2  # 批量删除元素(返回2表示成功)
    spop lottery:202511 1  # 随机删除1个元素(返回删除的元素,如user3)
    del tag:article:401  # 删除整个集合(返回1表示成功)
    exists tag:article:401  # 验证是否删除(返回0表示不存在)
    
2.2.1、ZSet(有序集合)
  • 核心场景:排行榜、延迟队列、优先级任务

  • 示例

    # 1. 新增(添加元素,指定分数)
    zadd product:sales 150 "商品A" 230 "商品B" 98 "商品C" 310 "商品D"  # 分数=销量
    zadd delay:queue 1755000000 "任务1:发送短信" 1755000300 "任务2:订单超时"  # 分数=时间戳
    
    # 2. 查询
    zrevrange product:sales 0 2 withscores  # 降序取Top3(返回商品D(310)、商品B(230)、商品A(150))
    zrangebyscore delay:queue 0 1755000100  # 按分数范围查询(返回任务1)
    zrank product:sales "商品C"  # 升序排名(返回0,第1名)
    zscore delay:queue "任务2:订单超时"  # 获取元素分数(返回1755000300)
    
    # 3. 修改
    zincrby product:sales 50 "商品A"  # 商品A销量+50(分数变为200)
    zadd product:sales 250 "商品B"  # 覆盖商品B的分数(从230改为250)
    
    # 4. 删除操作
    zrem product:sales "商品C"  # 删除单个元素(返回1表示成功)
    zremrangebyrank product:sales 0 0  # 按排名删除(删除升序第1名,即商品C)
    zremrangebyscore delay:queue 0 1755000000  # 按分数范围删除(删除任务1)
    del product:sales  # 删除整个有序集合(返回1表示成功)
    exists product:sales  # 验证是否删除(返回0表示不存在)
    
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐