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 # ✓ 正确:11SET 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 # 执行事务
学习建议
新手学习路径:
- 先学基本命令:SET/GET, LPUSH/LPOP, SADD/SMEMBERS 等
- 理解数据类型:知道每种数据类型的适用场景
- 学习持久化:了解 RDB 和 AOF 的区别
- 掌握实际应用:缓存、计数器、队列等场景
常用命令练习:
# 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 提升性能!