json mag'lubiyatidan kalit olish uchun/lib ni samarali tarzda ishga tushirish va geoip qilish uchun ushbu tugmani foydalaning, so'ng json

nom kabi, golobni geoip qilish uchun ishlatish istayman, msg quyidagi kabi json formati

{"tip": "big_platform", "xrealip": "8.8.8.8", "sxema": "http", "log_time": "24/Fevral/2017: 15: 36: 10 +0800" "http_method": "GET", "hostname": "XXX.com", "url": "/ v126330.apk", "http_code": "206", "send_byte": 20972063, "user_agent": "63 "KO'RSII-K8; 6.0; 480x854; WIFI; 1118.24)", "@ timestamp": "2017-02-24T15: 36: 10 + 08: 00", "process_time": 59463, "cache_status": "TCP_HIT" , "murojaat qilish": "-"}

Ushbu xabarni tahlil qilish va xrealist olish uchun Go ni ishlatishni xohlayman, geoeff.then bu msgga geoip ma'lumotlarini ilova qilish uchun xrealip dan foydalaning.

Endi men uni portlatdim

//parse json string ,add geoip info and return new msg
func geoInfoAdd(msg string) ([]byte, error) {
        data := make(map[string]interface{})
        err := json.Unmarshal([]byte(msg), &data)
        if err != nil {
                return nil, err
        }
        //type assert value
        var ok bool
        if ipValue, ok = data[ipKey].(string); !ok {
               //ask_price is not a string
                return nil, errors.New("ipvalue not string")
        }

        //get ip location
        loc, err := ip17mon.Find(ipValue)
        if err != nil {
                return nil, err
        }
        iplocation := map[string]string{"country": loc.Country, "region": loc.Region, "isp": loc.Isp}

        //newdata := data
        data["iplocation"] = iplocation
        newmsg, err := json.Marshal(data)
        if err != nil {
                return nil, err
        }

        return newmsg, nil
}

Lekin, bu juda sekin, juda ko'p CPU qimmatga tushsa, men buni 70000/soniya kabi bajarishim kerak. va, albatta, buning uchun yaxshiroq yo'l kerak.

rahmat

0
json.marshal/unmarshal uchun, mening testimga nisbatan ikki barobar tez xaritani o'rniga [string] interfeysi orqali struct foydalaning.
qo'shib qo'ydi muallif zzn, manba
json.marshal/unmarshal uchun, mening testimga nisbatan ikki barobar tez xaritani o'rniga [string] interfeysi orqali struct foydalaning.
qo'shib qo'ydi muallif zzn, manba

6 javoblar

Agar, albatta, bu jsondan faqatgina xayvonga muhtoj bo'lsangiz, kerakli ishni qo'lingiz bilan qiling. Bu, ehtimol ancha tezroq (siz test sinovidan o'tishingiz kerak), chunki Odamzodning tarmoqdagi vaqtidan pastroq vaqt bu jsonni ajratib olishdan ko'ra ko'proq ahamiyatga ega bo'lishi mumkin:

// Find the key
key := `xrealip":"`
i := strings.Index(data,key) + len(key)
if i == -1 {
  return errors.New("no ip")
}

// Extract ip up to max ip len (IPV4)
ip := data[i:i+15]

// Cut to just ip 
q := strings.Index(ip,`"`)
if q > -1 {
  ip = ip[:q]
}

Sizning funktsiyalaringiz, ehtimol, baytlar bilan emas, balki strings bilan ishlaydigan bo'lishi kerak va "siz yuqoridagi funktsiyangizga asoslanadi."

Boshqa json paketlari ( https://github.com/pquerna/ffjson ) mavjud, lekin asosiy muammo bitta tugmani xohlaganingizda, bu ma'lumotlarni qayta ishlash.

1
qo'shib qo'ydi

Agar, albatta, bu jsondan faqatgina xayvonga muhtoj bo'lsangiz, kerakli ishni qo'lingiz bilan qiling. Bu, ehtimol ancha tezroq (siz test sinovidan o'tishingiz kerak), chunki Odamzodning tarmoqdagi vaqtidan pastroq vaqt bu jsonni ajratib olishdan ko'ra ko'proq ahamiyatga ega bo'lishi mumkin:

// Find the key
key := `xrealip":"`
i := strings.Index(data,key) + len(key)
if i == -1 {
  return errors.New("no ip")
}

// Extract ip up to max ip len (IPV4)
ip := data[i:i+15]

// Cut to just ip 
q := strings.Index(ip,`"`)
if q > -1 {
  ip = ip[:q]
}

Sizning funktsiyalaringiz, ehtimol, baytlar bilan emas, balki strings bilan ishlaydigan bo'lishi kerak va "siz yuqoridagi funktsiyangizga asoslanadi."

Boshqa json paketlari ( https://github.com/pquerna/ffjson ) mavjud, lekin asosiy muammo bitta tugmani xohlaganingizda, bu ma'lumotlarni qayta ishlash.

1
qo'shib qo'ydi

Agar, albatta, bu jsondan faqatgina xayvonga muhtoj bo'lsangiz, kerakli ishni qo'lingiz bilan qiling. Bu, ehtimol ancha tezroq (siz test sinovidan o'tishingiz kerak), chunki Odamzodning tarmoqdagi vaqtidan pastroq vaqt bu jsonni ajratib olishdan ko'ra ko'proq ahamiyatga ega bo'lishi mumkin:

// Find the key
key := `xrealip":"`
i := strings.Index(data,key) + len(key)
if i == -1 {
  return errors.New("no ip")
}

// Extract ip up to max ip len (IPV4)
ip := data[i:i+15]

// Cut to just ip 
q := strings.Index(ip,`"`)
if q > -1 {
  ip = ip[:q]
}

Sizning funktsiyalaringiz, ehtimol, baytlar bilan emas, balki strings bilan ishlaydigan bo'lishi kerak va "siz yuqoridagi funktsiyangizga asoslanadi."

Boshqa json paketlari ( https://github.com/pquerna/ffjson ) mavjud, lekin asosiy muammo bitta tugmani xohlaganingizda, bu ma'lumotlarni qayta ishlash.

1
qo'shib qo'ydi

Muammolarni ko'rsatish uchun json seriyallashuvini o'lchadingizmi? Shu bilan bir qatorda bo'lishi mumkin;

  • write a straight string parser
  • use custom struct with json:"arg_name"

Biroq sizning ko'pchiligingiz bu erda bo'lish vaqtini kutmoqdaman;

loc, err := ip17mon.Find(ipValue)

GO foydalanayotganingiz sababli, goroutines va kanallar men uchun ishlab chiqarish ko'rsatkichini yaxshilash uchun aniq birinchi qadam bo'ladi.

  1. ipChannel
  2. ga qayta ishlash uchun har bir yangi ipni suring
  3. qidirish orqali "ipchannel" dan qidirish va jarayonni natija bilan o'qish
  4. xatolikka olib keladigan narsalar uchun xato kanalini ishlatish

kerak bo'lganda juda ko'p "qidirish" kanallari bor.

0
qo'shib qo'ydi

Muammolarni ko'rsatish uchun json seriyallashuvini o'lchadingizmi? Shu bilan bir qatorda bo'lishi mumkin;

  • write a straight string parser
  • use custom struct with json:"arg_name"

Biroq sizning ko'pchiligingiz bu erda bo'lish vaqtini kutmoqdaman;

loc, err := ip17mon.Find(ipValue)

GO foydalanayotganingiz sababli, goroutines va kanallar men uchun ishlab chiqarish ko'rsatkichini yaxshilash uchun aniq birinchi qadam bo'ladi.

  1. ipChannel
  2. ga qayta ishlash uchun har bir yangi ipni suring
  3. qidirish orqali "ipchannel" dan qidirish va jarayonni natija bilan o'qish
  4. xatolikka olib keladigan narsalar uchun xato kanalini ishlatish

kerak bo'lganda juda ko'p "qidirish" kanallari bor.

0
qo'shib qo'ydi

Muammolarni ko'rsatish uchun json seriyallashuvini o'lchadingizmi? Shu bilan bir qatorda bo'lishi mumkin;

  • write a straight string parser
  • use custom struct with json:"arg_name"

Biroq sizning ko'pchiligingiz bu erda bo'lish vaqtini kutmoqdaman;

loc, err := ip17mon.Find(ipValue)

GO foydalanayotganingiz sababli, goroutines va kanallar men uchun ishlab chiqarish ko'rsatkichini yaxshilash uchun aniq birinchi qadam bo'ladi.

  1. ipChannel
  2. ga qayta ishlash uchun har bir yangi ipni suring
  3. qidirish orqali "ipchannel" dan qidirish va jarayonni natija bilan o'qish
  4. xatolikka olib keladigan narsalar uchun xato kanalini ishlatish

kerak bo'lganda juda ko'p "qidirish" kanallari bor.

0
qo'shib qo'ydi
Javascript UZB
Javascript UZB
99 ishtirokchilar

@js_uzb @vuejs_uz @react_uz @nodejs_uz @angular_uz @ngTashkent @yiiframework_uz @laravel_uz @linux_uzbek @python_uz @swift_uzb —————— @uzdevgroup @UzGeeksGroup ——— @UzDev_Jobs @jobs_uzb