Lưu trữ khóa-giá trị là một loại CSDL NoSQL (Not Only SQL). Nó có hình thức đơn giản là một bảng với hai cột tương ứng với hai trường là khóa và giá trị. Kiểu của giá trị là chuỗi/nhị phân hoặc cấu trúc. Kiểu của khóa có thể là số nguyên hoặc chuỗi/nhị phân. Có nhiều triển khai và thiết kế lưu trữ khóa-giá trị bao gồm cả dựa trên bộ nhớ và trên đĩa. Lưu trữ khóa-giá trị dựa trên bộ nhớ thường được sử dụng để lưu trữ dữ liệu đệm, lưu trữ khóa-giá trị trên đĩa được sử dụng để lưu trữ dữ liệu vĩnh viễn trong hệ thống tệp. Một thư viện lưu trữ khóa-giá trị được viết bởi tác giả ThanhNT gọi là OpenStars [59]. OpenStars hỗ trợ nhiều CSDL khóa-giá trị như LevelDB [80], RockDB [86], Kyoto Cabinet, ZDB [72]...
1.4.5.1. Cấu trúc OpenStars
CSDL OpenStars sử dụng một số lớp trừu tượng để cung cấp truy cập lớp cụ thể như leveldb, rocksdb, ZDB [72]. Lớp AbstractKVStorage là lớp cơ sở, định nghĩa hàm get(), put(), multiget(), multiput(), remove() để ghi hoặc lấy dữ liệu. Các lớp kế thừa từ lớp này sẽ xử lý các hoạt động dữ liệu của lưu trữ khóa-giá trị. Lớp AbstractCursor là con trỏ cơ sở, con trỏ này trỏ đến từng bản ghi của CSDL. LớpKVStorageFactory sử dụng để tạoAbstractKVStorage dựa trên chuỗi tùy chọn cụ thể.
Hình 1.4 mô tả các lớp của CSDL khóa-giá trị. Ta sử dụng KVStorage- Factory để tạo một thể hiện của AbstractKVStorage, truyền tham số đầu vào
Hình 1.4: Mô hình lớp của OpenStars [59]
cho hàm tạo của KVStorageFactory là một chuỗi cụ thể. Các nhà phát triển chỉ thực hiện trên AbstractKVStorage để xử lý với CSDL khóa-giá trị. Lưu trữ khóa-giá trị có thể được phục vụ với một dịch vụ phụ trợ từ xa. Chúng ta có thể đọc và ghi dữ liệu từ xa bằng cách sử dụng RemoteKVStorage. 1.4.5.2. Triển khai API OpenStars
Chúng ta có thể sử dụng kiểu của CSDL khóa-giá trị bằng cách truyền tham số qua chuỗi configString để khởi tạo CSDL. Cụ thể: AbstractKVStorage* database = factory.createStorage(configString, name, rwmode);
Sau khi khởi tạo CSDL, chúng ta có thể đọc và ghi dữ liệu bằng cách gọi các hàm put và get như sau:
string sVal ; string sKey;
//Đọc dữ liệu từ CSDL database->get (sVal, sKey); //Ghi dữ liệu vào CSDL database->put(sVal,sKey);