本文目錄一覽:
- 1、golang 過濾器怎麼返回json對象
- 2、【golang】海量數據去重-布隆過濾器
- 3、組件分享之後端組件——基於Golang實現的高性能和彈性的流處理器benthos
- 4、golang的iris框架的模版如何相互引用?
golang 過濾器怎麼返回json對象
innodb_data_home_dir = /longxibendi/mysql/mysql/var/
#innodb_data_file_path = ibdata1:1G:autoextend
innodb_data_file_path = ibdata1:500M;ibdata2:2210M:autoextend #表空間
innodb_file_io_threads = 4 #io線程數
【golang】海量數據去重-布隆過濾器
在做域名爆破中,遇到了把一個300G的子域名json文件進行去重,一開始是考慮使用字典進行去重,但是數據量大了,會造成內存泄露。看網上資料介紹了一種方案,就是使用布隆過濾器。
布隆過濾器是一種數據結構,概率型數據結構,特定是高效插入和查詢,可以用來告訴你「某一值一定不存在或者kennel存在」。
相比於傳統的map、set等數據結構,佔用空間更少,但其返回結果是概率型的,不確定。
布隆過濾器內部維護一個bitArray(位數組),開始所有數據為0,當一個元素過來時,能過多個哈希函數(hash1、hash2、hash3)計算不同的hash值,並通過hash值找到bitArray的下標,將裡面的值改為由0變為1。布隆過濾器有一個誤判率,誤判率越低,數組越長,所在空間越大,誤判率越高,數組越小,所佔空間越小。
這裡貼上一個技術大牛的博客地址,裡面對布隆過濾器用法以及在redis裡面處理緩存穿透問題的詳細介紹。
組件分享之後端組件——基於Golang實現的高性能和彈性的流處理器benthos
近期正在探索前端、後端、系統端各類常用組件與工具,對其一些常見的組件進行再次整理一下,形成標準化組件專題,後續該專題將包含各類語言中的一些常用組件。歡迎大家進行持續關注。
本節我們分享的是基於Golang實現的高性能和彈性的流處理器 benthos ,它能夠以各種代理模式連接各種 源 和 接收器,並對有效負載執行 水合、濃縮、轉換和過濾 。
它帶有 強大的映射語言 ,易於部署和監控,並且可以作為靜態二進位文件、docker 映像或 無伺服器函數 放入您的管道,使其成為雲原生。
Benthos 是完全聲明性的,流管道在單個配置文件中定義,允許您指定連接器和處理階段列表:
Apache Pulsar, AWS (DynamoDB, Kinesis, S3, SQS, SNS), Azure (Blob storage, Queue storage, Table storage), Cassandra, Elasticsearch, File, GCP (Pub/Sub, Cloud storage), HDFS, HTTP (server and client, including websockets), Kafka, Memcached, MQTT, Nanomsg, NATS, NATS JetStream, NATS Streaming, NSQ, AMQP 0.91 (RabbitMQ), AMQP 1, Redis (streams, list, pubsub, hashes), MongoDB, SQL (MySQL, PostgreSQL, Clickhouse, MSSQL), Stdin/Stdout, TCP UDP, sockets and ZMQ4.
1、docker安裝
具體使用方式可以參見該 文檔
有關如何配置更高級的流處理概念(例如流連接、擴充工作流等)的指導,請查看 說明書部分。
有關在 Go 中構建您自己的自定義插件的指導,請查看 公共 API。
golang的iris框架的模版如何相互引用?
1.用{{}}包圍的是變數,如 {{testName}} ,這表示把給定變數的值插入, {%%}這是塊元素 在faygo里叫tag,常見的有 for , if 等
2.如何在模板中定義變數, 平常我們在使用的模板的時候的常會有這樣的需要,在模板中要定義一個變數以方便前端邏輯的實現,在faygo模板中定義變數需要用到標籤{%set%}
使用方法
{#定義變數 newName #}
{% set newName = “hello faygo” %}
{#獲取變數newName的值#}
{{newName}}
定義用 tag set 取值就是上文所提到的{{}}取值
3.在模板中調用方法
這也是一個非常常見和有用的方法,在faygo中調用方法有兩種方式 , 一是在渲染模板時在faygo.Map在加入你要調用的方法 , 二是註冊一個全局的方法 (在faygo里叫filter過濾器),我們分別來看一下每個方法的實現
1) 在渲染模板時加入方法(render)
//在後端render時加入方法 testFunc
rErr := ctx.Render(200, switchDir+”index.html”, faygo.Map{
“TITLE”: title,
“testMap”: map[string]string{“aaa”: “111111”},
“testFunc”: func(s string) string {
return s + ” this is test func”
},
})
{#前端模板中調用#}
{{ testFunc(“hello”) }}
結果如下
hello this is test func
這種方法適合只用於此模板一個特殊方法 , 在其它功能中不通用 ,那麼如果想定義一個方法全局都可以使用怎麼辦,這裡就需要註冊全局方法了(見下文)
2)註冊全局方法(過濾器)
如果想定義一個方法全局都可以使用怎麼辦 ,這裡就需要註冊一個方法
// pongo2 註冊一個全局過濾器,一般在程序啟動時init中註冊
//這裡註冊了一個名叫testFilter的過濾器,指向TestFilterFunc方法
pongo2.RegisterFilter(“testFilter”, TestFilterFunc)
func TestFilterFunc(in, param *pongo2.Value) (*pongo2.Value, *pongo2.Error) {
a := in.String() + ” this is global filter”
return pongo2.AsValue(a), nil
}
在這裡我們看到TestFilterFunc方法里接收參數和返回參數的類型是pongo2.Value和pongo2.Error
在註冊過濾器里方法的接收參數和返回參數是固定的這兩個不能改變
官網的話:
All functions』 parameters types must be of either your own type or of type *pongo2.Value(no matter how many) and functions must return one value of either type *Value or your own one.
那麼我們返回數據時怎麼返回? 在上面例子在我們看到了 AsValue 這個方法可以將我們數據返回,我們可以返回struct,map,array,string 等
在前端調用
{{ “hello” | testFilter }}
結果:
hello this is global filter
返回結構體:
type LoginUserInfo struct {
Username string `json:”username”`
Telephone string `json:”telephone”`
Email string `json:”email”`
Level int `json:”level”`
}
func TestFilterFunc(in, param *pongo2.Value) (*pongo2.Value, *pongo2.Error) {
userInfo := LoginUserInfo{
Username: “userA”,
Telephone: “123456”,
Email: “123456@test.com”,
Level: 1,
}
return pongo2.AsValue(userInfo), nil
}
前端使用:
{#定義一個變數接收struct數據 #}
{% set uinfo = “” | testFilter %}
{#取用戶名字#}
{{ uinfo.Username }}
注意,如是 uinfo 只是一個struct 不是struct數組([]uinfo)時 在模板中不能使用{% for %} 使用也不會得到任何數據
如果uinfo是struct數組 在模板中for循環時不要使用 key,val in uinfo
如果uinfo是struct數組 uinfo = []userInfo{}
{#錯誤示例#}
{% for key,val in uinfo %}
{{val.Username}}
{% endfor %}
struct數據不能使用key,否則循環會執行,但取不到任何數據
{# 正確示例 #}
{% for val in uinfo %}
{{val.Username}}
{% endfor %}
說一下返回map時 用for循環的情況,無論是否是map數組都可以用for key,val in uinfo 來遍曆數據
4. 在模板中字元串的連接和宏標籤的使用
在模板中有時我們會碰到這樣的需要:在模板中有幾個變數 ,我們想把這幾個變數連接在一起賦值給另一個變數以做其它操作
例: 在模板中有三個變數 host是域名,route是路由地址,param是參數 ,要把這三個變數連接起來賦值給另一個新的變數做urlencode操作。這應該怎麼辦
因為在模板中使用 + 號連接變數時,程序會認為是數學運算,兩個字元串的連接值為0, 如果用內置的filter: join來連接需要傳入一個slice,但這三個只是字元串變數。
這個時候我們可能就要用到宏標籤了% macro %% endmacro %.
思路是這樣的,在宏標籤中定義一個宏(可以理解為一個方法),這個宏接收三個參數(參數個數看需求而定),在宏內返回連接的字元串
代碼:
{#定義三個變數#}
{% set host=”” %}
{% set route=”/aaa/bbb” %}
{% set param= “?id=123” %}
{#定義一個宏標籤接收三個參數,並返回。注意在宏標籤內如果換行,輸出的結果中也會有換行,在urlencode的時候也會把換行符進行轉義#}
{% macro joinUrl(paramA,paramB,paramC) %}{{paramA}}{{paramB}}{{paramC}}{% endmacro %}
hr
{#定義一個新變數調用宏方法,並將三個參數傳入#}
{% set newurl = joinUrl(host,route,param) %}
{#輸出newurl的值#}
{{newurl}}br
{#輸入出urlencode後的字元串#}
{{newurl|urlencode}}br
結果:
http%3A%2F%2F
在宏標籤在也可加入自定義的一些字元串如在上面的宏標籤返回結果中要加一個固定字元可以這樣寫:
{% macro joinUrl(paramA,paramB,paramC) %}{{paramA}}{{paramB}}{{paramC}}from=macro{% endmacro %}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/306613.html