资料来源

Redis命令参考
ReJSON - a JSON data type for Redis
ReJSON 教程(Redis支持JSON)

思考

ReJSON 是一个使用redis 很棒的工具啦。个人比较喜欢这个,可以解决很多问题。下面我们就开始探讨

为什么我们喜欢这个ReJSON尼

解决场景

  1. 平台或项目中,会出现类似的数据:配置信息,用户基础信息,很多经常不变的数据存储在数据库中,但是我们的项目又需要对这些数据不断的查询和验证。我们为了减少数据库的查询可以使用rejson,将数据库中的这些基础信息放入redis中。做验证等操作的时候,直接可以进行数据的验证
  2. 解决数据库的压力,部分信息存储。有了rejosn能很好的避免redis,不方便操作例如对象的解析。更新后在处理都是非常麻烦的。

对rejson支持的第三方包
https://github.com/search?l=J...
我使用的go语言,对rejson支持包
https://github.com/nitishm/go...

学习记录

  1. 启动redis

redis-server

//Redis 默认端口是6379,你也可以换个端口号启动,
redis-server --port 6380

//Redis会使用配置文件启动;url为配置文件路径
redis-server url

例如,我mac电脑redis配置路径
redis-server /usr/local/etc/redis.conf

图片描述

2.停止redis服务
redis-cli shutdown

3.我的电脑已经装了ReJSON所以我自己就可以直接操作rejson的命令

package main

import (
    "encoding/json"
    "flag"
    "fmt"
    "log"

    // "github.com/garyburd/redigo/redis"
    "github.com/gomodule/redigo/redis"
    rejson "github.com/nitishm/go-rejson"
)

var addr = flag.String("Server", "localhost:6379", "Redis server address")

type Name struct {
    First  string `json:"first,omitempty"`
    Middle string `json:"middle,omitempty"`
    Last   string `json:"last,omitempty"`
}

type Student struct {
    Name Name `json:"name,omitempty"`
    Rank int  `json:"rank,omitempty"`
}

func main() {
    testMain()
}

type StudentInfo struct {
    Info *StudentDetails `json:”info,omitempty”`
    Rank int             `json:”rank,omitempty”`
}
type StudentDetails struct {
    FirstName string
    LastName  string
    Major     string
}

func testMain() {
    flag.Parse()

    conn, err := redis.Dial("tcp", *addr)
    if err != nil {
        log.Fatalf("Failed to connect to redis-server @ %s", *addr)
    }
    defer func() {
        // conn.Do("FLUSHALL")
        conn.Close()
    }()

    studentJD := StudentInfo{
        Info: &StudentDetails{
            FirstName: "John",
            LastName:  "Doe",
            Major:     "CSE",
        },
        Rank: 1,
    }
    b, err := json.Marshal(&studentJD)
    if err != nil {
        return
    }
    // _, err = conn.Do(“SET”, “JohnDoe”, string(b))
    // if err != nil {
    //     return
    // }

    fmt.Println(string(b))

    _, err = rejson.JSONSet(conn, "JohnDoeJSON", ".", studentJD, false, false)
    if err != nil {
        return
    }

    outJSON, err := rejson.JSONGet(conn, "JohnDoeJSON", "")
    if err != nil {
        return
    }
    outStudent := &StudentInfo{}
    err = json.Unmarshal(outJSON.([]byte), outStudent)
    if err != nil {
        return
    }
    v, _ := json.Marshal(outStudent)
    fmt.Println(string(v))
    fmt.Println(fmt.Sprintf("Rank:%d", outStudent.Rank))
    fmt.Println(fmt.Sprintf("Info:%s", outStudent.Info))
    fmt.Println(fmt.Sprintf("Info.FirstName:%s", outStudent.Info.FirstName))
    fmt.Println(fmt.Sprintf("Info.LastName:%s", outStudent.Info.LastName))
    fmt.Println(fmt.Sprintf("Info.Major:%s", outStudent.Info.Major))

    //======= test json.set =====
    log.Println(" ====== test json.set =========")
    _, err = rejson.JSONSet(conn, "JohnDoeJSON", ".Info.Major", "EE", false, false)
    if err != nil {
        return
    }
    outJSON, err = rejson.JSONGet(conn, "JohnDoeJSON", "")
    if err != nil {
        return
    }
    outStudent = &StudentInfo{}
    err = json.Unmarshal(outJSON.([]byte), outStudent)
    if err != nil {
        return
    }
    v, _ = json.Marshal(outStudent)
    fmt.Println(string(v))
    fmt.Println(fmt.Sprintf("Rank:%d", outStudent.Rank))
    fmt.Println(fmt.Sprintf("Info:%s", outStudent.Info))
    fmt.Println(fmt.Sprintf("Info.FirstName:%s", outStudent.Info.FirstName))
    fmt.Println(fmt.Sprintf("Info.LastName:%s", outStudent.Info.LastName))
    fmt.Println(fmt.Sprintf("Info.Major:%s", outStudent.Info.Major))

}

结果输出:
图片描述


antyiwei
66 声望4 粉丝

世上无难事, 只怕有心人。