## 操作Redis 本文将探讨Redis作为非关系数据存储的一种形式,并展示Go等语言如何与这些服务进行交互。 由于Redis通过简单的接口支持键值存储,因此它是会话存储或具有持续时间的临时数据的理想选择。为Redis中存储的数据指定超时的能力非常有价值。本节将探讨从配置,查询到使用自定义排序的基本Redis用法。 ### 实践 1. 获取第三方库: ``` go get gopkg.in/redis.v5 ``` 2. 建立 config.go: ``` package redis import ( "os" redis "gopkg.in/redis.v5" ) // Setup 初始化 redis 连接 func Setup() (*redis.Client, error) { client := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: os.Getenv("REDISPASSWORD"), DB: 0, // 使用默认 DB }) // 命令返回“PONG”,测试连接是否存活 _, err := client.Ping().Result() return client, err } ``` 3. 建立 exec.go: ``` package redis import ( "fmt" "time" redis "gopkg.in/redis.v5" ) // Exec 执行一些redis操作 func Exec() error { conn, err := Setup() if err != nil { return err } c1 := "value" // 我们可以把任何想要的类型存入key所对应的值 // 当前存入的是key到期的时间 conn.Set("key", c1, 5*time.Second) var result string if err := conn.Get("key").Scan(&result); err != nil { switch err { // 这意味着key找不到对应的值 case redis.Nil: return nil default: return err } } fmt.Println("result =", result) return nil } ``` 4. 建立 sort.go: ``` package redis import ( "fmt" redis "gopkg.in/redis.v5" ) // Sort 执行排序redis操作 func Sort() error { conn, err := Setup() if err != nil { return err } if err := conn.LPush("list", 1).Err(); err != nil { return err } if err := conn.LPush("list", 3).Err(); err != nil { return err } if err := conn.LPush("list", 2).Err(); err != nil { return err } res, err := conn.Sort("list", redis.Sort{Order: "ASC"}).Result() if err != nil { return err } fmt.Println(res) conn.Del("list") return nil } ``` 5. 建立 main.go: ``` package main import "github.com/agtorre/go-cookbook/chapter5/redis" func main() { if err := redis.Exec(); err != nil { panic(err) } if err := redis.Sort(); err != nil { panic(err) } } ``` 6. 这会输出: ``` result = value [1 2 3] ``` ### 说明 可以看到Redis的操作与MySQL很相似,Scan()等函数都遵循相同的约定从Redis读取数据映射Go类型。选择合适的第三方库可能具有挑战性,我建议定期调查可用的内容。 本节使用redis包进行基本设置和查询,执行更复杂的排序功能。与database/sql一样,你可以通过控制超时,设置连接池大小等形式设置其他配置。Redis本身还提供了许多其他功能,包括Redis群集支持,Zscore和计数器对象,分布式锁定等。 与前面的章节一样,我建议使用配置对象,它存储Redis设置和配置详细信息,以便于设置操作和提高安全性。 * * * * 学识浅薄,错误在所难免。欢迎在群中就本书提出修改意见,以飨后来者,长风拜谢。 Golang中国(211938256) beego实战(258969317) Go实践(386056972)