Go游戏服务器开发的一些思考(二十七):Go Redis ORM库(二)

2018-01-03 20:06:56来源:CSDN作者:u013272009人点击

分享

Redigo

Redigo本质上也是一个Redis ORM库。

大部分人可能仅简单的使用了下它的pool、do等接口。

如果你认真阅读Redigo官方的帮助文档,你会发现不少意想不到的惊喜。

Redigo官方例子(1)

c, err := dial()if err != nil {    fmt.Println(err)    return}defer c.Close()var p1, p2 struct {    Title  string `redis:"title"`    Author string `redis:"author"`    Body   string `redis:"body"`}p1.Title = "Example"p1.Author = "Gary"p1.Body = "Hello"if _, err := c.Do("HMSET", redis.Args{}.Add("id1").AddFlat(&p1)...); err != nil {    fmt.Println(err)    return}m := map[string]string{    "title":  "Example2",    "author": "Steve",    "body":   "Map",}if _, err := c.Do("HMSET", redis.Args{}.Add("id2").AddFlat(m)...); err != nil {    fmt.Println(err)    return}for _, id := range []string{"id1", "id2"} {    v, err := redis.Values(c.Do("HGETALL", id))    if err != nil {        fmt.Println(err)        return    }    if err := redis.ScanStruct(v, &p2); err != nil {        fmt.Println(err)        return    }    fmt.Printf("%+v/n", p2)}
  1. 直接存 struct、map;直接获取struct。意外不,这不就是典型的ORM嘛

  2. 注意这里的数据id1、id2,显然这个例子同时展示了如何读取1对N的数据

为什么第2点说,同时展示了如何读取1对N的数据呢,这里放到最后做说明。先买个关子。

Redigo官方例子(2)

c, err := dial()if err != nil {    fmt.Println(err)    return}defer c.Close()c.Send("HMSET", "album:1", "title", "Red", "rating", 5)c.Send("HMSET", "album:2", "title", "Earthbound", "rating", 1)c.Send("HMSET", "album:3", "title", "Beat", "rating", 4)c.Send("LPUSH", "albums", "1")c.Send("LPUSH", "albums", "2")c.Send("LPUSH", "albums", "3")values, err := redis.Values(c.Do("SORT", "albums",    "BY", "album:*->rating",    "GET", "album:*->title",    "GET", "album:*->rating"))if err != nil {    fmt.Println(err)    return}var albums []struct {    Title  string    Rating int}if err := redis.ScanSlice(values, &albums); err != nil {    fmt.Println(err)    return}fmt.Printf("%v/n", albums)

1对N的数据读取的例子。

有人会问,数据量大,删除时岂不会对albums做遍历删除。没错。

所以说这仅一个例子,合适的情景就可以用之,如条数本来就限制在一定的数量内的。

Redigo 1对N数据读取的正确打开方式

请仔细看例子1,

假如我的结构体为:

struct {    subid1: value1,    subid2: value2,    ...    subidN: valueN,}

那么一个id 对应这样的结构体,不就是1对N的数据读取吗。

如何实现呢,涉及API:

c.Do("HSET", redis.Args{}.Add(key).Add(field).Add(value)...)c.Do("HGET", redis.Args{}.Add(key).Add(field)...)c.Do("HDEL", redis.Args{}.Add(key).Add(field)...)c.Do("HGETALL", redis.Args{}.Add(key)...)c.Do("HKEYS", redis.Args{}.Add(key)...)c.Do("HEXISTS", redis.Args{}.Add(key).Add(field)...)c.Do("HLEN", redis.Args{}.Add(key)...)c.Do("HMGET", redis.Args{}.Add(key).AddFlat(fields)...)

等等,细节略,自己发散下

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台