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. 事务与管道

  • 事务:通过 MULTIEXEC 实现一组命令的原子执行。
  • 管道:可以将多个命令一起发送,减少网络延迟。

5. 持久化

  • Redis 支持 RDB(快照)和 AOF(追加文件)两种持久化方式,可以将数据保存到磁盘。

6. 过期和清除

  • 支持设置键的过期时间,可以使用 EXPIRETTL 命令。
  • 支持主动删除或懒惰删除过期的键。

7. 事务和锁

  • Redis 可以实现分布式锁,使用 SETNXEXPIRE 命令来控制资源的访问。

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 评论