当前位置: 首页 > news >正文

4.1.1 Redis相关命令详解及其原理

文章目录

  • 1. Redis是什么
    • 1. Redis 的核心特性
      • **数据存储在内存中**
      • **KV(键值)存储 + 多种数据结构**
    • 2. 工作模式:请求-响应模型
    • 3. 和 MySQL 的区别
  • 2. 应用
  • 3. 安装编译及启动
  • 4. redis是怎么组织数据的
    • 1. redis的存储结构是什么:
    • 2. 为什么redis中字符串选择64个字节为分界线
  • 5. redis的value编码
    • 1. string 类型(最常见)
    • 2. list 类型
    • 3. hash 类型
    • 4. set 类型
    • 5. zset(有序集合)
  • 6. string
    • 1. 基础命令
    • 2. 存储结构
    • 3. 应用
      • 1. 对象存储
      • 2. 累加器
      • 4. 分布式锁
      • 5. 位运算
  • 7. list
    • 1. 基础命令
    • 2. 存储结构
    • 3. 应用
      • 1. 栈
      • 2. 队列
      • 3. 阻塞队列
      • 4. 异步消息队列
      • 5. 获取固定窗口记录
        • 记录最近 N 次登录行为
      • 6. 总结一下
  • 8. hash
    • 1. 基础命令
    • 2. 存储结构
    • 3. 应用
  • 9. set
    • 1. 基础命令
    • 2. 存储结构
    • 3. 应用

1. Redis是什么

Redis(Remote Dictionary Server) 是一个开源的、基于内存的 键值型 NoSQL 数据库,支持丰富的数据结构和高性能的操作。


1. Redis 的核心特性

数据存储在内存中

  • 所有数据保存在内存中,访问速度非常快(微秒级)。
  • 可选持久化机制(RDB 快照、AOF 日志)可以将数据写入磁盘以防丢失。

KV(键值)存储 + 多种数据结构

  • Redis 不只是传统的 key → string,它还支持:list,hash,set,zset等

2. 工作模式:请求-响应模型

Redis 基于 客户端-服务器模型


客户端发送请求(如 GET、SET)
→ Redis 处理请求(在内存中)
→ Redis 立即返回响应(低延迟)

3. 和 MySQL 的区别

项目RedisMySQL
存储介质内存为主(可持久化)磁盘
数据模型键值+多结构表格+关系型
性能高速,适合缓存较慢,适合存储
使用场景缓存、排行榜、消息队列持久化存储、复杂查询
支持事务基础事务支持完整事务机制(ACID)

2. 应用

Redis 的常见数据结构 & 用途对照表

数据结构说明常见使用场景
String最基本的数据类型,最大512MB缓存单个值、计数器、锁标记
List链表结构,可从两端 push/pop消息队列(先进先出)、任务列表
Set无序不重复元素集合标签系统、好友列表、去重
Sorted Set(ZSet)带权重的集合,可排序排行榜、优先队列、打分系统

3. 安装编译及启动

#下载源码
wget http://download.redis.io/releases/redis-7.2.4.tar.gz
tar -xzf redis-7.2.4.tar.gz
cd redis-7.2.4
#编译
make -j4       # -j4 表示用4线程并行编译# 默认安装在 /usr/local/bin
# redis-server 是服务端程序
# redis-cli 是客户端程序#启动
mkdir redis-data
# 把redis文件夹下 redis.conf 拷贝到 redis-data
# 修改 redis.conf
vim redis.conf
requirepass 123456
./src/redis-server redis.conf
#用这个配置文件启动
# daemonize yescd redis-data
redis-server ./redis.conf
# 通过 redis-cli 访问 redis-server
redis-cli -h 127.0.0.1 -a 123456#断开就输入
exit

4. redis是怎么组织数据的

1. redis的存储结构是什么:

v-数据结构的选择,特性,典型应用

k-设计有意义的字段,方便查询

Redis 是典型的 键值对(Key-Value)数据库,支持丰富的数据结构,不再是简单的字符串键值
每一个键值对的本质是:


dict<key, redisObject* value>
  • key:通常是字符串(SDS)
  • value:是一个 redisObject 指针,内部根据实际类型存储数据

比如:

2. 为什么redis中字符串选择64个字节为分界线

原因说明
内存分配优化小于64字节的字符串能映射到更小的内存块,避免浪费
CPU缓存优化64字节正好是cache line大小,提高访问效率
SDS优化策略Redis会针对短字符串启用更激进的性能优化策略
内存碎片控制避免频繁内存分配、释放引起的碎片化

5. redis的value编码

Redis 会根据 数据的类型 + 内容大小 + 特性 来动态选择最优的编码方式,既省内存又加快速度

1. string 类型(最常见)

编码方式触发条件特性
int值是整型,且可以转成 long最省内存(直接用 long 存)
embstr字符串长度 ≤ 44 字节分配一块连续内存,CPU cache 友好,性能极高
raw字符串长度 > 44 字节普通字符串编码(sds + object 分开)

备注:Redis 的 embstr 就是为了让短字符串更高效


2. list 类型

编码方式触发条件特性
quicklist(默认)Redis 3.2 之后统一使用 quicklist底层是 ziplist + 双向链表压缩组合
ziplist(已淘汰)旧版本才有紧凑结构,节省空间,O(n) 访问

3. hash 类型

编码方式触发条件特性
ziplist元素个数 < 512 且 field/value 长度都 < 64 字节紧凑,省空间
hashtable超过阈值标准哈希表,支持 O(1) 操作

4. set 类型

编码方式触发条件特性
intset所有元素都是整数,数量 < 512 个紧凑的整数集合,支持二分查找
hashtable含有非整数 或 数量多哈希表实现,查找更快

5. zset(有序集合)

编码方式触发条件特性
ziplist元素个数 ≤ 128 且每个元素 < 64 字节空间紧凑,适合小集合
skiplist(跳表)超过阈值支持范围查询,有序插入,查找快

其实上面说的这些东西我完全不知道在干什么

6. string

1. 基础命令

命令功能说明
SET key value设置键的值
GET key获取键的值
SETEX key seconds value设置键并指定过期时间
INCR key/ DECR key数值型累加 / 累减
INCRBY key n/ DECRBY key n按指定数值增减
APPEND key value追加内容到原字符串
STRLEN key获取字符串长度
GETRANGE key start end获取指定范围的子串
SETRANGE key offset value替换子串

2. 存储结构

SDS(Simple Dynamic String)结构实现的,支持二进制安全

3. 应用

1. 对象存储


SET user:1001:name "Alice"
SET user:1001:email "alice@example.com"

2. 累加器

#每次访问首页,PV +1。Redis 的原子性保证不会丢数据
INCR page:view:index#视频 123 的点赞数累加。结合用户状态防止重复点赞
INCR video:123:likes

4. 分布式锁

#某个后台任务抢占锁执行,保证同一任务在同一时间只被一个节点执行
SET lock:task:sendEmail "UUID-xyz" NX EX 30

5. 位运算

#第 0 位表示 4月15日是否签到,1 表示已签;可以每天一个 key,也可以一人一个 key
SETBIT sign:20250415:user:1001 0 1   # 表示今天已签到#统计某月有多少用户签到过,即位为 1 的总数
BITCOUNT sign:202504:user

7. list

1. 基础命令

命令功能说明
LPUSH key value从左侧插入(头插)
RPUSH key value从右侧插入(尾插)
LPOP key弹出左边第一个元素
RPOP key弹出右边第一个元素
LRANGE key start stop获取指定范围内的元素
LLEN key获取列表长度
LREM key count value删除指定值的元素(count 控制次数)
LTRIM key start stop截取指定范围,保留该范围
LSET key index value设置索引位置的值
LINDEX key index获取指定索引的元素
BLPOP key [key2...] timeout阻塞式左弹出(多个 key)
BRPOP key [key2...] timeout阻塞式右弹出

2. 存储结构

使用 quicklist(多个 ziplist + 双向链表组合)更高效

3. 应用

1. 栈

后进先出

#LPUSH 插入最新访问记录,LPOP 弹出最近的页面,模拟栈行为
LPUSH history:user:1001 "pageA"
LPUSH history:user:1001 "pageB"
LPOP history:user:1001

2. 队列

先进先出

#RPUSH 添加任务,LPOP 从左边取任务,实现先进先出逻辑
RPUSH queue:email "task1"
RPUSH queue:email "task2"
LPOP queue:email

3. 阻塞队列

#如果队列为空,阻塞最多 30 秒,适合高并发任务消费者等待模式
BLPOP queue:email 30

4. 异步消息队列

#结合生产/消费模型,通过 List 实现轻量级消息队列,支持异步处理和消费速度差异
# 生产者写入日志消息
RPUSH logs:system "log1"
RPUSH logs:system "log2"# 消费者阻塞式读取
BLPOP logs:system 0

5. 获取固定窗口记录

记录最近 N 次登录行为
#每次登录都插入新记录,只保留前 N 条,模拟滑动窗口效果
LPUSH login:user:1001 "2025-04-15T10:00"
LTRIM login:user:1001 0 4    # 保留最近5条

6. 总结一下

类别案例命令描述
浏览历史LPUSH + LPOP后进先出
队列邮件任务RPUSH + LPOP先进先出
阻塞队列消费任务BLPOP无任务阻塞等待
异步消息队列日志系统RPUSH + BLPOP解耦生产与消费
滑动窗口登录记录LPUSH + LTRIM只保留最近N条数据

8. hash

1. 基础命令

命令功能说明
HSET key field value设置哈希表字段的值(新增或更新)
HGET key field获取哈希表字段的值
HDEL key field删除一个或多个字段
HEXISTS key field判断字段是否存在
HGETALL key获取哈希表中所有字段和值
HKEYS key获取所有字段名
HVALS key获取所有字段值
HMSET key field1 value1 field2 value2批量设置字段值(新版已推荐用 HSET
HMGET key field1 field2 ...批量获取字段值
HLEN key获取字段数量
HINCRBY key field increment整数值自增
HINCRBYFLOAT key field increment浮点数值自增

2. 存储结构

条件使用结构
字段数少且字段值较短(<64 字节)压缩列表(ziplist)
超过一定阈值(默认512个字段或任意值超过64字节)转为 hashtable

3. 应用

#一个 key 代表一个对象,多个 field 对应字段名,模拟关系型数据库中一行记录
HSET user:1001 name "Alice"
HSET user:1001 age "24"
HSET user:1001 email "alice@example.com"
HGETALL user:1001

可以把 Redis 的 Hash 结构理解为:


Redis Key(外键): user:1001||--> field1: name     →  value1: "Alice"|--> field2: age      →  value2: "24"|--> field3: email    →  value3: "alice@example.com"

我感觉这么看field更好理解

9. set

1. 基础命令

命令作用
SADD key member [member ...]添加一个或多个元素到集合中
SREM key member [member ...]移除一个或多个元素
SISMEMBER key member判断元素是否存在
SCARD key获取集合元素数量
SMEMBERS key返回集合中所有元素
SRANDMEMBER key [count]随机返回一个或多个元素(不删除)
SPOP key [count]随机弹出元素(删除)
SMOVE source destination member将元素从一个集合移动到另一个集合
SDIFF key1 key2返回 key1 有但 key2 没有的元素
SINTER key1 key2返回 key1 和 key2 的交集
SUNION key1 key2返回两个集合的并集

2. 存储结构

元素都为整数且节点数量小于等于 512(set-max-intset-entries),则使用整数数组存储;

元素当中有一个不是整数或者节点数量大于 512,则使用字典存储

无序,不重复

3. 应用

#使用 SINTER 获取共同兴趣,推荐内容等
SADD user:1001:tags "旅行" "美食" "摄影"
SADD user:1002:tags "摄影" "跑步"SINTER user:1001:tags user:1002:tags#自动去重,不会重复存储同一个用户 ID
SADD active_users:20250415 1001 1002 1003 1001
SCARD active_users:20250415

相关文章:

  • 深入解析分类模型评估指标:ROC曲线、AUC值、F1分数与分类报告
  • OCCT 入门(3)核心模块与架构
  • 游戏测试入门知识
  • matlab中进行海浪模型仿真
  • 利用pnpm patch命令实现依赖包热更新:精准打补丁指南
  • ARM Cortex汇编宏定义
  • 基于 PyGetWindow 获取窗口信息和控制窗口
  • 安防监控视频管理平台EasyCVR助力建筑工地施工4G/5G远程视频监管方案
  • AgentGPT 在浏览器中组装、配置和部署自主 AI 代理 入门介绍
  • [250415] OpenAI 推出 GPT-4.1 系列,支持 1M token
  • Python正则表达式有哪些常用匹配字符?
  • 刚刚丨OpenAI发布最新模型——GPT-4.1
  • 【大模型实战篇】--阿里云百炼搭建MCP Agent
  • 位图和布隆过滤器
  • idea如何克隆拉取远程git项目到本地
  • 快速幂+公共父节点
  • 机器人发展未来两年会有突破吗?
  • Tauri 桌面端开发
  • Windows 图形显示驱动开发-WDDM 1.2功能—WDDM 1.2 中的 Direct3D 功能和要求
  • 泛型有什么好处?日常使用场景
  • 杜前任宁波中院代理院长,卸任宁波海事法院院长
  • 一张老照片里蕴含的上海文脉
  • 广州一季度GDP为7532.51亿元,同比增长3%
  • 加拿大温哥华发生驾车冲撞人群事件,加拿大总理发声
  • 坤莹·帕塔玛·利斯达特拉任世界羽联主席
  • 福建省莆田市原副市长胡国防接受审查调查