当前位置: 首页 > news >正文

张家界做网站的人搜索引擎优化与推广技术

张家界做网站的人,搜索引擎优化与推广技术,java网站开发就业怎么样,分析杭州高端网站建设开发的区别1. 前言 之前在设计一个兼容函数的时候,使用了sjson动态设入参数,从而实现一些参数的兼容。大致的逻辑如下所示: // 有一堆不规则的json数据 {"a":"aaa","b":"bbb","any_key1":{"k…

1. 前言

之前在设计一个兼容函数的时候,使用了sjson动态设入参数,从而实现一些参数的兼容。大致的逻辑如下所示:

// 有一堆不规则的json数据
{"a":"aaa","b":"bbb","any_key1":{"key":"value"},"any_key2":{"key":"value"}
}
// 因为any_key1和any_key2这样的数字字符串的key还会有新增,所以这个是无法固定的,没有办法给到一个具体的结构体解析,于是就人为的兼容,给它们在处理的时候包一个外层的key
{"a":"aaa","b":"bbb","number_key_data":{"any_key1":{"key":"value"},"any_key2":{"key":"value"}}
}
// 这样处理之后,我只要定义number_key_data,我就可以获取到具体的字符串数字为key的数据

2. 实现

采用sjson对对应的非特定key进行新的结构值设入,然后做一个兼容即可实现上面的逻辑,于是有这段代码出来了。

package gjson_set_studyimport ("encoding/json""fmt""github.com/tidwall/sjson""testing"
)func TestGjsonSet(t *testing.T) {data := `{"a":"aaa","b":"bbb","any_key1":{"key":"value"},"any_key2":{"key":"value"}}`dataMap := map[string]interface{}{}err := json.Unmarshal([]byte(data), &dataMap)if err != nil {panic(err)}fmt.Println(adaptNumberKey(data, dataMap))// output// {"a":"aaa","b":"bbb","number_key_data":{"any_key1":{"key":"value"},"any_key2":{"key":"value"}}} <nil>
}type Data struct {A             string `json:"a"`B             string `json:"b"`NumberKeyData map[string]struct {Key   string `json:"key"`Value string `json:"value"`} `json:"number_key_data"`
}var specificKeys = map[string]bool{"a": true,"b": true,
}func adaptNumberKey(data string, dataMap map[string]interface{}) (string, error) {var err errorfor k, v := range dataMap {if _, ok := specificKeys[k]; ok {continue}data, err = sjson.Delete(data, k) // remove firstif err != nil {return "", fmt.Errorf("delete key data error, key=%s, err=%w", k, err)}data, err = sjson.Set(data, "number_key_data."+k, v)if err != nil {// log...return "", fmt.Errorf("set number_key_data error, key=%s, err=%w", k, err)}}return data, nil
}

上面的实现,不出意外的话是不会有任何的问题,但是不出意外的意外出现了,当类似的逻辑代码上线之后,我们发现一个问题:容器会爆内存。这代码也实现了自测,也过了QA的测试,为什么会突然爆内存呢?

3. 问题

容器爆内存的问题出现了,但并不是所有的数据都爆内存,有一组数据100%会爆内存,它们的数据类似:

{"a":"aaa","b":"bbb","1000000":{"key":"value"},"50000000":{"key":"value"}}

比较明显的是出现了数字字符串的key,然后结合代码看了一下,刚开始也没看出啥异常,觉得这个修改后的数据应该是:

{"a":"aaa","b":"bbb","number_key_data":{"1000000":{"key":"value"},"50000000":{"key":"value"}}}

但后面发现爆内存的问题,又想起了设置数组的方式,当前的代码逻辑如果遇到数字key,就会被认为是在设置数组,开辟几百万甚至上千万长度的数组?(细思极恐) 于是就发现了爆内存的问题所在:数字key在未经特殊标识的情况下,会被认定为数组,于是这个设置key的过程,就变成了对一个key的长为1000000的数组设置值(后者是50000000),可怕

4. 解决方法

于是参看源码,照着sjson的set方法一路向下看,可以发现如果在parsePath 中我们对路径添加了: 的前缀,sjson会强制把这个key当做string key,而在atoui中不会将其解析为一个具体的数字,进而导致对字符串key的设置,变成对数组的设值。

func parsePath(path string) (res pathResult, simple bool) {var r pathResultif len(path) > 0 && path[0] == ':' { // 如果含有:符号,这个key会被强制认定为keyr.force = truepath = path[1:]}for i := 0; i < len(path); i++ { // 对path进行分解if path[i] == '.' {r.part = path[:i]r.gpart = path[:i]r.path = path[i+1:]r.more = truereturn r, true}if !isSimpleChar(path[i]) {return r, false}if path[i] == '\\' {// go into escape mode. this is a slower path that// strips off the escape character from the part.// ...}return r, true
}// atoui does a rip conversion of string -> unigned int.
func atoui(r pathResult) (n int, ok bool) {if r.force {return 0, false}for i := 0; i < len(r.part); i++ {if r.part[i] < '0' || r.part[i] > '9' {return 0, false}n = n*10 + int(r.part[i]-'0')}return n, true
}

于是修改代码逻辑,将所有key的前缀都加上:的标识。

func adaptNumberKey(data string, dataMap map[string]interface{}) (string, error) {var err errorfor k, v := range dataMap {if _, ok := specificKeys[k]; ok {continue}data, err = sjson.Delete(data, k) // remove firstif err != nil {return "", fmt.Errorf("delete key data error, key=%s, err=%w", k, err)}data, err = sjson.Set(data, "number_key_data."+":"+k, v)if err != nil {// log...return "", fmt.Errorf("set number_key_data error, key=%s, err=%w", k, err)}}return data, nil
}
// Output: {"a":"aaa","b":"bbb","number_key_data":{"1000000":{"key":"value"},"50000000":{"key":"value"}}} <nil>

5. 小结

忽然想到遇到的这个小问题,当时就觉得还是自己单测的场景不够全面,导致了这次爆内存的问题发生,还好有临时解决方案,不然对线上服务造成的影响还真不小。通过这个事例,再一次告诫自己在后续的代码编写中,对于通用功能的逻辑代码,要尽可能的思考一些边缘case,从而避免在上线后边缘case导致代码崩溃的现象出现。

http://www.hkea.cn/news/426249/

相关文章:

  • 类似红盟的网站怎么做aso优化推广
  • vs2013做网站怎样制作免费网页
  • b2c网站的开发无锡网络优化推广公司
  • 网站做视频在线观看营销活动推广方案
  • wordpress多站点统计google图片搜索引擎入口
  • 麻章手机网站建设百度网盘提取码入口
  • 网站后台管理系统的重要技术指标sem竞价托管费用
  • 包头怎样做网站我想做电商怎么加入
  • 株洲企业网站建设品牌2023免费b站推广大全
  • 仿制单页面网站多少钱免费制作网站app
  • 商城网站制作网站长尾词挖掘工具
  • 夹克定制公司trinseo公司
  • 四川智能网站建设制作网站链接分析工具
  • 制作销售网站有哪些宁波网络营销推广咨询报价
  • 佛山做外贸网站服务新闻发稿平台
  • 做网站前怎么写文档域名收录
  • 中信建设有限责任公司钟宁关键词优化的方法有哪些
  • 建站之星平台优化推广网站排名
  • wordpress 网盘 插件郑州seo外包阿亮
  • 怎样建设网站首页广告营销平台
  • wordpress调起淘宝app什么叫做seo
  • 嘉兴做网站优化的公司网站维护公司
  • css层叠样式会不会影响打开网站的速度百度免费下载安装百度
  • 网站模板制作流程nba交易最新消息汇总
  • 近的网站在线客服系统网络优化工程师前景如何
  • 网站制作职业google入口
  • 广州网站 制作信科便宜网络营销软文范例500
  • 网站建设公开课长沙网站推广和优化
  • 建设网站的需求分析俄罗斯搜索引擎yandex推广入口
  • 可以做英文纵横字谜的网站搜狗网站收录入口