linux学习笔记(49)Redis详解(1)

Redis

1. 什么是 Redis?

Redis 是一个内存数据库,就像电脑的"超快速临时笔记本":

生活场景比喻:

传统数据库(MySQL):像图书馆 - 数据存在硬盘上,找书比较慢 - 数据永久保存,很安全 Redis:像你的便签本 - 数据存在内存中,查看超快 - 数据可能丢失(便签本丢了就没了) - 适合记临时、重要的东西

2. Redis 的核心特点

  • 🚀 超快:数据在内存中,读写速度极快
  • 🎯 键值存储:像字典一样,key → value
  • 🔄 持久化:可以把内存数据保存到硬盘
  • 📚 多种数据类型:不只是字符串,还有列表、集合等
  • 🎪 功能丰富:支持发布订阅、事务等

🔑 Redis 键值对基本操作

Redis 中的数据都是以键值对的形式存储的,下面是一些最常用的基础命令:

|------------|---------------------|----------------------|
| 命令 | 语法示例 | 说明 |
| SET | SET key value | 设置一个键值对。 |
| GET | GET key | 通过键获取对应的值。 |
| DEL | DEL key [key ...] | 删除一个或多个键值对。 |
| EXISTS | EXISTS key | 判断一个键是否存在。 |
| KEYS | KEYS pattern | 按照模式(如 * )查找所有匹配的键。 |
| EXPIRE | EXPIRE key seconds | 为键设置过期时间(秒)。 |
| TTL | TTL key | 查看键的剩余生存时间。 |
| TYPE | TYPE key | 返回键所存储值的数据类型。 |

🗃️ 数据库管理操作

Redis 默认有16个数据库(编号0-15),以下命令用于管理这些数据库:

|--------------|--------------|----------------------------|
| 命令 | 语法示例 | 说明 |
| SELECT | SELECT index | 切换到指定编号的数据库。 |
| DBSIZE | DBSIZE | 返回当前数据库的 key 的数量 。 |
| FLUSHDB | FLUSHDB | 清空当前数据库 中的所有键。 |
| FLUSHALL | FLUSHALL | 清空所有数据库 中的键, 请慎用 。 |

💻 实战示例

您可以在 Redis 客户端中输入以下命令来体验上述操作:

复制代码
# 切换到2号数据库
127.0.0.1:6379> SELECT 2
OK

# 设置一个键值对
127.0.0.1:6379[2]> SET username "Redis新手"
OK

# 获取这个值
127.0.0.1:6379[2]> GET username
"Redis新手"

# 查看当前数据库的key数量
127.0.0.1:6379[2]> DBSIZE
(integer) 1

# 设置一个10秒后过期的键
127.0.0.1:6379[2]> SET temp_data "临时数据" EX 10
OK

# 查看所有键(注意:KEYS * 在生产环境需谨慎使用)
127.0.0.1:6379[2]> KEYS *
1) "username"
2) "temp_data"

⚠️ 重要提醒

  • KEYS * 命令需谨慎 :这个命令会遍历所有键,如果数据库很大,可能会导致 Redis 暂时阻塞,影响其他命令执行。在生产环境中,如果可以,请尽量避免使用。
  • FLUSHALL 命令非常危险 :它会清除所有数据库 里的数据,且不可恢复,使用时务必确认操作环境。
  • DBSIZE 命令是高效的:与 KEYS * 不同,DBSIZE 命令会直接返回一个内部计数,速度极快,可以放心使用。xx

3. Redis 的数据类型(最重要!)

3.1 String(字符串)

复制代码
# 像变量赋值
SET username "张三"       # 存数据
GET username             # 取数据 → "张三"
INCR view_count          # 自增:view_count += 1
DECR stock               # 自减:stock -= 1

使用场景:缓存、计数器、分布式锁

🔢 字符串的数值操作

这些命令专门用于处理数字类型的字符串值:

|-----------------|---------------------------|---------|-----------------------------------|
| 命令 | 语法 | 说明 | 示例 |
| INCR | INCR key | 将键的值增加1 | INCR views → views=1 |
| DECR | DECR key | 将键的值减少1 | DECR stock → stock=99 |
| INCRBY | INCRBY key increment | 按指定数值增加 | INCRBY score 5 → score+5 |
| DECRBY | DECRBY key decrement | 按指定数值减少 | DECRBY balance 100 → balance-100 |
| INCRBYFLOAT | INCRBYFLOAT key increment | 按浮点数增加 | INCRBYFLOAT price 0.5 → price+0.5 |

📍 字符串的范围操作

这些命令用于处理字符串的子串:

|--------------|---------------------------|------------|----------------------------|
| 命令 | 语法 | 说明 | 示例 |
| GETRANGE | GETRANGE key start end | 获取字符串的子串 | GETRANGE msg 0 4 → "Hello" |
| SETRANGE | SETRANGE key offset value | 从指定位置覆盖字符串 | SETRANGE name 3 "XX" |
| APPEND | APPEND key value | 追加字符串 | APPEND msg " World" |
| STRLEN | STRLEN key | 获取字符串长度 | STRLEN msg → 11 |

📊 命令特性总结

|-------------------|-----------|-------------|
| 命令类型 | 特点 | 使用场景 |
| INCR/DECR | 原子操作,线程安全 | 计数器、ID生成、库存 |
| INCRBY/DECRBY | 指定步长增减 | 批量更新、积分系统 |
| INCRBYFLOAT | 支持浮点数 | 价格计算、科学计算 |
| GETRANGE | 按索引获取子串 | 摘要生成、字符串分析 |
| SETRANGE | 部分覆盖字符串 | 模板填充、内容修正 |
| APPEND | 字符串拼接 | 日志记录、消息构建 |

⚠️ 注意事项

INCR/DECR 只能用于整数

复制代码
SET count "10"
INCR count  # ✓ 正确:11

SET count "10.5" 
INCR count  # ✗ 错误:值不是整数

SETRANGE 会覆盖原有内容

复制代码
SET text "Hello World"
SETRANGE text 6 "Redis"  # 结果:"Hello Redis"(不是"Hello Redis World")

GETRANGE 索引从0开始

复制代码
SET text "Redis"
GETRANGE text 0 1  # "Re"
GETRANGE text 1 3  # "edi"

3.2 List(列表)

复制代码
# 像排队,先进先出
LPUSH messages "hello"    # 左边插入
LPUSH messages "world"    # 列表:["world", "hello"]
RPOP messages             # 右边弹出 → "hello"

# 或者像栈,后进先出  
RPUSH stack "item1"
RPUSH stack "item2"
RPOP stack                # 弹出 → "item2"

使用场景:消息队列、最新消息列表

3.3 Set(集合)

复制代码
# 像数学的集合,元素不重复
SADD tags "java" "python" "redis"    # 添加元素
SMEMBERS tags                         # 查看所有 → java, python, redis
SADD tags "java"                      # 添加重复元素,会被忽略
SISMEMBER tags "java"                 # 检查是否存在 → 1(存在)

# 集合运算
SADD set1 "a" "b" "c"
SADD set2 "b" "c" "d"  
SINTER set1 set2                      # 交集 → b, c
SUNION set1 set2                      # 并集 → a, b, c, d

使用场景:标签、好友关系、抽奖

3.4 Hash(哈希)

复制代码
# 像对象或字典
HSET user:1001 name "张三" age 25 city "北京"  # 设置字段
HGET user:1001 name                          # 获取字段 → "张三"
HGETALL user:1001                            # 获取所有 → name,张三,age,25...
HINCRBY user:1001 age 1                      # 年龄+1 → 26

使用场景:用户信息、商品信息、配置信息

3.5 Zset(有序集合)

复制代码
# 带分数的集合,可以排序
ZADD ranking 95 "张三" 87 "李四" 92 "王五"    # 添加带分数的元素
ZRANGE ranking 0 -1                         # 按分数升序 → 李四,王五,张三  
ZREVRANGE ranking 0 -1                      # 按分数降序 → 张三,王五,李四
ZRANK ranking "张三"                         # 查看排名 → 2(从0开始)
ZSCORE ranking "张三"                        # 查看分数 → 95

使用场景:排行榜、带权重的队列

三种特殊类型的总结

|-----------------|------|--------------|----------------|
| 类型 | 主要用途 | 特点 | 适用场景 |
| Bitmaps | 位级操作 | 极其节省空间,支持位运算 | 用户签到、在线状态、特征标记 |
| HyperLogLog | 基数估算 | 固定12KB内存,有误差 | UV统计、搜索词去重计数 |
| Geospatial | 地理位置 | 支持距离计算、范围查询 | 附近的人、门店查找、物流配送 |

4. Redis 的实际使用

安装和启动:

复制代码
# 安装Redis
sudo apt-get install redis-server

# 启动Redis服务
redis-server

# 连接Redis客户端
redis-cli

# 测试连接
ping  # 应该返回 PONG

基本操作演示:

复制代码
# 字符串操作
127.0.0.1:6379> SET website "baidu.com"
OK
127.0.0.1:6379> GET website
"baidu.com"

# 列表操作  
127.0.0.1:6379> LPUSH recent_users "user1" "user2" "user3"
(integer) 3
127.0.0.1:6379> LRANGE recent_users 0 -1
1) "user3"
2) "user2" 
3) "user1"


# 哈希操作
127.0.0.1:6379> HSET product:1001 name "手机" price 2999 stock 100
(integer) 3
127.0.0.1:6379> HGET product:1001 name
"手机"

Redis vs 传统数据库

|----------|-----------|------------|
| 特性 | Redis | MySQL |
| 存储位置 | 内存 | 硬盘 |
| 读写速度 | 极快(微秒级) | 较慢(毫秒级) |
| 数据容量 | 受内存限制 | 受硬盘限制 |
| 数据类型 | 丰富的数据结构 | 主要是表结构 |
| 适用场景 | 缓存、计数器、队列 | 持久化存储、复杂查询 |

Redis 的重要特性

过期时间:

复制代码
SET session:user123 "data" EX 3600    # 1小时后自动删除
TTL session:user123                   # 查看剩余时间

发布订阅:

复制代码
# 终端1:订阅频道
SUBSCRIBE news

# 终端2:发布消息  
PUBLISH news "今日头条!"

事务:

复制代码
MULTI                 # 开始事务
SET key1 "value1"
SET key2 "value2" 
EXEC                  # 执行事务

学习建议

新手学习路径:

  1. 先学基本命令:SET/GET, LPUSH/LPOP, SADD/SMEMBERS 等
  2. 理解数据类型:知道每种数据类型的适用场景
  3. 学习持久化:了解 RDB 和 AOF 的区别
  4. 掌握实际应用:缓存、计数器、队列等场景

常用命令练习:

复制代码
# 1. 字符串操作
SET name "Redis"
GET name

# 2. 列表操作  
LPUSH numbers 1 2 3
LRANGE numbers 0 -1

# 3. 集合操作
SADD fruits "apple" "banana"
SMEMBERS fruits

# 4. 哈希操作
HSET user:1000 name "John" age 30
HGETALL user:1000

总结

Redis 就是
一个超快的内存数据库
键值对 存储数据,支持多种数据结构
主要用来做缓存计数器消息队列
核心价值

  • 🚀 速度快:比传统数据库快100倍
  • 🎯 使用简单:像操作字典一样简单
  • 🔧 功能丰富:5种数据结构满足不同需求
  • 📊 适用场景多:缓存、排行榜、消息队列等
    记住 :Redis 不是要替代 MySQL,而是配合使用,把热点数据放 Redis 提升性能!
相关推荐
QT 小鲜肉5 小时前
【个人成长笔记】在本地Windows系统中如何正确使用adb pull命令,把Linux系统中的文件或文件夹复制到本地中(亲测有效)
linux·windows·笔记·学习·adb
panplan.top6 小时前
Tornado + Motor 微服务架构(Docker + 测试 + Kubernetes)
linux·python·docker·微服务·k8s·tornado
FJW0208146 小时前
【Linux】系统中的文件管理
linux·运维·服务器
豆是浪个6 小时前
Linux(Centos 7.6)命令详解:rpm
linux·运维·centos
Z_Xshan7 小时前
docker 容器web站点 中文文件名访问404问题
linux·开发语言·docker
晓梦.7 小时前
Linux
linux·运维·服务器
运维帮手大橙子8 小时前
Linux如何安装使用Rust指南
linux·运维·rust
John.Lewis8 小时前
C++初阶(14)list
开发语言·c++·笔记
_李小白8 小时前
【OPENGL ES 3.0 学习笔记】第九天:缓存、顶点和顶点数组
笔记·学习·elasticsearch