我从Redis给我的应用程序提供了一个json,然后我解组并循环通过。
下面是我从Redis获取的json的样子:
[
{
"titel": "test 1",
"event": "some value",
"pair": "some value",
"condition": [
"or",
[
"contains",
"url",
"/"
],[
"notcontains",
"url",
"hello"
]
],
"actions": [
[
"option1",
"12",
"1"
],
[
"option2",
"3",
"1"
]
]
}, {
"titel": "test 2",
"event": "some value",
"pair": "some value",
"condition": [
"or",
[
"contains",
"url",
"/"
]
],
"actions": [
[
"option1",
"12",
"1"
],
[
"option2",
"3",
"1"
]
]
}
]
我用来存储json的结构如下所示:
type Trigger struct {
Event string `json:"event"`
Pair string `json:"pair"`
Actions [][]string `json:"actions"`
Condition Condition `json:"condition"`
}
type Condition []interface{}
func (c *Condition) Typ() string {
return (*c)[0].(string)
}
func (c *Condition) Val() []string {
xs := (*c)[1].([]interface{})
ys := make([]string, len(xs))
for i, x := range xs {
ys[i] = x.(string)
}
return ys
}
func (c *Condition) String() (string, string, string) {
return c.Val()[0], c.Val()[1], c.Val()[2]
}
type Triggers struct {
Collection []Trigger
}
我将它解组到结构体中,如下所示:
var triggers Triggers
err := json.Unmarshal([]byte(triggersJson), &triggers.Collection)
if err != nil {
fmt.Println("Error while unmarshaling triggers json: ", err)
}
这在使用攻城战测试时工作和执行得非常好。但是,只要我想在结构体上开始循环,我就开始看到长的响应时间和超时。
下面是我的循环方式:
for _,element := range triggers.Collection {
if element.Event == "some value" {
fmt.Println("We got: some value")
}
}
在500个并发连接上,没有循环的性能是2ms,而有了循环,在500个并发连接上的性能是600ihs ms,并且有很多超时
理想情况下,我希望更改json的结构,使其不包括:
"or",
但是我不能控制json,所以不幸的是这是不可能的。
有什么想法是什么原因造成的,以及如何解决?
- 编辑**
我找到了让整件事慢下来的东西。
编辑我的结构体,例如:
type Trigger struct {
Event string `json:"event"`
Pair string `json:"pair"`
Actions [][]string `json:"actions"`
//Condition Condition `json:"condition"`
}
把它从600毫秒到100毫秒。但是现在我无法解析Condition
。
现在确定如何以另一种方式解析条件,而不是我目前所做的,因为它有两种不同的格式
1条答案
按热度按时间fykwrbwg1#
听起来很奇怪,但要尽量避免复制Collection元素。