解决问题:redisサービス端が切れた时`プロセスが崩壊する(6兄笔记)

10744 ワード

 1 package main
 2 
 3 import (
 4     "fmt"
 5     "github.com/astaxie/beego/logs"
 6     "github.com/garyburd/redigo/redis"
 7     "ha666/initial"
 8     _ "ha666/initial"
 9     "strconv"
10     "time"
11 )
12 
13 func main() {
14     defer func() {
15         if err := recover(); err != nil {
16             logs.Error("【main】ex:%v", err)
17             time.Sleep(time.Second)
18         }
19     }()
20     logs.Info("  ")
21     rc := initial.RedisClient.Get()
22     defer rc.Close()
23     for {
24         bytesresult, err := redis.ByteSlices(rc.Do("TIME"))
25         if err != nil {
26             fmt.Println(err.Error())
27             return
28         }
29         for _, v := range bytesresult {
30             _, err = strconv.ParseInt(string(v), 10, 64)
31             if err != nil {
32                 fmt.Println(err.Error())
33                 return
34             }
35             //fmt.Println(il)
36         }
37         time.Sleep(10 * time.Millisecond)
38     }
39 }

2つのエラーが発生しました.
1、defer使用エラー
2、redisクライアントがpoolから取り出した後、エラーを判断する
修正されたコードは次のとおりです.
 1 package main
 2 
 3 import (
 4     "fmt"
 5     "github.com/astaxie/beego/logs"
 6     "github.com/garyburd/redigo/redis"
 7     "github.com/pkg/errors"
 8     "ha666/initial"
 9     _ "ha666/initial"
10     "strconv"
11     "time"
12 )
13 
14 func main() {
15     for {
16         bytesresult, err := get_redis()
17         if err != nil {
18             fmt.Println(err.Error())
19             continue
20         }
21         for _, v := range bytesresult {
22             il, err := strconv.ParseInt(string(v), 10, 64)
23             if err != nil {
24                 fmt.Println(err.Error())
25                 continue
26             }
27             fmt.Println(il)
28         }
29         time.Sleep(1000 * time.Millisecond)
30     }
31 }
32 
33 func get_redis() ([][]byte, error) {
34     rc := initial.RedisClient.Get()
35     if rc.Err() != nil {
36         return nil, rc.Err()
37     }
38     defer rc.Close()
39     bytesresult, err := redis.ByteSlices(rc.Do("TIME"))
40     return bytesresult, err
41 }