рдореБрдЭреЗ Go + redigo рд╕рдордХрдХреНрд╖ . рдирд╣реАрдВ рдорд┐рд▓рд╛
HMSET myhash field1 "Hello" field2 "World"
рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ("рдПрдЪрдПрдордПрд╕рд╕реЗрдЯ' рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рддрд░реНрдХреЛрдВ рдХреА рдЧрд▓рдд рд╕рдВрдЦреНрдпрд╛ рддреНрд░реБрдЯрд┐")ред рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЬрд╛рдиреЗ рдФрд░ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛рд░реНрдп рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓ рд╣реИрд╢ рд╕рдорд░реНрдерди рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
Redigo HMSET рд╕рд╣рд┐рдд рдХрд┐рд╕реА рднреА рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдХреЛрдб рдХреА рд╡рд╣ рдкрдВрдХреНрддрд┐ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдк рдПрдЪрдПрдордПрд╕рдИрдЯреА рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ?
package main
import (
"fmt"
"github.com/garyburd/redigo/redis"
"log"
)
var (
conn redis.Conn
)
// Connect to Redis
func init() {
var err error
conn, err = redis.Dial("tcp", ":6379")
if err != nil {
log.Fatalf("Couldn't connect to Redis: %v\n", err)
}
}
func main() {
defer conn.Close()
stockData := map[string]map[string]string{
"GOOG": {"company_name":"Google Inc.", "open_price":"803.99", "ask_price":"795.50", "close_price":"802.66", "bid_price":"793.36"},
"MSFT": {"ask_price":"N/A", "open_price":"28.30", "company_name":"Microsoft Corpora", "bid_price":"28.50", "close_price":"28.37"},
}
conn.Send("HMSET", "stocks")
// conn.Send("HMSET")
// conn.Send("stocks")
// var cmd []interface{}
for sym, row := range stockData {
for colName, val := range row {
key := sym + ":" + colName
// cmd = append(cmd, key, val)
conn.Send(key, val)
}
}
// conn.Send("HMSET", cmd...)
reply, err := conn.Do("EXEC")
if err != nil {
log.Fatalf("Error setting hash: %v\n", err)
}
fmt.Printf("reply == %+v\n", reply)
}
рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЙрди рдЕрдиреНрдп рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рддреА рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ рднреА рдЖрдЬрд╝рдорд╛рдпрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ (рд▓рдЧрднрдЧ) рд╕рднреА рдХрдорд╛рдВрдб рдПрдХ рд╕рд╛рде conn.Send("HMSET", cmd...)
рд╕рд╛рде рднреЗрдЬрдирд╛ред conn.Send("HMSET", "stocks", cmd...)
рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдореИрдВ рдЧрд▓рдд рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ?
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддреАрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрд╢ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
package main
import (
"github.com/garyburd/redigo/redis"
"log"
)
func main() {
conn, err := redis.Dial("tcp", ":6379")
if err != nil {
log.Fatalf("Couldn't connect to Redis: %v\n", err)
}
defer conn.Close()
stockData := map[string]map[string]string{
"GOOG": {"company_name": "Google Inc.", "open_price": "803.99", "ask_price": "795.50", "close_price": "802.66", "bid_price": "793.36"},
"MSFT": {"ask_price": "N/A", "open_price": "28.30", "company_name": "Microsoft Corpora", "bid_price": "28.50", "close_price": "28.37"},
}
// Example 1: Write command arguments out explicitly.
for sym, row := range stockData {
if _, err := conn.Do("HMSET", sym,
"company_name", row["company_name"],
"open_price", row["open_price"],
"ask_price", row["ask_price"],
"bid_price", row["bid_price"]); err != nil {
log.Fatal(err)
}
}
printAndDel(conn, "example 1", stockData)
// Example 2: Construct command arguments using range over a row map.
for sym, row := range stockData {
args := []interface{}{sym}
for k, v := range row {
args = append(args, k, v)
}
if _, err := conn.Do("HMSET", args...); err != nil {
log.Fatal(err)
}
}
printAndDel(conn, "example 2", stockData)
// Example 3: Construct command arguments using Redigo helper function.
for sym, row := range stockData {
if _, err := conn.Do("HMSET", redis.Args{sym}.AddFlat(row)...); err != nil {
log.Fatal(err)
}
}
printAndDel(conn, "example 3", stockData)
}
func printAndDel(conn redis.Conn, message string, stockData map[string]map[string]string) {
log.Print(message)
for sym := range stockData {
values, err := redis.Values(conn.Do("HGETALL", sym))
if err != nil {
log.Fatal(err)
}
log.Print(sym)
for i := 0; i < len(values); i += 2 {
log.Printf(" %s: %s", values[i], values[i+1])
}
}
for sym := range stockData {
if _, err := conn.Do("DEL", sym); err != nil {
log.Fatal(err)
}
}
}
рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдмрдЬрд╛рдп рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдбреЗрдЯрд╛ рдХреЛ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рдорд╛рди рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред
package main
import (
"github.com/garyburd/redigo/redis"
"log"
)
type Stock struct {
CompanyName string `redis:"company_name"`
OpenPrice string `redis:"open_price"`
AskPrice string `redis:"ask_price"`
ClosePrice string `redis:"close_price"`
BidPrice string `redis:"bid_price"`
}
func main() {
conn, err := redis.Dial("tcp", ":6379")
if err != nil {
log.Fatalf("Couldn't connect to Redis: %v\n", err)
}
defer conn.Close()
stockData := map[string]*Stock{
"GOOG": &Stock{CompanyName: "Google Inc.", OpenPrice: "803.99", AskPrice: "795.50", ClosePrice: "802.66", BidPrice: "793.36"},
"MSFT": &Stock{AskPrice: "N/A", OpenPrice: "28.30", CompanyName: "Microsoft Corpora", BidPrice: "28.50", ClosePrice: "28.37"},
}
for sym, row := range stockData {
if _, err := conn.Do("HMSET", redis.Args{sym}.AddFlat(row)...); err != nil {
log.Fatal(err)
}
}
for sym := range stockData {
values, err := redis.Values(conn.Do("HGETALL", sym))
if err != nil {
log.Fatal(err)
}
var stock Stock
if err := redis.ScanStruct(values, &stock); err != nil {
log.Fatal(err)
}
log.Printf("%s: %+v", sym, &stock)
}
}
рдорд╣рд╛рди рдЙрджрд╛рд╣рд░рдг, рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВрдиреЗ рдХреБрдЫ рдФрд░ рдкрдврд╝рд╛ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░реЗрдбрд┐рд╕ рдиреЗрд╕реНрдЯреЗрдб рд╣реИрд╢ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЬреЛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛ рд╡рд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛: рдПрдХ рд░реЗрдбрд┐рд╕ рд╣реИрд╢ рдмрдирд╛рдирд╛ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреАрдХреЛрдВ рд╕реЗ рд╕реНрдЯреЙрдХ рдбреЗрдЯрд╛ рддрдХ рдПрдХ рдФрд░ рд╣реИрд╢ рд╣реЛрддрд╛ рд╣реИред рдореИрдВ рдХреБрдЫ JSON рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рд╢рд╛рдпрдж-рдЕрдЪреНрдЫреА-рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдХ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рдпрд╣реА рдЪрд╛рд╣рд┐рдПред
рдХрд┐рд╕реА рди рдХрд┐рд╕реА рддрд░рд╣, рдореИрдВ рдпрд╣ рдХрд╛рдо рдХрд░ рдкрд╛рдКрдВрдЧрд╛, рдЦрд╛рд╕рдХрд░ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рдеред рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдзрдиреНрдпрд╡рд╛рдж!
рдиреЗрд╕реНрдЯреЗрдб рд╣реИрд╢ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдлреНрд░реА рдФрд░ рд╢реЙрд░реНрдЯ рдж рд▓рд┐рдЯрд┐рд▓ рд░реЗрдбрд┐рд╕ рдмреБрдХ рд░реЗрдбрд┐рд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрд╡рд▓реЛрдХрди рджреЗрддрд╛ рд╣реИред
рдЬреЗрдПрд╕рдУрдПрди рдХреЛ рд░реЗрдбрд┐рд╕ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рдЖрдо рдмрд╛рдд рд╣реИред рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдЧреЛ рд╕реЗ рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдиреЗрд╕реНрдЯреЗрдб рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдиреНрдХреЛрдбрд┐рдВрдЧ/рдЧреЛрдм рдПрдХ рдФрд░ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдмрдЬрд╛рдп рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдбреЗрдЯрд╛ рдХреЛ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рдорд╛рди рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред