ืฉืืื, ืื ื ืืืฆืจ ืืืฉืืืื ืขืืืจ DBMS
ืืจืืืฉื ืืช ืืขืืฆืื! (...aka ืชืื ื ืืืืืฆืืข)
ืื ืืืืืจ ืืขืื ืืืคื ืืช Tarantool ืืคืืืคืืจืื ืืืจืงืืืืืช ืืืฆืืจืช ืืืฉืืืื ืืขืืืก ืืืื ืฉืขืืืืื ืขื ืืกืื ื ืชืื ืื. ืืืืฉืืืื ืืืื, ืืขืชืื ืงืจืืืืช ืืฉ ืฆืืจื ืืฉืืคืื ื ืชืื ืื.
ืืคื ืฉืืืืืจ ืืขืื, ื-Tarantool ืืฉ ืฉืืคืื ื ืชืื ืื ืืืื ื. ืขืงืจืื ืืคืขืืื ืฉืื ืืื ืืืฆืข ืืจืฆืฃ ืขื ืืขืชืงืื ืืช ืื ืืขืกืงืืืช ืืืืืืืช ืืืืื ืืจืืฉื (WAL). ืืืจื ืืื ืฉืืคืื ืืื (ื ืงืจื ืืื ืขืื ืจืื ื ืืืื) ืืฉืืฉ ืืืืืืช ืกืืืื ืืช ืชืงืืืช ืืืคืืืงืฆืื ื/ืื ืืคืืืืจ ืขืืืก ืืงืจืืื ืืื ืฆืืชื ืืฉืืื.
ืืืจื. 1. ืฉืืคืื ืืชืื ืืฉืืื
ืืืืื ืืชืจืืืฉ ืืืืคื ืชืืื ืืขืืจืช ื ืชืื ืื ืฉื ืืฆืจื ืืืกื ื ืชืื ืื ืืื ืืืกื ื ืชืื ืื ืืืจ ืืฆืืจื ืขืืืื/ื ืืืืจ. ืืืงืจื ืืืืจืื, ืคืชืจืื ื ืื ืืืชืจ ืขืฉืื ืืืืืช ืฉืืืืฉ ืจืื ืืืืื ืฉืืคืื - ืฉืืคืื ื ืชืื ืื ืืจืืช ืืืืืืงื ืืขืกืงืืช ืฉื ืืืคืืืงืฆืื. ืึธืึตื. ืื ืื ื ืื ืืฉืชืืฉืื ืืคืชืจืื ืืืื ืืืืื ื ื-DBMS, ืืื ืืืืฉืืื ืจืคืืืงืฆืื ืืขืฆืื ื ืืชืื ืืืคืืืงืฆืื ืฉืื ื ืืคืชืืื. ืืืืฉื ืื ืืฉ ืื ืืชืจืื ืืช ืืื ืืกืจืื ืืช. ืืืื ื ืื ื ืืช ืืืชืจืื ืืช.
1. ืืืกืืื ืืชื ืืขื:
- ืื ื ืืชื ืืืขืืืจ ืืช ืื ืื ืชืื ืื, ืืื ืจืง ืืืง ืืื (ืืืืืื, ื ืืชื ืืืขืืืจ ืจืง ืืืง ืืืืืืืืช, ืืืง ืืืขืืืืืช ืื ืืจืฉืืืืช ืฉืืื ืืขืืืืืช ืืงืจืืืจืืื ืืกืืื);
- ืื ืืืื ืืฉืืคืื ืืจืื ื ืืืื, ืืืชืืฆืขืช ืืืืคื ืจืฆืืฃ ืืืฆื ืืกืื ืืจืื ื (ืืืืฉื ืืืจืกื ืื ืืืืืช ืฉื Tarantool - 1.10) ืื ืกืื ืืจืื ื (ืฉืืืืฉื ืืืจืกืืืช ืืืืืช ืฉื Tarantool), ื ืืชื ืืืฆืข ืฉืืคืื ืืจืื ืืืืื ืืกืฉื ืื (ืืืืืจ, ืืืคืืืงืฆืื ืืกื ืืจื ืช ืชืืืื ืืช ืื ืชืื ืื - ื ืชืื ื ืืคืขืื ืฉื ืืืืคื, ืืืืจ ืืื ืืฉ ืืคืกืงื ืืฉืืคืื, ืืืืืจ ืืื ืืชืจืืฉืช ืืคืืืฉื ืืืื ืฉื ืืืืคื ืืื');
- ืื ืจืฉืืื ืืฉืชื ืชื ืืกืคืจ ืคืขืืื, ืืชื ืืืื ืืืขืืืจ ืจืง ืืช ืืืจืกื ืืืืจืื ื ืฉืื (ืื ืืืื ืืฉืืคืื ืืจืื ื ืืืื, ืฉืื ืื ืืฉืื ืืืื ืฉื ืขืฉื ืืืืกืืจ ืืืฉืืขื ืืจืฆืฃ ืขื ืืืขืชืงืื).
2. ืืื ืงืฉืืื ืืืืฉืื ืืืืืคื HTTP, ืืืืคืฉืจืื ืืกื ืืจื ืืกืื ื ืชืื ืื ืืจืืืงืื.
ืืืจื. 2. ืฉืืคืื ืขื HTTP
3. ืืื ื ืืกื ืื ืชืื ืื ืฉืืื ืืื ืืืขืืจืื ื ืชืื ืื ืืื ื ืืืืืื ืืืืืช ืืืื (ืืชืจ ืขื ืื, ืืืงืจื ืืืืื, ื ืืชื ืืคืืื ืืืฉืชืืฉ ื-DBMS, ืฉืคืืช ืชืื ืืช, ืคืืืคืืจืืืช ืืื').
ืืืจื. 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 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
-ืืจืืืจืื ืืืคืฉืจืื ืื ืืฉื ืืช ืืช ืื ืชืื ืื ืฉื ื-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
).
ืืืืืจืืืจ ืืืืืจ tuples. ืขื ืื ืช ืฉื ืืชื ืืืื ืืืขืืืจ ื ืชืื ืื ืืืืฆืขืืช HTTP ืืืืจ ืืื, ืืฉ ืฆืืจื ืืืืืจ ืืช ื-tuples ืืืื ื ื ืื ืืืกืืจื ืืืืจ ืืื. ืืืืืื ืืฉืชืืฉืช ืืคืื ืงืฆืื ืืกืื ืืจืืืช ืืฉื ืื 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:
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
ืืคืจืืืจ ืืืืืืจ ืืช ืืชืืฆืื ืืืจืืกืงืช ืฉื ืืืงืฉื.
ืืคืื ืงืฆืื ืืฉืืืจืช ื ืชืื ืื ืฉืืชืงืืื ื ืจืืืช ืื:
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