Redis 命令详解与实战案例

2025-11-24 18:50

本文主要是介绍Redis 命令详解与实战案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Redis命令详解与实战案例》本文详细介绍了Redis的基础知识、核心数据结构与命令、高级功能与命令、最佳实践与性能优化,以及实战应用场景,通过实战案例,展示了如何使用Redis构建高性能应用系统...

Redis 命令详解与实战案例

一、Redis 基础介绍

Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统,支持多种数据结构,可用作数据库、缓存和消息代理。它提供字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)、有序集合(Sorted Sets)等多种数据结构的存储。

二、Redis 核心数据结构与命令

1. 字符串(Strings)

最基础的数据类型,可存储文本、数字或二进制数据(最大512MB)。

常用命令:
命令语法说明
SETSET key value [EX seconds]设置键值对(带过期时间)
GETGET key获取键值
INCRINCR key值增加1(整数操作)
DECRDECR key值减少1(整数操作)
APPENDAPPEND key value追加值到现有字符串
STRLENSTRLEN key获取字符串长度
实战案例:
# 设置用户会话
> SET user:1000:session "session_token" EX 3600# 1小时后过期
# 网站访问计数器
> SET visits 0
> INCR visits# 访问量+1
(integer) 1
> INCR visits
(integer) 2
# 缓存商品信息
> SET product:1234:name "iPhone 15 Pro"
> GET product:1234:name
"iPhone 15 Pro"

2. 哈希(Hashes)

键值对集合,适合存储对象(如用户信息)。

常用命令:
命令语法说明
HSETHSET key field value设置哈希字段值
HGETHGET key field获取哈希字段值
HGETALLHGETALL key获取所有字段和值
HDELHDEL key field删除字段
HINCRBYHINCRBY key field increment增加数值字段的值
实战案例:
# 存储js用户信息
> HSET user:1000 name php"Alice" age 30 email "alice@example.com"
(integer) 3
# 获取用户信息
> HGET user:1000 name
"Alice"
> HGETALL user:1000
1) "name"
2) "Alice"
3) "age"
4) "30"
5) "email"
6) "alice@example.com"
# 更新用户年龄
> HINCRBY user:1000 age 1
(integer) 31

3. 列表(Lists)

有序字符串集合,支持从两端插入/删除元素,实现队列和栈。

常用命令:
命令语法说明
LPUSHLPUSH key value [value …]左侧插入元素
RPUSHRPUSH key value [value …]右侧插入元素
LPOPLPOP key左侧弹出元素
RPOPRPOP key右侧弹出元素
LRANGELRANGE key start stop获取列表片段
LTRIMLTRIM key start stop修剪列表
实战案例:
# 消息队列(生产者)
> LPUSH notifications "Order #1001 shipped"
> LPUSH notifications "User login alert"
# 消息队列(消费者)
> RPOP notifications
"Order #1001 shipped"
# 最新动态(保留最近的10条)
> LPUSH user:1000:activity "Liked post #123"
> LTRIM user:1000:activity 0 9# 只保留前10条

4. 集合(Sets)

无序的唯一字符串集合,支持交集、并集等操作。

常用命令:
命令语法说明
SADDSADD key member [member …]添加成员
SREMSREM key member [member …]移除成员
SMEMBERSSMEMBERS key获取所有成员
SISMEMBERSISMEMBER key member检查成员是否存在
SINTERSINTER key [key …]多个集合的交集
实战案例:
# 用户标签系统
> SADD user:1000:tags "sports" "music" "tech"
> SADD user:1001:tags "music" "food" "travel"
# 查找共同兴趣
> SINTER user:1000:tags user:1001:tags
1) "music"
# 内容去重
> SADD article:1234:viewers "user1000" "user1001"
> SADD article:1234:viewers "user1000"# 重复添加无效
(integer) 0

5. 有序集合(Sorted Sets)

带分数的有序集合,元素按分数排序,适合排行榜场景。

常用命令:
命令语法说明
ZADDZADD key score member添加成员(带分数)
ZRANGEZRANGE key start stop [WITHSCORES]按索引范围获取成员
ZREVRANGEZREVRANGE key start stop [WITHSCORES]按索引倒序获取成员
ZRANKZRANK key member获取成员排名(升序)
ZREVRANKZREVRANK key member获取成员排名(降序)
实战案例:
# 游戏排行榜
> ZADD leaderboard 2500 "PlayerA"
> ZADD leaderboard 3200 "PlayerB"
> ZADD leaderboard 1800 "PlayerC"
# 获取前3名
> ZREVRANGE leaderboard 0 2 WITHSCORES
1) "PlayerB"
2) "3200"
3) "PlayerA"
4) "2500"
5) "PlayerC"
6) "1800"
# 更新玩家分数
> ZADD leaderboard 3500 "PlayerB"# 更新分数

三、Redis 高级功能与命令

1. 键管理命令

命令语法说明
KEYSKEYS pattern查找匹配的键
DELDEL key [key …]删除键
EXPIREEXPIRE key seconds设置键过期时间
TTLTTL key查看键剩余生存时间
TYPETYPE key查看键的数据类型
实战案例:
> SET session:abc123 "user_data" EX 1800# 30分钟后过期
> TTL session:abc123
(integer) 1798
> KEYS session:*# 查找所有会话键
1) "session:abc123"

2. 事务操作(MULTI/EXEC)

> MULTI# 开始事务
> SET balance:1000 500
> DECRBY balance:1000 100# 扣款100
> INCRBY sales:2023 100# 增加销售额
> EXEC# 执行事务
1) OK
2) (integer) 400
3) (integer) 100

3. Lua 脚本支持

# 原子性更新计数器并返回新值
> EVAL "local current = redis.call('GET', KEYS[1]);
if current then
current = tonumber(current) + 1
else
current = 1
end;
redis.call('SET', KEYS[1], current);
retChina编程urn current" 1 page:vijsews

4. 发布/订阅(Pub/Sub)

# 终端1:订阅频道
> SUBSCRIBE news
# 终端2:发布消息
> PUBLISH news "Breaking: Redis 7 released!"

四、Redis 最佳实践与性能优化

1. 键命名规范

  • 使用冒号分隔的命名空间:user:1000:profile
  • 避免过长的键名(影响内存和性能)
  • 示例:order:2023:09:1234

2. 内存优化技巧

# 使用哈希压缩小型对象
> HSET user:1000 name "Alice" age 30
# 比多个独立键更节省内存:
# SET user:1000:name "Alice"
# SET user:1000:age 30

3. 批量操作提升性能

# 管道(Pipeline)操作
(echo -en "PING\r\nPING\r\nPING\r\n"; sleep 1) | nc localhost 6379
# 现代客户端支持(如Redis-py)
pipe = redis.pipeline()
pipe.set('key1', 'value1')
pipe.get('key2')
pipe.execute()

4. 持久化策略选择

javascript特点
RDB定时快照,恢复快,可能丢失最后一次快照后的数据
AOF记录所有写操作,数据更安全,文件较大
RDB+AOF推荐方案,结合两者优势(Redis 4.0+ 支持)

五、Redis 实战应用场景

1. 缓存穿透解决方案

# 布隆过滤器防止缓存穿透
> BF.RESERVE products 0.01 1000000
> BF.ADD products "product:1234"
> BF.EXISTS products "product:5678"# 返回0表示不存在

2. 分布式锁实现

# 获取锁(SET扩展命令)
> SET lock:order_1234 UUID NX EX 30
# 释放锁(Lua脚本保证原子性)
> EVAL "if redis.call('GET', KEYS[1]) == ARGV[1] then
return redis.call('DEL', KEYS[1])
else
return 0
end" 1 lock:order_1234 UUID

3. 实时排行榜

# 添加分数
> ZADD leaderboard 95 "PlayerA" 87 "PlayerB" 92 "PlayerC"
# 获取前10名
> ZREVRANGE leaderboard 0 9 WITHSCORES
# 获取玩家排名
> ZREVRANK leaderboard "PlayerB"

六、Redis 命令速查表

类别常用命令
通用KEYS, DEL, EXISTS, EXPIRE, TTL, TYPE
字符串SET, GET, INCR, DECR, APPEND, STRLEN
哈希HSET, HGET, HGETALL, HDEL, HINCRBY
列表LPUSH, RPUSH, LPOP, RPOP, LRANGE, LTRIM
集合SADD, SREM, SMEMBERS, SISMEMBER, SINTER
有序集合ZADD, ZRANGE, ZREVRANGE, ZRANK, ZREVRANK
事务MULTI, EXEC, DISCARD, WATCH
发布订阅PUBLISH, SUBSCRIBE, UNSUBSCRIBE

通过掌握这些核心命令和实战案例,您将能够高效地利用 Redis 构建高性能应用系统。建议结合 Redis 官方文档(https://redis.io/commands)深入学习每个命令的详细参数和使用场景。

到此这篇关于Redis 命令详解与实战案例的文章就介绍到这了,更多相关Redis 命令实战内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于Redis 命令详解与实战案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1156262

相关文章

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

MySQL中between and的基本用法、范围查询示例详解

《MySQL中betweenand的基本用法、范围查询示例详解》BETWEENAND操作符在MySQL中用于选择在两个值之间的数据,包括边界值,它支持数值和日期类型,示例展示了如何使用BETWEEN... 目录一、between and语法二、使用示例2.1、betwphpeen and数值查询2.2、be

python中的flask_sqlalchemy的使用及示例详解

《python中的flask_sqlalchemy的使用及示例详解》文章主要介绍了在使用SQLAlchemy创建模型实例时,通过元类动态创建实例的方式,并说明了如何在实例化时执行__init__方法,... 目录@orm.reconstructorSQLAlchemy的回滚关联其他模型数据库基本操作将数据添

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造

Springboot3 ResponseEntity 完全使用案例

《Springboot3ResponseEntity完全使用案例》ResponseEntity是SpringBoot中控制HTTP响应的核心工具——它能让你精准定义响应状态码、响应头、响应体,相比... 目录Spring Boot 3 ResponseEntity 完全使用教程前置准备1. 项目基础依赖(M

Android使用java实现网络连通性检查详解

《Android使用java实现网络连通性检查详解》这篇文章主要为大家详细介绍了Android使用java实现网络连通性检查的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录NetCheck.Java(可直接拷贝)使用示例(Activity/Fragment 内)权限要求

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param