á°ááᣠáá²á¢á€áá€áµ á ááá¬áœááœá á¥ášáá áá© ááᢠášáá°á á áá»ážá á«áá DBMS á¥á á áá ááá ášáá°áá áªá« á ááááá á áá£áá á Mail.ru á¡áµá ášá°ááᣠááµášá ááᢠá Tarantool áá ášá°áá°ášá± ášáááµááᜠášáá°á áá¥ááµ á á°ááá áá²á¢á€áá€áµ ááµá -ááµá³áá» ááá³ áµáá á¥á ášáá°áá áªá« ášáááµ áááá á á ááµ ášá áµá«á» áŠá³ ášááᥠáá ášááµááá áœáá³á á áááá± áá. á á°áá³á³á áá áš ACID áá¥áá¶áœá á áá áá ášááᥠáœááµ áášááá£á (ášWAL áááᥠááµá³áá» á á²áµá áá áááá£á)ᢠTarantool ááá£ááµ á¥á áááá«áµ á á¥á® ášá°á°á« áµáá á ááᢠášáµáªáµ 2.1 ááá®á£ á SQL ááá ášáá°ášá áá ááᜠáá°áááᢠTarantool áááµ ááá á¥á á ááá á¢á€áµá² áááµ áµá áááµ á«áá ááᢠášáááµ áµáá áµ áµáªáµá á áá¢

áááá ááá! (⊠á á áááá áá°á°á±)
ášáá á«ááµ ááá á³á«áá¶áá ášáášá áá¶áœ áá ášáá°á© ášáá°á áááµ á«áážá áá°áá áªá«ááœá áááá á áá«áª ááµášá á«á°ááá³áᢠá á¥áá°áá
ááááµ á ááá¬áœáᜠááµá¥ á¥á áá ášááᥠáá£ááµ á«áµáááá.
ášáá á¥áá°á°á áá°á Tarantool á á¥á® ášá°á°á« ášááᥠáá£ááµ á ááᢠášáááá ááá
á ááµá°á áá (WAL) ááµá¥ á«ááµá áááá áá¥áá¶áœ á áá£ááµ áá á á
á°á á°ášá°á ááµáážá ááᢠá¥ááá áá á¥áá²á
áááá± áá£ááµ (á á°ášá᪠á¥áá á«ááá áá
á°á á°ášá) ášáá°áá áªá« áµá
á°áµ áá»á»áá ááášááᥠá¥á/ááá ášáá£á¥ ážááá á áááµá°á áá¶áœ áá«ášá ááá°á«ášáµ áá á
ááá¢

á©á. 1. á áááµá°á ááµá¥ áá£ááµ
ášá áá«á ááá³ áá³á á á ááµ ášááᥠáá³ ááµá¥ ášá°áá ášáá ááᥠáá° áá ášááᥠáá³ ááá°áµ/ááµáµá ááµá°ááá ááᢠá áááá ááá³, ášá áá áá¹ ášáá áááµá áá áá ááá ááœáá ášáá°á á°ášá áá£ááµ - á áá°áá áªá«á ášáááµ ááá á°ášá ášááᥠáá£ááµ. á¥ááá«á¢ á á²á¢á€áá€áµ ááµá¥ ášá°á°á« ááá ášáá áááµá á áá áááᣠááá áá á¥á«áááá á£áá áá°áá áªá« ááµá¥ á á«á³áœá áá£ááµá á°áá£á«á á¥áá°ááááᢠáá á áá«ášá¥ ááá±á á¥á áᜠá¥á áá³á¶áœ á ááµ. á¥á áá¹á á¥áááááá¢
1. ášáµá«áá áá á£;
- áááá ááᥠááµá°ááá á ááœáá, ááá áá ášá°áá°áá ááá á¥á» (ááá³á, á áá³ááµ á°áá ášáŠáœá á¥á», á áá³ááµ á áá¶áœá ááá ášá°áá°á ááµáááµ ášáá«áá ááááŠáœá ááµá°ááá ááœáá);
- á£áá°áá³á°áá (á á áá ášTarantool - 1.10) ááá ášá°áá³á°á (á áá£á®á¹ ášTarantool áµáªá¶áœ ááµá¥ ášáá°áá á) ááá³ á á°ášá³á³á ášáášáááá áá á°á-á°ášá áá£ááµ á á°áá«á ášáá°á-á°ášá áá£ááµ á ááá-áááᜠááµá¥ áášááá ááœáá (áááµá ᣠáµáá á« á ááááªá« ááá¡á á«áá³áµáá - ášáááᥠááá áá ááá¥, ášáá«á á áá£ááµ áá áá á á, ášáá« á áá ášááá¥áá ášáááᥠááá áá áášá°á³á, ááá°.);
- áááᥠá¥á áá ášá°áášáš ášá áᥠáááá áµáªáµ á¥á» ááµá°ááá ááœáá (ášáá á°á á°ášá áá£ááµ á á°áᚠᣠá áá³á áá ášá°á°ášá áááŠáœ áá á á á°á á°ášá°á á á°ááá á¡ áá áá«áá³á)á¢
2. ášáááµ á³á³á€ááœá áááá³á°á ášáá«áµáœá ášá€áœá²á²á áááá¥á á áá°áá á áá ááá áœáá®áœ ášááá¢

á©á. 2. á HTTP áá áá£ááµ
3. áášá ášáá°áááá£ážá ášááᥠáá³ á áááá®áœ á ááµ á áááµ ááá ášáá£ážáá (á á°ášááªá á á á ááá ááá³ ášá°áá«á© á²á¢á€áá€áµááœáᣠáá®áá«ááá áááááœáᣠááµášá®áœá ááá° áá áá áá»áá)á¢

á©á. 3. á á°áá«á© áµááá¶áœ ááµá¥ áá£ááµ
áá³á± á á áá«á áá®áá«ááá ášáááá ášá áá ášá£áµ/áá ááᣠá¥á á á¥á® ášá°á°á«áá á°áá£á ášáá ááµ ááá ášá¥á«áµáá áá°áá á áááá¥áá³áá¢
á á¥ááµá ááá³ ááµá¥ ášáá á«ááµ á¥á áᜠáá³á ášáá (áááá á áµááá ášáá) ášáá°á á°ášá áá£ááµá áá áá áááá«á³á áá. á Tarantool DBMS ááµá¥ á£á ášáá°á á°ášá ášááᥠáá£ááµá ááá°áá á á áá«á³ áááá¶áœá á¥áááášáµá¢
ášáµá«áá ááááµ
áµááá ášášáá°á á°ášá áá£ááµ á áá± á ááá³ ášáµá«áá áá ᣠááᢠáá á¥á á áá á áá á¥áá á¥áá²áá á á¥á«áá³áá± ášáááᥠááá áá ášá°ááááá ášááᥠáá á ááááµ á áµááá áá. á¥ááᥠáá, á ááá-ááá áášášá» áá ášáášá ááá á«á ášááá© áá ááá³á°á á¥áá³áá áµ áááááµ ášáá¥áá (á¢á«ááµ ááá«á ášááᥠááá á áá£ááµ ááµá¥).
á ášáá°á á°ášá áá£ááµ áá
áµ ášá°ááááá ášááᥠáá á á¥ááŽáµ ááááµ áá»áá? áá¥á°á áááµá áášáá á áá á¥á á á°áá± ááášá¥ ááá ááœááᢠáá
áá áááµášá á á áá ášá¡ ááµá¥ á«ááá ášáá-á°ááµ ááµá (á«á) áá áá ááœáá. ááá³áᣠâáµáááâ á°ááµ ááµá ááášá ááœáá âá áµááá ášáµááá ááµáážáá« ááâ - delivery_time. ášáá
áááµá áœáá á áá
ááµá ááµá¥ á«ááµ áááᜠášáµá¥ááᜠááá á áá á á°ááá° á
á°á á°ášá°á ááµá¥ ááá ášáá£ážáá. áµááá
ášáá°ááá ášááµá áá ááµá³ááµ á ááœááᢠdelivery_time, á ááµáá ášáááᥠááá áá ášá°ááá, á¥á á ááá¥áá ášáááᥠááá áá áááá ááááŠáœ ášá á«á ášááµá áá ááášá¡ delivery_time. áá
á°á ášááµá áá á«áážá ááááŠáœ á á°áááá ááá-áááᜠáá«ášá á°ášáášá ááá ááœááᢠdelivery_time. á¥áá²ááᣠáµááá áááŠáœá ááµášá ááœá áá áᣠááá áá á ááµá áá á°áœáá á áá³á°ášáᢠdelivery_time. á ááá±á ááá³áᜠáááŠá¹ ášááá© áá° ááµášá»á á áá°áááá. á¥ááá
á áœáá®áœ áááá³áµ, "á°á°á«á«á¢" ááᥠááµá°ááá á«áµááááá. á¥ááá«á¢ á á¥á«áá³áá± ášáááᥠááá áá áááá ááᥠá ááµá áá á¥ááµá°ááááá delivery_time, á£ááá ášá°áá°á áá¥á¥ á áá (ááá³á, á áá á«áá á
áœá áµ N á°áá¶áœ). ááá á¥áá ááµááá
áµááá¶áœ áá
á áá«ášá¥ á á£á á¥á áá ášááááá á¥á ášááááááá ášáµá«áá áá ᣠáá° ááá ááá ááááµ á¥áá°ááœá ááᜠáá. á á°ášááªáᣠá¥ášá°ááááš á«áá á áá ášá¥ ášáá-áá áá ášá°á«á«á ááµá áááášá ááœááá¢
ááá áááµáᣠá á á°áá£á á ášááµ ášá áá ááµá¥áµá¥á£ áášá ááá áá ááá á ááᢠá áá
ááá³, á á¥á«áá³áá± áááᥠááá áá, ááá áášááᜠáá°áááá, á°ášá°á á á°áá£á© á«áá°ášááá áá. áá
áá ááá°áá á ášáŠáá«á á ááµ áá° ááá á áá ášá¥ áášá á«áµááááá³á (ááá³á ᣠis_transferred). á°áá£á© áááá¡á ááá áá á«áá, á°ááá
á ááµá áááá áááµá³á true, ášáá« á áá ááá£á± á ááááŠáœ ááµá¥ á áá³á°áá. áá
ášááµáážáá« á áá«á ášáášá°ááµ áá³á¶áœ á ááµá¢ á ááááªá«á£ áá¥á«áá³áá± ášá°ááá áááá¥á£ á¥áá
á ááá á á¥á ááá á áá áµá¢ á áá á á ááááᣠáá
ášá°ááááá ášááᥠáá á á á¥á¥á á áášáá á¥á ášáááá áá¥á á á¥á¥á ášááµášáµ áá ááá³á°á ááœááᢠá ááá°á á°ášá, á°áá³á³á©á áááᥠáá¥á á°áá£á®áœ ášááá á¥áµá ášáá (ášááááªá«á á°áá£á áá«á± á¥á áááᜠáá á°ášá°á á«ášááá£á).
ášáá ášá°á áá±áµá áµááá¶áœ ášááá áµ áᎠášášáµááœá áááŠáœ ááášá³á°á á á°áááá á°áá ášá¥ áá á ááµ á ááµ áášá áá. á¥áá²á
áááá± áááµ ášáá-áá ááááµ ááá ááœáá á¥á á á¥á«áá³áá± áá ááááŠáœ á²ášáá© / á²áášá© (á á á¶áá ášáá°áá / ááᥠáá) á áá°áá áªá«á áááá / áááá á áá áµ. á¥áá° áá³á, ááá±á á¥áá¥á« update_time. ášáá
á á ááµ ášáá°ááá ášááµá áá áá°áááá© ááááŠáœ á ááµááᥠáá£á©á ášáááᥠááá áá á áá
á¥áŽáµ áááá á¥ááœááá (ášááµá áá á«áážáá ááááŠáœ ááášá¡) update_time, áá°á á²á ášá°ášááž áá á áá). ášáááá á áá«ášá¥ áœáá ášááᥠáááŠáœ á á¡áµáᜠááµá¥ áášá°á± ááœáá. á á áá± ááµá¥ á£áá ášááµá á¥áŽá¶áœ áááá«áµ update_time áá© áááá ááœáá. áµááá
áá
á ááµ áá°ášááá (ááœ-á ááœ) ášááᥠáá
ááµ áá áá á áá»ááᢠášááᥠáᜠá áᜠááá³ášáµá£ á á£á áá
á°á á
áá¥áá ááá«ážá ášááœá á°ášá᪠áµáá¶áœá ááá á á ááŠáµ (ááá³áᣠášáášá áá± áááá áááá¥áµ ášááá á°ááµá® ááá£áµ) update_time ášá°á áá°á á áá ášá á«á á¥á ášá°áá°á ááááŠáœá á ááá«áµ, ášáááá ááááªá« ááá® ášá°áá°á áá«á«á» ááá®).
ášáá°ááá á á«ááµ á áµáá¹ á áá»á»á ášááᥠááµá°áááá áá€á³áááµ áá»á»á ááœááᢠáá
áá áááµášá ášá¢áá²áá á áááµá (ášá
á á¢áá²áá) á¥áá° ášá ááµ ááµá á¥áŽá¶áœ á¥áá áááá áááŠáœá áášá³á°áᢠááá±á á¥áá°ááá row_ver. áááᥠá á°áá áš/á á°á»á»á áá¥á ášáá
á ááµ ášááµá áá á ááá áááá/áááá á áá áµá¢ ááá áá á áá
ááá³, ááµá© ášá ááá áá-á°ááµ á ááá°á¥á, ááá áá ášá áá³ááµ áá£áª áá á á ááµ ášáá¯á. á áá€á±á, ááá± row_ver áá© á¥áŽá¶áœá áááá á¥á áš âáŽáá³â áášáá ááá³ášáµ á¥á» á³ááá (ášáá°áá ášáááᥠááá áá áášášá» ááá® ášá°ášáášá/ášá°áášáš áášá) á¥á» á³ááá á ááá á¥á á á¥ááµ áá° ááᜠááášáááá áá«áááá ááœááá¢
á ášáá°á á°ášá áá£ááµ áááá ááµá¥ ášá°ááááá ášááᥠáá á áááááµ ášáášášá»á ášá³áá° áᎠáá¥á á á£á á¥á© á¥á áááá°áá áááµááᢠá áááá á¥áááášá°áá¢
ášášáµá á¥áªáµ áá£áªá á áá áá ááᥠááµá°ááá
ášá áááá / áá ááá áá°áá á
á MS SQL á áááá ááµá¥ áá
áá á á°á«á ááá°áá á áá© ášá ááµ ááááµ á á - rowversion. á¥á«áá³áá± ášááᥠáá³ á¥áá° á ááµ á£áá á áá ášá¥ ááµá¥ áááᥠá á°ášááš/á á°ááá áá¥á á ááµ ášáášáá áá£áª á ááᢠrowversion. ášáá
áá£áª áá á á°ášáášá / á á°ááá á áááᥠááµá¥ á áá
á ááµ ááµá áá á á«áµ-á°á ááá°á£á. áš Tarantool DBMS á°áá³á³á á á¥á®ááᥠáᎠášáááᢠááá áá, á Tarantool ááµá¥ á á¥á
áá°áá á á áµážá᪠á áá°áá. áá
á¥ááŽáµ á¥áá°áá°ášá á¥áááášáµ.
á ááááªá«, áµáᜠášáááµ á áá£á¥: á Tarantool ááµá¥ á«á á ášáŽááᜠááá°áµ áá£áá, á¥á ááááŠáœ á±áááµ áá£áá. á Tarantool ááµá¥ á á°á á°ášá°ááœá ááá á ááœáá. á á°á á°ášá°áᜠášá³áá ášá¢áá²áá á¥áŽá¶áœ ášá°á°ášá ááá¬á°á®áœ ášá áá ááá á áá°ááᢠá¥ááá«á¢ áááááœá ášáááááá áá ááᢠášá³áœ á¥áá°áá á áááµ á á°á á°ášá°á á¥ááá¥á«áá.
á Tarantool ááµá¥ áááááá ášááᥠáá³ á¥á« ášáášáááá á ááµ ášáášá°ááá áµááá ááµá¬áµ á«áµááááá³á:
box.cfg{}
á áá áááá«áµ Tarantool ášááᥠáá³ á áœá á°-áá¶ááœá á¥á ášáá¥ááµ áááᥠááµá³áá»ááœá á áá á£áá ááá« áá áá»á áááá«áá¢
á
á°á á°ášá°á á¥ááá á row_version:
box.schema.sequence.create('row_version',
{ if_not_exists = true })
á áá«á if_not_exists ášáá¥ášáµ áµááªááµ á¥á áá á¥áá²á°áá á ááá
á³áá¡ ááá© á«á Tarantool á¥áá°áá áááá á á áááááᢠáá
á áá«á á ááá á ááá¥ááµ ášá²á²á€á áµáááᜠááµá¥ á¥á
á áá ááááá¢
á¥áá° áá³á áŠá³ á¥ááá áá¢
box.schema.space.create('goods', {
format = {
{
name = 'id',
type = 'unsigned'
},
{
name = 'name',
type = 'string'
},
{
name = 'code',
type = 'unsigned'
},
{
name = 'row_ver',
type = 'unsigned'
}
},
if_not_exists = true
})
á¥áá
ášáŠá³áá áµá á ááá
á°áá (goods), ášááµá áµáᜠá¥á áááá¶áœ.
á Tarantool ááµá¥ á á«áµ-á°á ášáášáá© ááµá®áœ á¥áá²á ášá°áá á©áµ á
á°á á°ášá°ááœá á áá áá ááᢠá á«áµ ášáášáá áá³á ááá á ááµá á¥ááá á id:
box.schema.sequence.create('goods_id',
{ if_not_exists = true })
box.space.goods:create_index('primary', {
parts = { 'id' },
sequence = 'goods_id',
unique = true,
type = 'HASH',
if_not_exists = true
})
Tarantool á¥á á áááµ á¢ááŽáá¶áœá áá°áááᢠá á¥ááµ á¥á á áá ášááááµ á¢ááŽáá¶áœ TREE á¥á HASH á ááá¶áœ áážáᣠá¥áá±á ášáµá áá á á°ááá° á áááá®áœ áá ášá°áá°ášá± áážáᢠTREE á á£á áááᥠášáášá á áá ááááµ ááᢠá á°á°á«á ááá© áášáá á°ááµá® áááá£áµ á«áµáœááᢠáá áá¥á©áááµ ááá«, HASH ášá áá á°áµáá áá. á áá áá ášáµ HASH ááá ááá (á«á°ášááá á«á°ášááá) áá áá á°áᢠáá.
ááá±á ááá áá row_ver ášá°áášáš ááá¥á áááµá°ááá á°ášá³á³á á¥áŽá¶áœá ášáá
á ááµ ááµá®áœ áá áá«á«á á«áµááááá³á row_ver. áá ášááá ááá á á°áá«á ášá ááµ ááµá áá row_ver á á²áµ ááááŠáœá á²ášáá© á¥á» á³ááá áá£á®á¹á á áááá©á áµ ááá á á ááµ áášáá á áá áµ. ááá
ááµá
áŽááœá áá áá ááœáá. Tarantool áááµ á áááµ ášá áá ááµá
áŽáᜠá ááµá¡- before_replace О on_replace. á áŠá³ ááµá¥ á«áá áášá á á°áášáš áá¥á ááµá
áŽáᜠááá áá (áááŠá¹ áá°áá³á áá¥á«áá³áá± á±áá ášáááµááµ á°áá£á áááá«á)ᢠášáááá³áµá on_replace, before_replace- ááµá
áŽáᜠááµá
áŽá ášáášáááá áµá áš tuple ááᥠá¥áá²ááá© á«áµáœááá³áᢠá áá
áá ášáµ, ášáášášá»á á áááµ ááµá
áŽáᜠááµáááá.
box.space.goods:before_replace(function(old, new)
return box.tuple.new({new[1], new[2], new[3],
box.sequence.row_version:next()})
end)
ášáášá°áá ááµá
Ꭰášááµá ááá áá°á«áᢠrow_ver ášá°ášááž tuple áá° á°ášá³á© á°ášá³á³á á¥áŽáµ row_version.
áášáá ášá áá ááá£áµ á¥áá²á»á goods á á ááµ row_verá¢ááŽááµ á¥ááá áá¡-
box.space.goods:create_index('row_ver', {
parts = { 'row_ver' },
unique = true,
type = 'TREE',
if_not_exists = true
})
ášáášá á áá ááááµ - áá (TREE), áááá«á±á á á áá± ááµá¥ á£áá ášá¥áŽá¶áœ á
á°á á°ášá°á ááá¡á ááá£áµ á áá¥á row_ver.
áá° áŠá³á ášá°áá°á ááᥠá¥áášááá¡-
box.space.goods:insert{nil, 'pen', 123}
box.space.goods:insert{nil, 'pencil', 321}
box.space.goods:insert{nil, 'brush', 100}
box.space.goods:insert{nil, 'watercolour', 456}
box.space.goods:insert{nil, 'album', 101}
box.space.goods:insert{nil, 'notebook', 800}
box.space.goods:insert{nil, 'rubber', 531}
box.space.goods:insert{nil, 'ruler', 135}
áááá«á±á ášááááªá«á ááµá á á«áµ-ášáášáá áá£áª ááဠá ááµá© áá á¥áááááᢠTarantool ášááá¥ááá á¥áŽáµ á á«áµ-á°á áá°á«áᢠá á°áá³á³áá á¥áá° ášá ááµ ááµá®áœ áá row_ver ááá ááœáá - ááá áááá á áá«áœ á áááṠᣠáááá«á±á áá
á ááµ á á áá ááµá¥ ášáášášá»áá áŠá³ áááá.
ášááµáá£á±á áá€áµ á¥áááµáœá¡-
tarantool> box.space.goods:select()
---
- - [1, 'pen', 123, 1]
- [2, 'pencil', 321, 2]
- [3, 'brush', 100, 3]
- [4, 'watercolour', 456, 4]
- [5, 'album', 101, 5]
- [6, 'notebook', 800, 6]
- [7, 'rubber', 531, 7]
- [8, 'ruler', 135, 8]
...
á¥áá°áááášá±áµ, ášááááªá«áá¹ á¥á ášáášášá»áá¹ ááµá®áœ á á«áµ-á°á áááá. á áá ášáŠá³ áááŠáœá ášáᜠá áᜠááá«á á°áá£á ááá ááá ááááᢠgoods:
local page_size = 5
local function get_goods(row_ver)
local index = box.space.goods.index.row_ver
local goods = {}
local counter = 0
for _, tuple in index:pairs(row_ver, {
iterator = 'GT' }) do
local obj = tuple:tomap({ names_only = true })
table.insert(goods, obj)
counter = counter + 1
if counter >= page_size then
break
end
end
return goods
end
á°áá£á© á¥áŽá±á á¥áá° áááªá« áááµá³á row_ver, ášá¥á± ááá® áááŠáœá ááášáµ á áµááá áá, á¥á ášá°ááá áá ááᥠášá°áá°á ááá áááá³á.
á Tarantool ááµá¥ ášááᥠááá ášáášáááá á áášá á áááᜠááᢠá°áá£á get_goods á°á°ááá áášáá á áášá á áá áá ááá row_ver ášá°ááá ááᥠáááá á. ášááµáá á áááµ GT áá (ášáá áᥠáá áá£áá£ášáá áá¥)ᢠáá
áááµ áµáááá¹ ášá°áááá ááá (ášááµá á¥áŽáµ) ááá® ášá¢ááŽááµ á¥áŽá¶áœá á á
á°á á°ášá°á áá»áá«á áááµ ááᢠrow_ver).
á°á°áááá á±áááµ áááá³áᢠá ááá á á á€áœá²á²á á á©á áášáá áááµá°ááá á±ááá¹á ááá£á á°ášá³á³áááµ áá°ááᜠááá
á áááᥠá áµááá ááᢠáá³áá ááá
áá°á á á°áá£á áá ááá tomap. ášáá áá ááá
tomap ášá¥á«áµáá á°áá£á ááá ááœáá. ááá³á ášááµáá áµá ááášá á¥áááááá name, áá³áá á á«áá code á¥á ááµá áášáá© comment:
local function unflatten_goods(tuple)
local obj = {}
obj.id = tuple.id
obj.goods_name = tuple.name
obj.comment = 'some comment'
obj.row_ver = tuple.row_ver
return obj
end
ášáá€á± ááᥠáᜠáá á (á á ááµ ááá ááµá¥ á«á ášááááŠáœ á¥ááµ) á á°áááá ááá°áá page_size. á áá³áá ááµá¥ á¥áŽá± page_size áá 5. á á¥ááá°á áá®áá«á ááµá¥, ášáá¹ áá á á á¥áááá áá ášá áá á áµááá áá. á áŠá³á tuple á áá«á áá á ááá°áá. ášááᥠááµá°ááá ááá á ááá«áµ á¥á©á ášáᜠáá á á á°ášá£á ááá°á ááœááᢠášáá¹ áá á á áµááᣠá á°ááªá á¥á á á°áá£á© ááᜠáá«ášá á«áá ášáááªá« á¥ááµ á ááµá°á ááááᢠá áá
ááááµ áááŠáœá áááášáµ á á ááá ááá ááááµ ááœááᢠááá ááᣠášáá¹ áá á á á£á áµáá
ášááᣠááááá á²áªá«á á á áááá© áá á á£á ášá
á áá á¥áá³ááááᢠá áá
áááá«áµ áá° á áááá© ášááá¡ ááᜠá¥á«áááœá áááµá¬áµ áááášá¶áœ ááá© ááœááᢠáááªá« page_size ášááááªá«á ááá áá«á ááœáá. áá¥á«áá³áá± ášá°ááá áŠá³, ášá«á±á áá áááááµ ááœáá. ááá ááᣠáá á¥áááá¹ áŠá³áᜠáá£áª á¥áŽá± (ááá³á 100) á°áµáá ááá ááœááá¢
á°áá£á©á á¥áášááá get_goods:
tarantool> get_goods(0)
---
- - row_ver: 1
code: 123
name: pen
id: 1
- row_ver: 2
code: 321
name: pencil
id: 2
- row_ver: 3
code: 100
name: brush
id: 3
- row_ver: 4
code: 456
name: watercolour
id: 4
- row_ver: 5
code: 101
name: album
id: 5
...
ášááµá ááá á¥ááá°áµ row_ver ášáášášá»á ááµáá á¥á á°áá£á©á á¥áá°áá áá°áá:
tarantool> get_goods(5)
---
- - row_ver: 6
code: 800
name: notebook
id: 6
- row_ver: 7
code: 531
name: rubber
id: 7
- row_ver: 8
code: 135
name: ruler
id: 8
...
á áᎠá¥áá°áá:
tarantool> get_goods(8)
---
- []
...
á¥áá°áááášá±áµ ᣠá áá
ááááµ á¥á
á áá á²áá ᣠá°áá£á© áááá ášáŠá³ ááááŠáœá áᜠá áᜠáááá³á goods. ášáášášá»á áᜠá£á¶ ááá« áášá°ááá¢
á áŠá³ áá áááŠáœá á¥ááµááá¡-
box.space.goods:update(4, {{'=', 6, 'copybook'}})
box.space.goods:insert{nil, 'clip', 234}
box.space.goods:insert{nil, 'folder', 432}
ášááµá ááá ááášááᢠname áá ááµ áá€áµ á¥á áááµ á á³á²áµ áá€á¶áœá á áááá.
ášáášášá»áá ášá°áá£á á¥áª á¥ááµáááá¡-
tarantool> get_goods(8)
---
- - row_ver: 9
code: 800
name: copybook
id: 6
- row_ver: 10
code: 234
name: clip
id: 9
- row_ver: 11
code: 432
name: folder
id: 10
...
á°áá£á© ášá°áášá©áµá á¥á ášá°ášáá©áµá ááááŠáœá ááá°. áµááá
á°áá£á© get_goods ášáášášá»á á¥áª á áá ášá°áášáš ááᥠá¥áá²áá á ááá
áµááá³á ᣠáá
á ášáááµ ááµá¥ á«áá ášáá£ááµ áᎠáá ášáµ ááá¢
ášáá€áµ á á°á£á¥á á HTTP á á©á á JSON ááá ášáá áœáá áá°á áá á¥áá°áááᢠáµááá áá³á á¥áá ááá ᥠááœáá-
ášá°áá áá / ášá£áªá« ááá áá°áá á
ášá°áá£á© ááá á á°áá£á á áá á¥áá°áááµá á¥áááášáµá¢ ášáášá°áá ááᥠááášáážáµ á á°áá£á© á á©á áŠá³ á¥ááá áá¡-
box.schema.space.create('goods', {
format = {
{
name = 'id',
type = 'unsigned'
},
{
name = 'name',
type = 'string'
},
{
name = 'code',
type = 'unsigned'
}
},
if_not_exists = true
})
box.space.goods:create_index('primary', {
parts = { 'id' },
sequence = 'goods_id',
unique = true,
type = 'HASH',
if_not_exists = true
})
ášáŠá³á ááá
á ášááá© ááµá¥ á«áá ášáŠá³ á á á«á áá ááá³á°áá. ááá áá ášá°áá ááá ááᥠáá° áá áŠá³ áµááá«áµá°ááá, á ááµ row_ver á á°áá£á© áŠá³ áá á áá°ááᢠá ááµá áá id ášááá ááá«áᜠááááá£á. áµááá
, á á°áá£á© á á©á á á«áµ-á°á á¥áá²ášáá ááµášá á á«áµáááá.
á á°ášááªá, á¥áŽá¶áœá áááµááᥠáŠá³ á¥áááááá row_ver:
box.schema.space.create('row_ver', {
format = {
{
name = 'space_name',
type = 'string'
},
{
name = 'value',
type = 'string'
}
},
if_not_exists = true
})
box.space.row_ver:create_index('primary', {
parts = { 'space_name' },
unique = true,
type = 'HASH',
if_not_exists = true
})
áá¥á«áá³áá± ášá°á«á áŠá³ (ááµá space_name) ášáášášá»áá ášá°á«ááá áá á¥áá
á¥ááµááá ááá row_ver (áá³ value). ááá± á¥áá° áá ááá áá ášáá°á«áᢠspace_name.
ášáŠá³ ááá¥á ááá«á á°áá£á á¥ááá á goods á HTTP á á©á. áá
áá áááµášá ášá€áœá²á²á á°áá áá ášáá°áá á á€á°-ááœáááµ á¥ááááááᢠášáášá°áá ááµáá á€á° ááá
áá±á áááá á¥á ášá€áœá²á²á á°áá áá á«áá¥ááá¡
local http_client = require('http.client').new()
á json á²áŽáªá«ááááœá á¥áá²á á€á°-ááœáááµ á¥ááááááá¡-
local json = require('json')
áá ášááᥠáááµ á°áá£á áááá á á á áá-
local function load_data(url, row_ver)
local url = ('%s?rowVer=%s'):format(url,
tostring(row_ver))
local body = nil
local data = http_client:request('GET', url, body, {
keepalive_idle = 1,
keepalive_interval = 1
})
return json.decode(data.body)
end
á°áá£á© ášá€áœá²á²á á¥á«áá áá° á©á áá€á á áµá«á» á«ášáááá á¥á ááá«á row_ver á¥áá° áá¬áµ á¥á ášá¥á«ááá á«áá°á á á áá€áµ áááá³áá¢
ášá°áá ááá ááᥠášááµááᥠá°áá£á áá áá áááµááá¢
local function save_goods(goods)
local n = #goods
box.atomic(function()
for i = 1, n do
local obj = goods[i]
box.space.goods:put(
obj.id, obj.name, obj.code)
end
end)
end
ááá¥á áá° áŠá³ ášááµááᥠáá°áµ goods á áá¥ááµ ááµá¥ ášá°ááá (á°áá£á© ááá
á¥á
á áá áááá box.atomic) ášá²áµá áµá«ááœá áá¥á áááááµ.
á áášášá»á, ášá á«á£á¢á«á áŠá³ ááá³á°á á°áá£á goods ášááá© áá á¥áá°áášá°áá á°áá£á«á ááµášá ááœáá-
local function sync_goods()
local tuple = box.space.row_ver:get('goods')
local row_ver = tuple and tuple.value or 0
ââ set your url here:
local url = 'http://127.0.0.1:81/test/goods/list'
while true do
local goods = load_goods(url, row_ver)
local count = #goods
if count == 0 then
return
end
save_goods(goods)
row_ver = goods[count].rowVer
box.space.row_ver:put({'goods', row_ver})
end
end
á ááááªá« áá°á á²á ášá°ááá áá á¥áŽáµ á¥ááá£áá row_ver ááŠá³ goods. ášá á (ášááááªá«á ášáááᥠááá áá), ášáá«á á¥áá° á¥áááµá³áá row_ver áá®. á ááá á á áá°á± ááµá¥ á á°á áá°á á©á áá€á áá á«áá ááá ášá°ááá áá áášá ášáᜠá áᜠááášáµ á¥áášáááááᢠá á¥á«áá³áá± áµááááœ, ášá°áá ááá ááᥠáá° á°áá¢á ášá á«á£á¢ áŠá³ á¥ááµááá ááá á¥á á¥áŽá±á á¥ááááááá row_ver (á á áá ááµá¥ row_ver á¥á á á°áááá row_ver) - áááá ááá°á± row_ver ášá°á«áá ášáášášá»á ááµáá.
á á áá£á áááá ááášáášá (á áá®áá«á ááµá¥ áµá
á°áµ ášá°áá áš) áááá± while áá°á« ááœáá for:
for _ = 1, max_req do ...
á°áá£á©á á áááá áááá«áµ sync_goods ááá°áµ goods á°áá£á© ášááá ášá áá áááá¥áµ ášá
áᥠáá áµáªá¶áœá áááá goods ááá© ááµá¥.
á ááᜠá¥áá°áá³ášá, ášááᥠáá°ášá á áá
ááááµ áá°á«á á ááœáá. á¥áá°áá
á áááµ ááááµ á«á, ášáµášá ááááµ áá áá ááœáá. áá° áŠá³ á«áá goods á¡áá«á ááµá is_deleted á¥á áááá¥á á á á«á ášáá°ášá ááá
ááá«á áµášáá á¥áá áááá - ášááµá ááá á¥ááµááá£ááᢠis_deleted áá° áµááá true. á áá³ááµ áá ášáŠáá«á ááµá ááá
is_deleted áá³áá ááá áá ášá áá á áẠáá deleted, áá
á ášáááá¡ áááá«á³á áµášá áá-á°ááµ á«ášáá»á. á áááá®á á áá°ášáá á«á°ášá á áá, ááá°ášá ááááµ ášá°á°ášáá áµ áááᥠášááá© áá° ááµášá»á (ášáá á á°ááážá ááá áá°ášáµ) áá°áááá.
á
á°á á°ášá°á row_ver ášááᜠáŠá³áᜠáášáá áááµá°ááá á¥á
á áá ááá ááœáá: áá¥á«áá³áá± ášáá°ááá áŠá³ ášá°ááš á
á°á á°ášá°á ááá á á á«áµáááá.
Tarantool DBMS á á áá áá á áá°áá áªá«áᜠááµá¥ á£á ášáá°á á°ášá ášááᥠáá£ááµ áá€á³á ááááµá á°áááá°ááá¢
ááá¶áœ
- Tarantool DBMS ášáá°á áááµ á«áážá áá°áá áªá«ááœá áááá á ášááµá¥á£ á°áµá á°áª áááµ ááá¢
- ášášáá°á á°ášá ášááᥠáá£ááµ ášáá á°á á°ášá áá£ááµ ááá á áá«á³ á¥á áᜠá ááµá¢
- á á ááá¹ ááµá¥ ášá°á¥á«á«á ášášáá°á á°ášá ášáá£ááµ áᎠášáášášá»á ášáááᥠááá áá á áá ášá°áášá©áµá ááááŠáœ á¥á» á ááµá°ááá ášá°ááááá ááᥠáá á áááááµ á«áµáœááá³áá¢
ááá: hab.com
