Redis 的优点
- 使用数据结构来表示不同类型的数据,如字符串、列表、集合、散列等,选择合适的数据结构可以提高效率。
- 使用 Redis 事务来执行多个相关命令,确保事务的原子性。
- 使用 Redis 管道技术,可以降低网络开销,合并多次请求提高效率。
- 采用懒删除策略来优化删除性能,避免直接删除大键导致阻塞。
- 散列结构 (hash) 非常适合对象存储,可以直接对应对象属性,避免多键查询。
- 使用发布订阅模型进行消息队列,可以实现解耦和异步处理。
- 设置不同业务或数据类型的数据库区 (0-15), 可以独立扩容。
- 数据持久化策略需要评估 RDB 快照和 AOF 日志的代价。
- 启用主从复制来提高可用性,并且进行读写分离。
- 定期使用内存回收和信号量策略来主动释放内存。
- 监控 Redis 并启用内存过期策略来防止内存不足。
- 使用连接池提高连接效率并控制连接数。
我体验下来用 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 库还提供了许多高级用法,用于处理更复杂的场景。
-
连接池配置:
go-redis默认会创建一个连接池,你也可以自定义连接池的大小和其他参数,以便更好地管理连接资源。client := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", DB: 0, PoolSize: 10, // 设置连接池大小 }) -
使用 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)
}
- 使用事务进行原子操作:
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)
}
- 使用 Lua 脚本执行原子操作:
可以使用 go-redis 执行 Lua 脚本,这对于实现复杂的原子操作非常有用。