αα½ααααΈ αααα»ααααα»ααααααΎααααααα·ααΈαααααΆαα DBMS
ααΆαα’αΆααααααααΆααΆαααΆααα! (β¦aka ααΌαααΈαααΆαααΆαα½αααΆααααααα)
ααΆααα’ααααΆαααΎααααΎα±αα Tarantool ααααΆαααΆαααα·ααΆαααα½αα±ααααΆααααΆααααααΆαααααααΎααααααα·ααΈαααα»αααααααααααααΎαααΆαααΆαα½αααΌαααααΆααα·ααααααα αα
αααα»ααααααα·ααΈαααααα ααΆααΉαααΆααααΆααααααΌαααΆααααααΆααααΆαα
αααααα·ααααααα
ααΌα
αααααΆααααααΆααααΆαααΎ Tarantool ααΆαααααΆααααααΆαα½αααΌαααΆαα
αααααα·ααααααα αααααΆαααααααααα·ααααα·ααΆαααααααΆααΊααΎααααΈααααα·ααααα·ααΆαααααΆαααααααααΎααΆαα
ααααααααα·ααααα·ααΆαααΆααα’αααααααΆααα
αααα»α master log (WAL) α ααΆααααααΆααΆαα
αααααααααα (ααΎαααΉαα α
ααΆααααααααα αααα·αβααΆα) ααααΌαβααΆαβααααΎβααΎααααΈβααΆααΆβααΈβααΆαβα’ααα±αβααα α»αβααααβαααααα·ααΈ αα·α/α¬βααΎααααΈβα
ααα
αΆαβααΆαβα’αΆαβαααΆαβααααΆααβα
αααααα
α’ααααα 1. ααΆαα
αααααα
αααα»αα
ααααααα½αα
α§ααΆα αααααααααΆααΈαααΌαααα½ααα½αααΉαααααΌαααΆαααααααα·αααααααααααΆααααααΎααα αααα»αααΌαααααΆααα·αααααααα½ααα ααΆααααΌαααααΆααα·αααααααα½ααααααααααααααΆααααααΎαααΆα/αααα½ααα·αα·αααα αααα»αααααΈα α»αααααα αααααααααΆαααΆααααα½αααΆαααααααα ααααΆααααΌαααααΎ ααααα·αααααα ααΆαα αααα - ααΆαα αααααα·αααααααα ααααα·ααααααα·ααααΆα’αΆααΈααααααααααα·ααΈα ααΆαααααα ααΎααα·αααααΎαααααααααΆααααααααααα½α ααΆααααα αααααΆααααααΎαα‘αΎααα αααα»α DBMS αα ααα»ααααα’αα»ααααααΆαα ααααααααααα½αα―ααα αααα»ααααααα·ααΈαααααΎααααα»ααααααΎαα αα·ααΈααΆααααααααααΆαααΆαααα»ααααααααα· αα·ααα»ααα·ααααα·α α αΌαααΆααααααΈαα»ααααααααα·α
1. ααΆααααααα ααΆα αααα
- α’αααβαα·αβα’αΆα βαααααβαα·ααααααβααΆααβα’ααβααΆαβαα ααα»ααααβααΆαβααβαα½αβαααααβααα»ααααα (α§ααΆα ααα α’αααβα’αΆα βαααααβααΆαβααβααΆααΆαβαααα αα½αβααβαααα α¬βαααααααααΆβααααβααΆβαααβααααΌαβααΉαβααααααβαα·αα·α ααααβααΆααααΆααβαα½α);
- αα·αααΌα ααΆαα ααααααααα·αααΆα αααααααΌαααΆαα’αα»ααααααΆαααααααααΆαααααα»αααααααα’ααααΆα (α’αα»αααααααα»ααααααα αα α»αααααααα Tarantool - 1.10) α¬ααααΎααααΆααααα (ααΎααααΈα’αα»αααααα αααα»ααααααααααααααΆαααα Tarantool) αααα ααΆαα ααααααααα·ααααααα’αΆα ααααΌαααΆαα’αα»αααααα αααα»ααααα (α§α αααααα·ααΈααααΌαααααΎααααΆααααααα·αααααα - αα·ααααααααααααααΆααααααΌααααααΆααααααΆαααΆαααα’αΆααααα»αααΆαα αααααααααΆααααΈαααααααααααΆααααααΌααααααΆααααΎαα‘αΎαα
- ααααα·αααΎαααααααααΆααΆαααααΆααααααΌαα αααΎααα α’αααα’αΆα αααααααΆαααααααα α»αααααααααα»αααααααΆ (αα·αααΌα ααΆαα ααααααααα·αααΆα αααααΆαααααΆααααααΌαααΆααα’αααααααΆαααααΎα‘αΎααα ααΎααααΉαααααΌαααΆαα αΆααα‘αΎααα·αααΆαααααααααΆαααα ααΎααΆαα αααα)α
2. αα·αααΆαααΆαααααΆααααα»αααΆαα’αα»ααααααΆαααααΆααααααΌα HTTP αααα’αα»ααααΆαα±ααα’αααααααΎααααΆαααααααΌαααααΆααα·ααααααααΈα ααααΆαα
α’ααααα 2. ααΆαα
ααααααΆα HTTP
3. αα ααΆααααααααααΌαααααΆααα·αααααααααΆααα·αααααααααααααΌαααΆαααααααα·αααααΌαααΌα ααααΆαα (ααΎαααΈααααα ααα αα αααα»αααααΈααΌαα ααΆαααααΆααα’αΆα ααααΎ DBMSs αααααααααΆ ααΆααΆααααααααααα·ααΈ αααα·ααΆααα)α
α’ααααα 3. ααΆαα
αααααα
αααα»ααααααααααααααΌα
αα»ααα·ααααα·ααΊααΆααΆααααα ααΆαααααααααααα·ααΈααΊαα·ααΆα/α αααΆαα αααΎαααΆαααΆαααααα α αΎααααα½αα±ααααΆαααααααα»αααΆααααααααΆααααααΆαα½αααΆααααα α’αααααΉαααααΌαα’αα»ααααααααααα½αα―αα
ααααα·αααΎαα αααα»αααααΆαααΆαααααα’ααα αα»ααααααααα·ααΆαααΎααΆαααΆααααααΆαα (α¬ααΆααααααααα αΆαααΆα α) αααααΆααα ααα»αααααα»αααΆαααααΎααΆαα ααααααααα·ααααααα ααΌααααα‘ααααΎααα·ααΈααΆα αααΎαααΎααααΈα’αα»ααααααΆαα αααααα·ααααααααααα·αααααααα αααα»α Tarantool DBMS α
ααΆαααΆαααααααα ααΆα ααα
ααΌα αααα αα»ααααααααα·αα½αααααΆαα ααααααααα·ααααααααΊααΆααααααα ααΆα αααα ααΎααααΈα±ααα’ααααααααααααααααααΌαααΆααααααα αααΆααααααα ααΆα αΆαααΆα ααααα»αααΆαααααα½αα’αααααααΆαααα·αααααααααααΆαααααααααα»αα’αα‘α»ααααααααααααΆααααααΌαααΈαα½ααα ααΆααΆααα·αααΆαα ααΎααα·ααα½αααααα ααΆαα α α»ααααα αααααααα α’αααααα½ααα·ααααααααααΌαααααααΎααααΆαααααααΆαα½αααααα (αααΆαα αα ααΆαααααααΆααααααααααα·αααααααααααΆαααααααααΉαααΆαα αααα)α
ααΎααααΎααΌα
ααααα
ααΎααααΈααΆαααααααα
ααα½ααα·αααααααααααΆααααααααα‘α»ααααα
ααααααααα·αααααα? αααααααααΆαααααααα½αα’αΆα
ααΆααΆαααααΎαααΎααα·ααααααααΆαααΆαααα·α
αααα αα·ααααααααΆα ααΎααααΈααααΎααΌα
αααα’αααα’αΆα
ααααΎααΆαααΆαααα·α
αααααααααΆααα½α
α αΎααα
αααα»αααΆααΆα (ααααα·αααΎααΆααΆα) α α§ααΆα ααα α―αααΆα "αααααΆαα·α" α’αΆα
ααΆαααΆα "αααααααΆααααα·ααααα·ααΆααααααΆαα·ααααααααΌαααΆα" - delivery_time
. αααα αΆααΆαα½αααΉααααααααααΆααααααΊααΆααααααα
αααα»αααΆαααααα·αα
αΆαααΆα
ααα
αααα»αααααΆαααααααααΌαααααΆαα
ααΉαααΆααααααΎαααΆααααααΆαα·ααααααα ααΌα
ααααααΎααα·αα’αΆα
α
αΆααααααααΆαα’αα·ααααΆααΆαααα delivery_time
αααααΌααααα»αα’αα‘α»ααααααααααααΆααααααΌααα»α α αΎααααα»αα’αα‘α»ααααααααααααΆααααααΌααααααΆαα ααΌαααααΎαααΎααααααααααΆααΆααα’ααααΆαα½αααΉααααααααΆααααααααΆα delivery_time
. αααααααααΆαααααΆααααααααΆαααΆαααΆαα’αΆα
ααααΌαααΆααααααααααΆαααααααααΆααααααΌα delivery_time
. ααΌα
ααααΆαααααααα ααΆααααααΆαα·αα’αΆα
ααΆαααΆαααααΆααααααΌα ααααααααΆαααΆααααααααΈ ααΆαα·ααααααΆααααααα·ααααααααα delivery_time
. αααα»αααααΈααΆααααΈα ααΆαααααΆααααααΌαααΉααα·αααααΌαααΆααααααααΈααααααα
αα·ααα
αααααα ααΎααααΈαααααααΆααααα αΆααΆαααααααΎαααΉαααααΌαααΆαααααααα·αααααα "αααα½ααααΈααααΆ" α ααΆαααααα αααα»αααααααααΆααααααΌαααΈαα½αα ααΎαααΉαααααααα·ααααααααΆααα’ααααΆαα½αααΉααααααααΆα delivery_time
ααΎαααΈα
ααα»α
αα½αα
ααα½αααΆαααΈα’ααΈαααΆα (α§ααΆα ααα N ααααα
αΆααααΈααααα
αα
α»αααααα)α αααααΆαααΆαααΆααααα ααΆα
αααΆααααΆααααΆαααααΆαααααααααααα αα·ααΈααΆααααααααααΊαα·αααααΎαααααα
αααΎα α αΎαα’αΆα
ααΆαααααααααΆααααααα
ααΆα
ααααααααΎααααα»αααααΆααΆαααΎααααΈααααΆαα’αααΈαααα ααΎαααΈααα ααΆααΆαααααααα»ααααααα’αΆα
αα·αααΆαααΆααααααααΆααααΆαα½αααΆαααα·α
ααααα
αααααααααΆααα½ααααααααααα»αααααΆαααΆααααα»αααααααααααααΆαα’αα»ααααααΊααΆαααα½αααααΆααααΆαααα½ααα·ααααααα αααα»αααααΈααααααα»αα’αα‘α»ααααααααααααααΆααααααΌαααΈαα½αα αα·ααααααααΆααα’ααααααΌαααΆααααααΌα αααααΆααααααααα·αααααΌαααΆααααααΆαααααα’αααααα½αα ααΎααααΈα’αα»ααααααΆ α’αααααΉαααααΌααααααααα½ααα Boolean αα
αααα»αααΆααΆαααααα (α§ααΆα ααα is_transferred
) ααααα·αααΎα’αααααα½αααα½αααααΆααααΆαααα½ααααααααααΆ ααΆααααααααΌαααααΆααααααα true
αααααΆααααΈααα ααΆαα»α
αΌααααααΆααααααααααα»αααΆαααααΆααααααΌαα αααααΎαααααΆαα’αα»αααααααααΆααα»ααα·ααααα·ααΌα
ααΆααααααα ααΆααααΌα αααααΆααααΆαααααααααααααααΆααΈαα½αα ααΆαααα½αααααΆααααααΌααααααααΎα αα·αααααΎα αα·ααΆαα±ααα
ααα
αααα’αΆα
αααααααααα
ααΉαααΆαααΎαα‘αΎαααααααααα
ααα½ααα·αααααααααααΆαααααα αα·αααΆαα±ααααΎαα‘αΎαααααααααα
ααα½αααΆαααααΎααααΎααα
ααα ααΈααΈα ααααΆαααααααΆαααααΆαααααΎαααααααααΆααΌα
ααααΆαα
ααΆααα’αααααα½ααα½αα
ααα½ααα (α’αααααα½αααΈαα½ααααααα½αααΉααααααΆααααΆαααα½αααααααα½αα―α αα·ααααααΆααα’αααααααααααααΆααα’αα)α
αα·ααΈααΆαααααααααα·αααΆααα»ααα·ααααα·αααααΆααααααα±ααααΆαααΎααΊααΎααααΈαααααααα½ααααα½ααα
ααΆααΆααααααΆααααααααΎααααΈααΆαααΆαααΆαααααΆααααααΌααα
αααα»ααα½ααααααααααΆα αα½αααααααααα’αΆα
ααΆααααααααΆαααα·α
αααα α αΎαααααΌαααααααα/ααααΎαα
αα
α»ααααααααΆαααααααααα·ααΈαα
αααααααΆαα
αα
α»αααααα ααΆαααααααααααααααααΆααααΌαααΆααααααα/ααααΆααααααΌα (α’αΆααΌαααΆαα½αααΆααααααα/ααΆαααααΆααααααΌα)α ααΆα§ααΆα αααααΌαα α
αα½ααα update_time
. ααααααααΆαα»ααααααααΆαα’αα·ααααΆαααα½αααααααααααΆαααααααααααΆαααααΆαααααα ααΎαα’αΆα
α
αΆααααααΎαααααααααΆααααααΌααααααΆααααΆαα½αααΉααααααααα (ααααΎαααΎααααααααααΆααΆαα½αααΉααααααααΆα update_time
ααΎαααΈααααααααααΆααααααΆαα»αααΈαα»α)α αααα αΆααΆαα½αααΉααα·ααΈααΆαααααα
α»ααααααααΊααΆααΆαααααΆααααααΌααα·ααααααα’αΆα
ααΎαα‘αΎαααΆααΆα
αα ααΆαααααααααααααααΆααα
αααα»ααα½ααα update_time
αααα ααααΆαα·ααααααααα ααΌα
αααα αα½αβααβαααβαα·αβα’αΆα
βααααΌαβααΆαβααααΎβαααααΆααβααααααβαα·ααααααβααΆβααααα (αα½αβαααααβαααβααααα) ααα ααΎααααΈαααα αΆααα·ααααααααΆαααααα α’αααααΉαααααΌααααααΎαααααααΆααααααα αααααααααΆααΆαααααα·αααααΆαααΆααααα»α (α§ααΆα ααα ααΆαααΆαααααΈααΌαααααΆααα·αααααα ααΆαααααααααααΆααΆαα½αααΉαααααα update_time
αααααααΆαα
ααα½ααααααΆααααααα±αα αα·αααα·αα
ααα½αααΆααααΆαααααααααααααΆ αααα
αΆααααααΎαααΈα’α»α αααα·αααΆααααΆαααα½αα
αΆααααΈααΎαααααΌ)α
α’αααα’αΆα
αααααΎαααααα·αααααΆαααααΆαααααααα·αααααααααααααΎα±αααααααΎαα‘αΎαααααα·α
ααΌααα·ααΈααΆαααααααΈαα»αα ααΎααααΈααααΎααΌα
αααααΎαααΉαααααΎααααααα
ααα½αααα (α
ααα½ααααααα) ααΆαααααααΆααα½ααααααααΆααααΆαααΆαααΆαααααΆααααααΌαα α
αΌαααΎαααΆααααααααα½ααα row_ver
. αααααααΆααααα½αααααααα
ααααααΌαααααα/ααααΎαα
αα
α»ααααααααΆαααΆαααααααααααααααααΆααααΌαααΆααααααΎα/ααααααα ααα»αααααααα»αααααΈααα ααΆαααΉααα·αααααΌαααΆααααααααΆαααα·α
αααα-αααααααΆαα
αα
α»αααααααα ααα»αααααααααααααΆαααΆαααα½αα
ααα½αααΎαα‘αΎαααααα½αα ααΆαααααααα½ααα row_ver
ααΉαααΆαααααααααα½αααα α αΎαα’αΆα
ααααΌαααΆαααααΎαα·αααααΉαααααΎααααΈαααα αΆααα·αααααα "ααΈαααα" (αα·αααααααααααα/ααααΆααααααΌαα
αΆααααΆααααΈα
α»ααααα
ααααααααααααΆααααααΌααα»α) ααα»αααααααααΆαααααααααΆαα
ααΆααααααααΆαααΆαααα αα·αααΆαααααα·αααααΆααααααα
αα·ααΈααΆααααααααααΆαααααΎα α»ααααααααααΆαααααα½αα’αααααααΆαααα·αααααααααααΆαααααααααα»ααααααααααααααΆαα ααααααααα·ααααααα αΆααααΌα ααΆαααα»αααα’αααα»α αα·αααΆααααααα»αα ααΌααααα‘ααααΎαααΆα±ααααΆαααααααα’α·αα
ααΆααααααΌααα·αααααααααααααΎα§αααααααΆαααααααα½α
ααΆαα’αα»ααααααααααααΆαααΈααα/αα
αα
αααα»α MS SQL Server ααΆααααααααα½ααααα·αααααΎααααΈα’αα»αααααα·ααΈααΆαααααααα - rowversion
. ααΌαααααΆααα·ααααααααΈαα½ααααΆαααααααααααΎαα‘αΎααα½αααΆαααααααααααααααααΆααααΌαααΆααααααα/ααααΆααααααΌααα
αααα»αααΆααΆααααααΆααα½αααααΌα
rowversion
. αααααααααΆαααΆαααααααααΌαααΆαααααααααααααααααααααα·αα
ααΆααααα½αααααααα
αααα»ααααααααααΆαααααα/ααααΆααααααΌαα Tarantool DBMS αα·αααΆαααααααΆααααααΎαααααααααααΆααα αααααΆαααΆαααΆααααααα
αααα»α Tarantool ααΆαα·ααα·ααΆααααα»αααΆαα’αα»ααααααΆαααααααα ααΌααααα‘ααααΎαααααααααααααααΌαααΆαααααΎα
ααΈαα½αααΆααααααααααΌα αα½αα ααΆααΆααα αααα»α Tarantool ααααΌαααΆαααα α ααΆααα α αΎααααααααααΆααααΌαααΆαααα α ααΆ tuples α αα αααα»α Tarantool α’αααα’αΆα αααααΎαααααΆααα ααααΆααααΊααααΆαα’αααΈαααα ααΈααααααααΆαααΈααααααΎααααααααα ααα½αααααααααΆααααααΆα ααΆαααααα αααααΊααΆα’αααΈαααααΎαααααΌαααΆααααααΆαααααααααααααααΎαα ααΆαααααααααααΎαααΉααααααΎαααααΆααααααααα
αα»ααααα’αα»ααααααααα·ααααα·ααΆαααΌαααααΆααα·ααααααααΆαα½ααα αααα»α Tarantool α’αααααααΌαααααΎαααΆαααΆααααααααΆααΆααααααα
box.cfg{}
ααΆαααααα Tarantool ααΉαα αΆααααααΎααααααααΌαααααααΌαααααΆααα·αααααα αα·ααααααα ααα»ααααα·ααααα·ααΆααα ααΆαααααα αα α»ααααααα
ααααααααΎαααααΆαα row_version
:
box.schema.sequence.create('row_version',
{ if_not_exists = true })
αααααΎα if_not_exists
α’αα»ααααΆαα±ααααααααΈααααααΎαααααΌαααΆαααααα·ααααα·α
αααΎαααα ααααα·αααΎααΆαααααα»ααα Tarantool ααΉααα·αααααΆααΆααααααΎαααΆαααααααααα αααααΎααααααΉαααααΌαααΆαααααΎαα
αααα»αααΆααααααααΆ DDL ααΆαααααααααΆααααΆααα’ααα
α αΌαααΎααααααΎαααα ααΆα§ααΆα αααα
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
. αααααααΌαααΆαααΆαααα
αααααΆααααα·αααααααα
αααα»αααα ααααΆααααααΌα (αααααΆαα tuple ααΈαα½ααααααααααααααΆαααααααΆαααααΆααααααΌα αα»αααΆααααααααΌαααΆαα
αΆααααααΎα)α αα·αβααΌα
on_replace
, before_replace
-triggers α’αα»ααααΆαα±ααα’ααααααααααα·αααααααα tuple ααα trigger ααααΌαααΆαααααα·ααααα·α ααΌα
ααααα αΎα ααααααα
α»ααααααααααΆααααααΆαααααΉαααΎαα
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}
αααααΆααα ααΆαααΈαα½αααΊααΆααααααααααΎααααααααααααααααα· ααΎαα α»α
nil αααα½ααα·αα Tarantool ααΉααααα½αααααααααααΆαααααααααααααααααα·α ααααααααααΆαααααα ααΆαααααααααΆααα½ααα row_ver
α’αααα’αΆα
ααααααΆαα Nil - α¬αα·ααααααΆαααααααααΆααααααα ααΈααααα αα½ααααααααΆααααΆααααΈααΆααα
α»αααααααα
αααα»αααα α
ααααα·αα·αααααΎααααααααααα αΌαα
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
ααΎααααΈααα½ααα·αααααααααααΆαααααΆααααααΌαα αααααα Iterator ααΊ GT (ααααΆα ααααΆα)α αααβααΆαβαααβααΆβα’αααβααααΎβααΆαβαααα½αβαα·αα·αααβααΆαβααααΆααβαααααβαααααβαα·αα·ααααβαααβα
αΆααβααααΎαβααΈβααααΆααβα
α»α
βαααβααΆαβαααα (αααααβααΆα row_ver
).
α§ααααααααααα
αααααααα‘αα tuples α ααΎααααΈα’αΆα
ααααααα·ααααααααΆαααααααααΆααααΆαααα HTTP ααΆα
αΆαααΆα
ααααα»αααΆαααααααα tuples αα
ααΆαα
ααΆαααααααααααααΆααααα½ααααααΆαα serialization ααΆαααααααααΆααα α§ααΆα αααααααΎαα»αααΆααααααααΆααααααΆααααΆααααα 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 α ααΎααααΈααααΎααΌα
ααααααΆα ααΎαααααΌαααΆααααααΆααααααα’αα»αααααααΆαααΈαααααα HTTP α αααααΆααααΆαααααααααα»ααααααΆααα αα·αααααΎα±αααααΆαααΈαααααα HTTP ααααΆααα
local http_client = require('http.client').new()
ααΎαααααααΌαααΆααααααΆααααααααΆαα json deserializationα
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
αα»αααΆαα’αα»ααααααααΎ HTTP αα
α’αΆααααααΆα url α αΎαααααΎααΆα row_ver
ααΆβαααΆαααΆααααααβαα½α α αΎαβαααα‘ααβαααααα deserialized ααβααααΎα
αα»αααΆααααααΆαααααααΆαα»ααα·αααααααααααΆαααα½αααΎααα ααΌα αααα
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
ααΌαααα αααααΆαααα
αααα»ααααα ααΎαα’αα»ααααααΆαααΆααααα½αααααααααααααααααα·αααααααααααΆαααααΆααααααΌαααΈααααααα
url αααααΆααααααΆααα αα
αααααααΎαααααααααΈαα½αα ααΎααααααΆαα»ααα·αααααααααααα½αααΆααα
ααααααααααααααα»αααααααααααα α αΎαααααΎαα
αα
α»ααααααααΆαααααα 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 ααΊααΆααα·ααααααα½αα±ααααΆααααΆα αα·ααααααααααααΆααααΆααααααΎααααααα·ααΈαααααΆαααααα»ααααααα
- ααΆαα αααααα·ααααααααααα·ααααααααΆααα»ααααααααα·αα½αα ααα½αααΎααΆαα αααααα·ααααααααααα·αααΆαα
- αα·ααΈααΆαααααα ααααααααα·αααααααααααΆααα·ααΆααααΆαα αααα»αα’αααααα’αα»ααααΆαα±ααα’αααααΆαααααααα ααα½ααα·αααααααααααΆαααααααααααααααααααααααααΆααΆααααααααααΆαααααΆααααααΌαα αΆααααΆααααΈααααααααΆααααααΌαα α»ααααααα
ααααα: www.habr.com