All Products
Search
Document Center

Server Load Balancer:Fungsi dictionary

Last Updated:Apr 01, 2026

Aturan pengalihan ALB mendukung struktur data dictionary untuk menyimpan dan memanipulasi pasangan kunci-nilai pada waktu pemrosesan request. Fungsi dictionary dapat digunakan untuk membangun logika perutean dinamis, meneruskan state antar operasi, atau memproses data terstruktur seperti playlist M3U8 yang telah diurai—tanpa perlu merangkai perbandingan if/else.

set

ItemDescription
Syntaxset(d, k, v)
DescriptionMenetapkan pasangan kunci-nilai dalam dictionary d.
Parametersd: dictionary tersebut. k: kunci (tipe apa pun). v: nilai (tipe apa pun).
Return valuetrue

Example 1: Inisialisasi dua dictionary—satu dengan indeks numerik dan satu dengan kunci string—lalu iterasi melalui dictionary berbasis kunci string menggunakan foreach.

outer_keys=['e66fd4aa-f281-472f-b919-fc7e7474de25', '66fee78d-1887-42ec-9119-a9b50b7fbca2']
say(concat('keys[1]=', get(outer_keys, 1)))
say(concat('keys[2]=', get(outer_keys, 2)))

inner_keys=[]
set(inner_keys, 'dev', '243390eb-00b7-4551-a6b8-021bb34d1674')
set(inner_keys, 'zeus', '4747d33b-12b0-45e6-ac10-a8e191d6adaa')

def echo_each(k, v, u) {
    s = concat('keys[', k, ']=', v)
    say(s)
}
foreach(inner_keys, echo_each, [])

Output:

keys[1]=e66fd4aa-f281-472f-b919-fc7e7474de25
keys[2]=66fee78d-1887-42ec-9119-a9b50b7fbca2
keys[dev]=243390eb-00b7-4551-a6b8-021bb34d1674
keys[zeus]=4747d33b-12b0-45e6-ac10-a8e191d6adaa

Example 2: Simpan dictionary bersarang (d_inner di dalam d_outer) dan baca kembali nilai dari dictionary dalam.

d_inner = []
set(d_inner, 'name', 'inner ascript')

d_outer = []
set(d_outer, 'dictA', d_inner)

v = get(d_outer, 'dictA')
if v {
    v = get(v, 'name')
    if v {
        add_rsp_header('X-DSL-NESTED-DICT', v)
    }
}

Output:

X-DSL-NESTED-DICT: inner dsl

get

ItemDescription
Syntaxget(d, k)
DescriptionMengambil nilai suatu kunci dari dictionary d.
Parametersd: dictionary tersebut. k: kunci (tipe apa pun).
Return valueNilai kunci jika ada; false jika kunci tidak ditemukan.

Example 1: Akses nilai dari dictionary berbasis indeks numerik maupun berbasis kunci string.

outer_keys=['e66fd4aa-f281-472f-b919-fc7e7474de25', '66fee78d-1887-42ec-9119-a9b50b7fbca2']
say(concat('keys[1]=', get(outer_keys, 1)))
say(concat('keys[2]=', get(outer_keys, 2)))

inner_keys=[]
set(inner_keys, 'dev', '243390eb-00b7-4551-a6b8-021bb34d1674')
set(inner_keys, 'zeus', '4747d33b-12b0-45e6-ac10-a8e191d6adaa')

def echo_each(k, v, u) {
    s = concat('keys[', k, ']=', v)
    say(s)
}
foreach(inner_keys, echo_each, [])

Output:

keys[1]=e66fd4aa-f281-472f-b919-fc7e7474de25
keys[2]=66fee78d-1887-42ec-9119-a9b50b7fbca2
keys[dev]=243390eb-00b7-4551-a6b8-021bb34d1674
keys[zeus]=4747d33b-12b0-45e6-ac10-a8e191d6adaa

Example 2: Baca nilai dari dictionary bersarang, menggunakan if v untuk menghindari kunci yang tidak ada.

d_inner = []
set(d_inner, 'name', 'inner ascript')

d_outer = []
set(d_outer, 'dictA', d_inner)

v = get(d_outer, 'dictA')
if v {
    v = get(v, 'name')
    if v {
        add_rsp_header('X-DSL-NESTED-DICT', v)
    }
}

Output:

X-DSL-NESTED-DICT: inner dsl

foreach

ItemDescription
Syntaxforeach(d, f, user_data)
DescriptionMelintasi setiap elemen dalam dictionary d dan memanggil callback f untuk setiap elemen. Perulangan berhenti lebih awal jika f mengembalikan false.
Parametersd: dictionary tersebut. f: fungsi callback, dengan signature f(key, value, user_data). user_data: dictionary yang diteruskan ke setiap pemanggilan callback.
Return valuetrue

Example 1: Iterasi melalui dictionary berbasis kunci string dan cetak setiap pasangan kunci-nilai.

outer_keys=['e66fd4aa-f281-472f-b919-fc7e7474de25', '66fee78d-1887-42ec-9119-a9b50b7fbca2']
say(concat('keys[1]=', get(outer_keys, 1)))
say(concat('keys[2]=', get(outer_keys, 2)))

inner_keys=[]
set(inner_keys, 'dev', '243390eb-00b7-4551-a6b8-021bb34d1674')
set(inner_keys, 'zeus', '4747d33b-12b0-45e6-ac10-a8e191d6adaa')

def echo_each(k, v, u) {
    s = concat('keys[', k, ']=', v)
    say(s)
}
foreach(inner_keys, echo_each, [])

Output:

keys[1]=e66fd4aa-f281-472f-b919-fc7e7474de25
keys[2]=66fee78d-1887-42ec-9119-a9b50b7fbca2
keys[dev]=243390eb-00b7-4551-a6b8-021bb34d1674
keys[zeus]=4747d33b-12b0-45e6-ac10-a8e191d6adaa

Example 2: Cetak dua segmen .ts pertama dari playlist M3U8 dan hentikan perulangan lebih awal. Callback melacak penghitung dalam user_data dan mengembalikan false setelah dua entri .ts dicetak.

def echo_each(k, v, u) {
    say(v)

    if match(v, '.*ts') {
        ts_cnt = get(u, 'ts_cnt')
        ts_cnt = add(ts_cnt, 1)
        set(u, 'ts_cnt', ts_cnt)

        if ge(ts_cnt, 2) {
            return false
        }
    }
}

m3u8 = ''
m3u8 = concat(m3u8, '#EXTM3U8', '\n')
m3u8 = concat(m3u8, '#EXT-X-MEDIA-SEQUENCE:140651513\n')
m3u8 = concat(m3u8, '#EXT-X-TARGETDURATION:10\n')
m3u8 = concat(m3u8, '#EXTINF:8,\n')
m3u8 = concat(m3u8, 'http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651514_140651513.ts\n')
m3u8 = concat(m3u8, '#EXTINF:9,\n')
m3u8 = concat(m3u8, 'http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651514_140651514.ts\n')
m3u8 = concat(m3u8, '#EXTINF:10,\n')
m3u8 = concat(m3u8, 'http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651514_140651515.ts\n')

lines = split(m3u8, '\n')
u = []
set(u, 'ts_cnt', 0)
foreach(lines, echo_each, u)

Output:

#EXTM3U8
#EXT-X-MEDIA-SEQUENCE:140651513
#EXT-X-TARGETDURATION:10
#EXTINF:8,
http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651514_140651513.ts
#EXTINF:9,
http://vapp1.fw.live.cntv.cn/cache/289_/seg0/index140651514_140651514.ts

del

ItemDescription
Syntaxdel(d, k)
DescriptionMenghapus pasangan kunci-nilai dari dictionary d.
Parametersd: dictionary tersebut. k: kunci (tipe apa pun).
Return valuetrue

Example: Tetapkan kunci, konfirmasi keberadaannya, hapus, lalu konfirmasi bahwa kunci tersebut sudah tidak ada. Header respons mencerminkan kedua kondisi tersebut.

var_a = []
set(var_a, 'note_a', 'note a info')
if get(var_a, 'note_a') {
    add_rsp_header('X-RESPOND-OUTPUT', 'found var_a key', true)
} else {
    add_rsp_header('X-RESPOND-OUTPUT', 'del var_a key', true)
}
del(var_a, 'note_a')
if get(var_a, 'note_a') {
    add_rsp_header('X-RESPOND-OUTPUT', 'found var_a key', true)
} else {
    add_rsp_header('X-RESPOND-OUTPUT', 'del var_a key', true)
}

Output:

X-RESPOND-OUTPUT: found var_a key
X-RESPOND-OUTPUT: del var_a key