Redis 实践| 青训营

84 阅读3分钟

Redis 的优点

  1. 使用数据结构来表示不同类型的数据,如字符串、列表、集合、散列等,选择合适的数据结构可以提高效率。
  2. 使用 Redis 事务来执行多个相关命令,确保事务的原子性。
  3. 使用 Redis 管道技术,可以降低网络开销,合并多次请求提高效率。
  4. 采用懒删除策略来优化删除性能,避免直接删除大键导致阻塞。
  5. 散列结构 (hash) 非常适合对象存储,可以直接对应对象属性,避免多键查询。
  6. 使用发布订阅模型进行消息队列,可以实现解耦和异步处理。
  7. 设置不同业务或数据类型的数据库区 (0-15), 可以独立扩容。
  8. 数据持久化策略需要评估 RDB 快照和 AOF 日志的代价。
  9. 启用主从复制来提高可用性,并且进行读写分离。
  10. 定期使用内存回收和信号量策略来主动释放内存。
  11. 监控 Redis 并启用内存过期策略来防止内存不足。
  12. 使用连接池提高连接效率并控制连接数。

我体验下来用 redis 的最大好处就是查询非常快,有缓存直接秒

在 golang 下配置十分地简单,

go get github.com/go-redis/redis/v8

基础配置

    client := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379", // Redis 服务器地址
        Password: "",              // 密码
        DB:       0,               // 使用的数据库编号
    })

使用 Ping 测试连接

    ctx := context.Background()
    _, err := client.Ping(ctx).Result()
    if err != nil {
        panic(err)
    }

示例:设置键值对

err := client.Set(ctx, "myKey", "myValue", 0).Err()
if err != nil {
    panic(err)
}

示例:获取值

value, err := client.Get(ctx, "myKey").Result()
if err != nil {
    panic(err)
}
fmt.Println("Value:", value)

当然,除了基本的连接和数据操作,go-redis 库还提供了许多高级用法,用于处理更复杂的场景。

  1. 连接池配置

    go-redis 默认会创建一个连接池,你也可以自定义连接池的大小和其他参数,以便更好地管理连接资源。

    client := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "",
        DB:       0,
        PoolSize: 10, // 设置连接池大小
    })
    
  2. 使用 Pipelining 进行批量操作

    Pipelining 允许你将多个命令打包发送到 Redis 服务器,减少网络往返的开销,提高性能。

 pipeline := client.Pipeline()
 pipeline.Set(ctx, "key1", "value1", 0)
 pipeline.Set(ctx, "key2", "value2", 0)
 _, err := pipeline.Exec(ctx)
 if err != nil {
     panic(err)
 }
  1. 使用事务进行原子操作

go-redis 支持 Redis 事务,你可以将一系列操作包装在一个事务中,确保它们以原子方式执行。

```
tx := client.TxPipeline()
incr := tx.Incr(ctx, "counter")
tx.Expire(ctx, "counter", time.Hour)
_, err := tx.Exec(ctx)
if err != nil {
    panic(err)
}
```

4. 使用 Pub/Sub 进行消息发布和订阅

Redis 支持发布和订阅模式,你可以使用 go-redis 进行消息发布和订阅操作。

 pubSub := client.Subscribe(ctx, "channel")
 _, err := pubSub.Receive(ctx)
 if err != nil {
     panic(err)
 }

 // 订阅消息
 channel := pubSub.Channel()
 for msg := range channel {
     fmt.Println("Received message:", msg.Payload)
 }
  1. 使用 Lua 脚本执行原子操作

可以使用 go-redis 执行 Lua 脚本,这对于实现复杂的原子操作非常有用。