资料来源
Redis命令参考
ReJSON - a JSON data type for Redis
ReJSON 教程(Redis支持JSON)
思考
ReJSON 是一个使用redis 很棒的工具啦。个人比较喜欢这个,可以解决很多问题。下面我们就开始探讨
为什么我们喜欢这个ReJSON尼
解决场景
- 平台或项目中,会出现类似的数据:配置信息,用户基础信息,很多经常不变的数据存储在数据库中,但是我们的项目又需要对这些数据不断的查询和验证。我们为了减少数据库的查询可以使用rejson,将数据库中的这些基础信息放入redis中。
做验证等操作的时候,直接可以进行数据的验证
。 - 解决数据库的压力,部分信息存储。有了rejosn能很好的避免redis,不方便操作例如对象的解析。更新后在处理都是非常麻烦的。
对rejson支持的第三方包
https://github.com/search?l=J...
我使用的go语言,对rejson支持包
https://github.com/nitishm/go...
学习记录
- 启动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))
}
结果输出: