Redis 基础命令:开发者必备知识
在现代高性能应用开发中,数据存储的速度和效率至关重要。Redis(Remote Dictionary Server)作为一款开源的、内存中的数据结构存储系统,常被用作数据库、缓存和消息代理。它以其闪电般的速度、丰富的数据结构和灵活的部署方式,赢得了全球开发者的青睐。
本文将深入探讨 Redis 的核心概念和一系列基础命令,这些是每个开发者在日常工作中都必备的知识。
1. Redis 简介
Redis 是一个高性能的键值存储系统,支持多种数据结构,包括字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。它将所有数据存储在内存中,因此读写速度极快,同时通过 RDB 和 AOF 机制支持数据持久化,确保数据不会丢失。
2. 连接 Redis 服务器
在开始之前,你需要一个运行中的 Redis 服务器。通常可以通过 redis-cli 命令行工具连接到 Redis 服务器:
bash
redis-cli
如果 Redis 服务器运行在非默认端口或远程主机上,可以使用 -h 和 -p 参数:
bash
redis-cli -h your_redis_host -p 6379
连接成功后,你就可以开始执行 Redis 命令了。
3. 通用键(Key)管理命令
Redis 的所有数据都以键值对的形式存储。以下是一些通用的键管理命令:
KEYS pattern: 查找所有符合给定模式的键。KEYS *: 查找所有键。KEYS user:*: 查找所有以user:开头的键。- 注意:
KEYS命令在生产环境中慎用,因为它会遍历所有键,可能阻塞服务器。
EXISTS key [key ...]: 检查一个或多个键是否存在。返回存在的键的数量。EXISTS mykey
DEL key [key ...]: 删除一个或多个键。返回成功删除的键的数量。DEL mykey anotherkey
EXPIRE key seconds: 为键设置过期时间(以秒为单位)。EXPIRE mykey 60(键在 60 秒后过期)
TTL key: 返回键的剩余生存时间(Time To Live),以秒为单位。-1表示键永不过期。-2表示键不存在。
PERSIST key: 移除键的过期时间,使其永不过期。PERSIST mykey
TYPE key: 返回键存储的值的数据类型。TYPE mykey(可能返回string,hash,list,set,zset等)
4. Redis 数据类型及其基础命令
Redis 提供了丰富的数据结构,每种都有其独特的用途和操作命令。
4.1 字符串 (Strings)
字符串是 Redis 最基本的数据类型,可以存储任何形式的字符串,包括二进制数据(例如图片)。
SET key value [EX seconds] [PX milliseconds] [NX|XX]: 设置键的值。SET mykey "hello"SET mykey "world" EX 60: 设置键值并指定 60 秒过期。SET mykey "new" NX: 仅当键mykey不存在时才设置。SET mykey "exist" XX: 仅当键mykey存在时才设置。
GET key: 获取键的值。GET mykey
INCR key: 将键的值递增 1。键必须存储数字类型的值。INCR counter
DECR key: 将键的值递减 1。DECR counter
INCRBY key increment: 将键的值递增指定的增量。INCRBY counter 10
DECRBY key decrement: 将键的值递减指定的减量。DECRBY counter 5
APPEND key value: 将值追加到键的末尾。如果键不存在,则创建键并设置值。APPEND mykey " world"(如果mykey是 “hello”,则变为 “hello world”)
STRLEN key: 返回键存储的字符串值的长度。STRLEN mykey
4.2 散列 (Hashes)
散列是键值对的集合,适用于存储对象。每个散列可以存储多个字段及其对应的值。
HSET key field value [field value ...]: 设置散列中一个或多个字段的值。HSET user:1 name "Alice" age 30 city "New York"
HGET key field: 获取散列中指定字段的值。HGET user:1 name
HGETALL key: 获取散列中所有字段和值。HGETALL user:1
HMGET key field [field ...]: 获取散列中一个或多个字段的值。HMGET user:1 name age
HDEL key field [field ...]: 删除散列中一个或多个字段。HDEL user:1 city
HKEYS key: 获取散列中所有字段的名称。HKEYS user:1
HVALS key: 获取散列中所有字段的值。HVALS user:1
HEXISTS key field: 检查散列中是否存在指定字段。HEXISTS user:1 email
HINCRBY key field increment: 将散列中指定字段的值递增。HINCRBY user:1 age 1
4.3 列表 (Lists)
列表是简单的字符串列表,按照插入顺序排序。你可以向列表的两端添加或移除元素。
LPUSH key value [value ...]: 将一个或多个值推入列表的左端(头部)。LPUSH mylist "a" "b" "c"(列表变为c, b, a)
RPUSH key value [value ...]: 将一个或多个值推入列表的右端(尾部)。RPUSH mylist "x" "y"(列表变为c, b, a, x, y)
LPOP key: 移除并返回列表最左端的元素。LPOP mylist
RPOP key: 移除并返回列表最右端的元素。RPOP mylist
LRANGE key start stop: 获取列表中指定范围内的元素。0是第一个元素,-1是最后一个元素。LRANGE mylist 0 -1: 获取所有元素。LRANGE mylist 0 1: 获取前两个元素。
LLEN key: 返回列表的长度。LLEN mylist
LREM key count value: 从列表中移除与值相等的元素。count > 0: 从头开始移除count个元素。count < 0: 从尾开始移除count个元素。count = 0: 移除所有相等的元素。LREM mylist 1 "a"
4.4 集合 (Sets)
集合是字符串的无序唯一集合。你可以添加、删除、检查元素,并执行交集、并集、差集操作。
SADD key member [member ...]: 将一个或多个成员添加到集合中。SADD myset "apple" "banana" "orange"
SMEMBERS key: 返回集合中的所有成员。SMEMBERS myset
SISMEMBER key member: 检查成员是否是集合的成员。返回 1 表示是,0 表示否。SISMEMBER myset "apple"
SREM key member [member ...]: 从集合中移除一个或多个成员。SREM myset "banana"
SCARD key: 返回集合的成员数量。SCARD myset
SINTER key [key ...]: 返回给定所有集合的交集。SADD set1 "a" "b",SADD set2 "b" "c",SINTER set1 set2(返回 “b”)
SUNION key [key ...]: 返回给定所有集合的并集。SUNION set1 set2(返回 “a”, “b”, “c”)
SDIFF key [key ...]: 返回给定所有集合的差集。SDIFF set1 set2(返回 “a”)
4.5 有序集合 (Sorted Sets)
有序集合类似于集合,但每个成员都会关联一个分数(score),Redis 根据分数对成员进行排序。分数相同则按字典序排序。
ZADD key score member [score member ...]: 将一个或多个成员及其分数添加到有序集合中。ZADD myzset 1 "member1" 2 "member2" 3 "member3"
ZRANGE key start stop [WITHSCORES]: 返回有序集合中指定索引范围内的成员。ZRANGE myzset 0 -1: 返回所有成员(按分数从小到大)。ZRANGE myzset 0 1 WITHSCORES: 返回前两个成员及其分数。
ZREVRANGE key start stop [WITHSCORES]: 返回有序集合中指定索引范围内的成员,按分数从大到小排序。ZREVRANGE myzset 0 -1
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]: 返回分数在给定范围内的成员。ZRANGEBYSCORE myzset 2 3: 返回分数在 2 到 3 之间的成员。
ZREM key member [member ...]: 从有序集合中移除一个或多个成员。ZREM myzset "member1"
ZCARD key: 返回有序集合的成员数量。ZCARD myzset
ZSCORE key member: 返回成员的分数。ZSCORE myzset "member2"
5. 事务 (Transactions)
Redis 事务允许你在一个单独的、隔离的步骤中执行一组命令。事务中的所有命令要么全部执行,要么全部不执行。
MULTI: 标记事务块的开始。此后所有命令都会被放入队列,而不是立即执行。EXEC: 执行所有在MULTI和EXEC之间排队的命令。DISCARD: 取消事务,放弃所有排队的命令。WATCH key [key ...]: 监视一个或多个键。如果在WATCH之后,EXEC之前,被监视的键被其他客户端修改了,那么事务将失败(不会执行)。WATCH mykeyMULTIINCR mykeyEXEC
示例:
WATCH mycounter
MULTI
INCR mycounter
EXEC
如果 mycounter 在 WATCH 之后但在 EXEC 之前被其他客户端修改,那么 INCR 命令将不会执行。
6. 发布/订阅 (Publish/Subscribe)
Redis 提供了发布/订阅(Pub/Sub)消息范式。发布者发布消息,订阅者接收消息。
PUBLISH channel message: 将消息发布到指定频道。PUBLISH chat "Hello everyone!"
SUBSCRIBE channel [channel ...]: 订阅一个或多个频道。SUBSCRIBE chat news
PSUBSCRIBE pattern [pattern ...]: 订阅一个或多个模式(glob 风格)。PSUBSCRIBE news.*(订阅所有以news.开头的频道)
UNSUBSCRIBE [channel [channel ...]]: 退订指定的频道。PUNSUBSCRIBE [pattern [pattern ...]]: 退订指定的模式。
注意: 订阅者客户端在订阅模式下无法执行其他命令,除非是取消订阅命令。
7. 持久化 (Persistence)
Redis 提供了两种主要的持久化方式:
- RDB (Redis Database): 在指定的时间间隔内将内存中的数据集快照写入磁盘。它是一个非常紧凑的文件,适合用于备份。
- AOF (Append Only File): 记录服务器接收到的所有写操作命令,以文本协议格式追加到文件末尾。当 Redis 重启时,通过重新执行 AOF 文件中的命令来恢复数据。
开发者通常不需要直接使用命令来触发这些持久化过程(除非进行手动备份),而是通过配置 redis.conf 文件来管理它们。
总结
Redis 凭借其卓越的性能和灵活的数据结构,已经成为现代应用不可或缺的一部分。掌握这些基础命令,是你高效利用 Redis 构建健壮、高性能应用的基石。从简单缓存到复杂的消息队列,Redis 的能力远超你的想象。
继续深入学习 Redis,你可以探索更高级的命令、集群模式、Lua 脚本、以及如何将其与你选择的编程语言集成,从而充分发挥其强大功能。