Redis的常见操作
Redis 是一个功能强大的键值数据库,它提供了多种数据结构和丰富的命令。以下是 Redis 支持的一些主要功能和数据结构:
1. 数据结构
a. 字符串(String)
- Redis 中最基本的数据类型,可以存储文本、数字等。
- 支持的命令:SET, GET, INCR, DECR, APPEND, MGET, MSET 等。
b. 哈希(Hash)
- 用于存储键值对的集合,适合存储对象。
- 支持的命令:HSET, HGET, HGETALL, HDEL, HMSET, HMGET 等。
c. 列表(List)
- 有序的字符串列表,可以从两端推入或弹出元素。
- 支持的命令:LPUSH, RPUSH, LPOP, RPOP, LRANGE, LREM 等。
d. 集合(Set)
- 无序的字符串集合,不允许重复元素。
- 支持的命令:SADD, SREM, SISMEMBER, SMEMBERS, SUNION 等。
e. 有序集合(Sorted Set)
- 类似于集合,但每个元素都有一个分数,可以按分数排序。
- 支持的命令:ZADD, ZREM, ZRANGE, ZRANGEBYSCORE, ZCARD 等。
2. 事务和 Lua 脚本
- 支持事务,通过 MULTI, EXEC, WATCH 等命令来实现。
- 支持 Lua 脚本,可以在服务器端执行复杂的操作,保证原子性。
3. 发布/订阅(Pub/Sub)
- Redis 提供了发布/订阅功能,可以实现消息的实时推送。
- 支持的命令:PUBLISH, SUBSCRIBE, UNSUBSCRIBE。
4. 事务与管道
- 事务:通过 MULTI 和 EXEC 实现一组命令的原子执行。
- 管道:可以将多个命令一起发送,减少网络延迟。
5. 持久化
- Redis 支持 RDB(快照)和 AOF(追加文件)两种持久化方式,可以将数据保存到磁盘。
6. 过期和清除
- 支持设置键的过期时间,可以使用 EXPIRE 和 TTL 命令。
- 支持主动删除或懒惰删除过期的键。
7. 事务和锁
- Redis 可以实现分布式锁,使用 SETNX 和 EXPIRE 命令来控制资源的访问。
8. 地理位置(Geospatial)
- Redis 支持地理位置数据的存储和查询,可以进行半径查询等操作。
- 支持的命令:GEOADD, GEODIST, GEORADIUS, GEORADIUSBYMEMBER 等。
9. 其他功能
- 位图(Bitmap): 可以用于高效的位操作,适合统计和状态跟踪。
- 超高效的计数器: 通过字符串和哈希实现高效的计数。
- HyperLogLog: 用于基数估算,支持高效的唯一计数。
下面是对一些常用 Redis 命令的简单介绍,包括它们的用途和示例:
1. 字符串(String)
- SET key value: 设置一个键的值。plaintext复制1SET mykey "Hello"
- GET key: 获取指定键的值。plaintext复制1GET mykey # 返回 "Hello"
- INCR key: 将指定键的值增加 1(如果键不存在,则初始化为 0)。plaintext复制1INCR mycounter # 如果 mycounter 不存在,设置为 1;如果存在,增加 1
- DECR key: 将指定键的值减少 1。plaintext复制1DECR mycounter # 将 mycounter 的值减少 1
2. 哈希(Hash)
- HSET key field value: 在哈希表中设置字段的值。plaintext复制1HSET user:1000 name "Alice" # 设置用户 ID 为 1000 的名字为 "Alice"
- HGET key field: 获取哈希表中指定字段的值。plaintext复制1HGET user:1000 name # 返回 "Alice"
- HGETALL key: 获取哈希表中所有字段及其值。plaintext复制1HGETALL user:1000 # 返回所有字段和对应的值
3. 列表(List)
- LPUSH key value: 将值插入列表的左侧(头部)。plaintext复制1LPUSH mylist "item1" # 在列表 mylist 的头部插入 "item1"
- RPUSH key value: 将值插入列表的右侧(尾部)。plaintext复制1RPUSH mylist "item2" # 在列表 mylist 的尾部插入 "item2"
- LPOP key: 移除并返回列表的第一个元素。plaintext复制1LPOP mylist # 返回并移除列表 mylist 的第一个元素
- RPOP key: 移除并返回列表的最后一个元素。plaintext复制1RPOP mylist # 返回并移除列表 mylist 的最后一个元素
- LRANGE key start stop: 获取列表指定范围的元素。plaintext复制1LRANGE mylist 0 -1 # 获取列表 mylist 中的所有元素
4. 集合(Set)
- SADD key value: 向集合中添加一个或多个成员。plaintext复制1SADD myset "value1" # 向集合 myset 添加 "value1"
- SREM key value: 从集合中移除一个或多个成员。plaintext复制1SREM myset "value1" # 从集合 myset 移除 "value1"
- SMEMBERS key: 获取集合中的所有成员。plaintext复制1SMEMBERS myset # 返回集合 myset 中的所有成员
5. 有序集合(Sorted Set)
- ZADD key score member: 向有序集合中添加一个成员,指定其分数。plaintext复制1ZADD myzset 1 "one" # 向有序集合 myzset 添加成员 "one",分数为 1
- ZRANGE key start stop: 获取有序集合中指定范围的成员。plaintext复制1ZRANGE myzset 0 -1 # 获取有序集合 myzset 中的所有成员
6. 发布/订阅(Pub/Sub)
- PUBLISH channel message: 向指定频道发送消息。plaintext复制1PUBLISH mychannel "Hello, World!" # 向频道 mychannel 发送消息
- SUBSCRIBE channel: 订阅指定频道,以接收消息。plaintext复制1SUBSCRIBE mychannel # 订阅频道 mychannel
7. 事务
- MULTI: 开始一个事务。plaintext复制1MULTI # 开始事务
- EXEC: 执行事务中的所有命令。plaintext复制1EXEC # 提交事务
8. 过期和清除
- EXPIRE key seconds: 设置键的过期时间(以秒为单位)。plaintext复制1EXPIRE mykey 60 # 将 mykey 设置为 60 秒后过期
- TTL key: 获取键的剩余生存时间(以秒为单位)。plaintext复制1TTL mykey # 返回 mykey 的剩余时间
以下是go语言实现以上操作的示例:
package main
import (
"context"
"fmt"
"log"
"time"
"github.com/go-redis/redis/v8"
)
var ctx = context.Background()
func main() {
// 创建 Redis 客户端
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379", // Redis 服务器地址
})
// 测试连接
Pong, err := rdb.Ping(ctx).Result()
if err != nil {
log.Fatalf("Could not connect to Redis: %v", err)
}
fmt.Println(Pong)
// 字符串操作
rdb.Set(ctx, "mykey", "Hello", 0)
val, _ := rdb.Get(ctx, "mykey").Result()
fmt.Println("mykey:", val)
rdb.Incr(ctx, "counter")
counter, _ := rdb.Get(ctx, "counter").Result()
fmt.Println("counter:", counter)
// 哈希操作
rdb.HSet(ctx, "user:1000", "name", "Alice", "age", 30)
name, _ := rdb.HGet(ctx, "user:1000", "name").Result()
fmt.Println("User Name:", name)
// 列表操作
rdb.LPush(ctx, "mylist", "item1")
rdb.RPush(ctx, "mylist", "item2")
listItems, _ := rdb.LRange(ctx, "mylist", 0, -1).Result()
fmt.Println("List Items:", listItems)
// 集合操作
rdb.SAdd(ctx, "myset", "value1", "value2")
setMembers, _ := rdb.SMembers(ctx, "myset").Result()
fmt.Println("Set Members:", setMembers)
// 有序集合操作
rdb.ZAdd(ctx, "myzset", &redis.Z{Score: 1, Member: "one"})
rdb.ZAdd(ctx, "myzset", &redis.Z{Score: 2, Member: "two"})
sortedSetMembers, _ := rdb.ZRange(ctx, "myzset", 0, -1).Result()
fmt.Println("Sorted Set Members:", sortedSetMembers)
// 发布/订阅
go func() {
pubsub := rdb.Subscribe(ctx, "mychannel")
_, err := pubsub.Receive(ctx)
if err != nil {
log.Fatalf("Could not subscribe to channel: %v", err)
}
ch := pubsub.Channel()
for msg := range ch {
fmt.Println("Received message:", msg.Payload)
}
}()
rdb.Publish(ctx, "mychannel", "Hello, World!")
time.Sleep(1 * time.Second) // 等待消息被处理
// 事务操作
pipe := rdb.Pipeline()
pipe.Set(ctx, "key1", "value1", 0)
pipe.Set(ctx, "key2", "value2", 0)
_, err = pipe.Exec(ctx)
if err != nil {
log.Fatalf("Could not execute pipeline: %v", err)
}
val1, _ := rdb.Get(ctx, "key1").Result()
val2, _ := rdb.Get(ctx, "key2").Result()
fmt.Println("Key1:", val1, "Key2:", val2)
// 过期操作
rdb.Set(ctx, "expire_key", "This will expire", 5*time.Second)
expiredVal, _ := rdb.Get(ctx, "expire_key").Result()
fmt.Println("Expire Key:", expiredVal)
time.Sleep(6 * time.Second) // 等待键过期
expiredVal, err = rdb.Get(ctx, "expire_key").Result()
if err == redis.Nil {
fmt.Println("Expire Key has expired")
} else {
fmt.Println("Expire Key:", expiredVal)
}
}
评论列表
0/1000
共 0 评论