5679107b07
Summary: Completed the implementation for the Redis API for Lists. The Redis API uses rocksdb as a backend to persistently store maps from key->list. It supports basic operations for appending, inserting, pushing, popping, and accessing a list, given its key. Test Plan: - Compile with: make redis_test - Test with: ./redis_test - Run all unit tests (for all rocksdb) with: make all check - To use an interactive REDIS client use: ./redis_test -m - To clean the database before use: ./redis_test -m -d Reviewers: haobo, dhruba, zshao Reviewed By: haobo CC: leveldb Differential Revision: https://reviews.facebook.net/D10833
105 lines
4.0 KiB
C++
105 lines
4.0 KiB
C++
/**
|
|
* A (persistent) Redis API built using the rocksdb backend.
|
|
* Implements Redis Lists as described on: http://redis.io/commands#list
|
|
*
|
|
* @throws All functions may throw a RedisListException
|
|
*
|
|
* @author Deon Nicholas (dnicholas@fb.com)
|
|
* Copyright 2013 Facebook
|
|
*/
|
|
|
|
#include <string>
|
|
#include "leveldb/db.h"
|
|
#include "redis_list_iterator.h"
|
|
#include "redis_list_exception.h"
|
|
|
|
namespace leveldb {
|
|
|
|
/// The Redis functionality (see http://redis.io/commands#list)
|
|
/// All functions may THROW a RedisListException
|
|
class RedisLists {
|
|
public: // Constructors / Destructors
|
|
/// Construct a new RedisLists database, with name/path of db.
|
|
/// Will clear the database on open iff destructive is true (default false).
|
|
/// Otherwise, it will restore saved changes.
|
|
/// May throw RedisListException
|
|
RedisLists(const std::string& db_path,
|
|
Options options, bool destructive = false);
|
|
|
|
public: // Accessors
|
|
/// The number of items in (list: key)
|
|
int Length(const std::string& key);
|
|
|
|
/// Search the list for the (index)'th item (0-based) in (list:key)
|
|
/// A negative index indicates: "from end-of-list"
|
|
/// If index is within range: return true, and return the value in *result.
|
|
/// If (index < -length OR index>=length), then index is out of range:
|
|
/// return false (and *result is left unchanged)
|
|
/// May throw RedisListException
|
|
bool Index(const std::string& key, int32_t index,
|
|
std::string* result);
|
|
|
|
/// Return (list: key)[first..last] (inclusive)
|
|
/// May throw RedisListException
|
|
std::vector<std::string> Range(const std::string& key,
|
|
int32_t first, int32_t last);
|
|
|
|
/// Prints the entire (list: key), for debugging.
|
|
void Print(const std::string& key);
|
|
|
|
public: // Insert/Update
|
|
/// Insert value before/after pivot in (list: key). Return the length.
|
|
/// May throw RedisListException
|
|
int InsertBefore(const std::string& key, const std::string& pivot,
|
|
const std::string& value);
|
|
int InsertAfter(const std::string& key, const std::string& pivot,
|
|
const std::string& value);
|
|
|
|
/// Push / Insert value at beginning/end of the list. Return the length.
|
|
/// May throw RedisListException
|
|
int PushLeft(const std::string& key, const std::string& value);
|
|
int PushRight(const std::string& key, const std::string& value);
|
|
|
|
/// Set (list: key)[idx] = val. Return true on success, false on fail
|
|
/// May throw RedisListException
|
|
bool Set(const std::string& key, int32_t index, const std::string& value);
|
|
|
|
public: // Delete / Remove / Pop / Trim
|
|
/// Trim (list: key) so that it will only contain the indices from start..stop
|
|
/// Returns true on success
|
|
/// May throw RedisListException
|
|
bool Trim(const std::string& key, int32_t start, int32_t stop);
|
|
|
|
/// If list is empty, return false and leave *result unchanged.
|
|
/// Else, remove the first/last elem, store it in *result, and return true
|
|
bool PopLeft(const std::string& key, std::string* result); // First
|
|
bool PopRight(const std::string& key, std::string* result); // Last
|
|
|
|
/// Remove the first (or last) num occurrences of value from the list (key)
|
|
/// Return the number of elements removed.
|
|
/// May throw RedisListException
|
|
int Remove(const std::string& key, int32_t num,
|
|
const std::string& value);
|
|
int RemoveFirst(const std::string& key, int32_t num,
|
|
const std::string& value);
|
|
int RemoveLast(const std::string& key, int32_t num,
|
|
const std::string& value);
|
|
|
|
private: // Private Functions
|
|
/// Calls InsertBefore or InsertAfter
|
|
int Insert(const std::string& key, const std::string& pivot,
|
|
const std::string& value, bool insert_after);
|
|
private:
|
|
std::string db_name_; // The actual database name/path
|
|
WriteOptions put_option_;
|
|
ReadOptions get_option_;
|
|
|
|
/// The backend rocksdb database.
|
|
/// Map : key --> list
|
|
/// where a list is a sequence of elements
|
|
/// and an element is a 4-byte integer (n), followed by n bytes of data
|
|
std::unique_ptr<DB> db_;
|
|
};
|
|
|
|
} // namespace leveldb
|