Version: v0.0.0-...-0df215e Latest Latest

This package is not in the latest version of its module.

Go to latest
Published: Jan 7, 2016 License: MIT Imports: 24 Imported by: 0



Package ledis is a high performance embedded NoSQL.

Ledis supports various data structure like kv, list, hash and zset like redis.

Other features include replication, data with a limited time-to-live.


First create a ledis instance before use:

l := ledis.Open(cfg)

cfg is a Config instance which contains configuration for ledis use, like DataDir (root directory for ledis working to store data).

After you create a ledis instance, you can select a DB to store you data:

db, _ := l.Select(0)

DB must be selected by a index, ledis supports only 16 databases, so the index range is [0-15].


KV is the most basic ledis type like any other key-value database.

err := db.Set(key, value)
value, err := db.Get(key)


List is simply lists of values, sorted by insertion order. You can push or pop value on the list head (left) or tail (right).

err := db.LPush(key, value1)
err := db.RPush(key, value2)
value1, err := db.LPop(key)
value2, err := db.RPop(key)


Hash is a map between fields and values.

n, err := db.HSet(key, field1, value1)
n, err := db.HSet(key, field2, value2)
value1, err := db.HGet(key, field1)
value2, err := db.HGet(key, field2)


ZSet is a sorted collections of values. Every member of zset is associated with score, a int64 value which used to sort, from smallest to greatest score. Members are unique, but score may be same.

n, err := db.ZAdd(key, ScorePair{score1, member1}, ScorePair{score2, member2})
ay, err := db.ZRangeByScore(key, minScore, maxScore, 0, -1)



View Source
const (
	KVName   = "KV"
	ListName = "LIST"
	HashName = "HASH"
	SetName  = "SET"
	ZSetName = "ZSET"
View Source
const (
	NoneType   byte = 0
	KVType     byte = 1
	HashType   byte = 2
	HSizeType  byte = 3
	ListType   byte = 4
	LMetaType  byte = 5
	ZSetType   byte = 6
	ZSizeType  byte = 7
	ZScoreType byte = 8
	// BitType     byte = 9
	// BitMetaType byte = 10
	SetType   byte = 11
	SSizeType byte = 12

		I make a big mistake about TTL time key format and have to use a new one (change 101 to 103).
		You must run the ledis-upgrade-ttl to upgrade db.
	ObsoleteExpTimeType byte = 101
	ExpMetaType         byte = 102
	ExpTimeType         byte = 103

	MetaType byte = 201

for backend store

View Source
const (
	MaxDatabases int = 10240

	//max key size
	MaxKeySize int = 1024

	//max hash field size
	MaxHashFieldSize int = 1024

	//max zset member size
	MaxZSetMemberSize int = 1024

	//max set member size
	MaxSetMemberSize int = 1024

	//max value size
	MaxValueSize int = 1024 * 1024 * 1024
View Source
const (
	BitAND = "and"
	BitOR  = "or"
	BitXOR = "xor"
	BitNot = "not"
View Source
const (
	UnionType byte = 51
	DiffType  byte = 52
	InterType byte = 53
View Source
const (
	MinScore     int64 = -1<<63 + 1
	MaxScore     int64 = 1<<63 - 1
	InvalidScore int64 = -1 << 63

	AggregateSum byte = 0
	AggregateMin byte = 1
	AggregateMax byte = 2
View Source
const Version = "0.5"


View Source
var (
	ErrScoreMiss     = errors.New("zset score miss")
	ErrWriteInROnly  = errors.New("write not support in readonly mode")
	ErrRplInRDWR     = errors.New("replication not support in read write mode")
	ErrRplNotSupport = errors.New("replication not support")
View Source
var (
	ErrLogMissed = errors.New("log is pured in server")
View Source
var (
	TypeName = map[byte]string{
		KVType:     "kv",
		HashType:   "hash",
		HSizeType:  "hsize",
		ListType:   "list",
		LMetaType:  "lmeta",
		ZSetType:   "zset",
		ZSizeType:  "zsize",
		ZScoreType: "zscore",

		SetType:     "set",
		SSizeType:   "ssize",
		ExpTimeType: "exptime",
		ExpMetaType: "expmeta",


func AsyncNotify

func AsyncNotify(ch chan struct{})

func Int64

func Int64(v []byte, err error) (int64, error)

func PutInt64

func PutInt64(v int64) []byte

func StrInt32

func StrInt32(v []byte, err error) (int32, error)

func StrInt64

func StrInt64(v []byte, err error) (int64, error)

func StrInt8

func StrInt8(v []byte, err error) (int8, error)

func StrUint64

func StrUint64(v []byte, err error) (uint64, error)

func Uint64

func Uint64(v []byte, err error) (uint64, error)


type DB

type DB struct {
	// contains filtered or unexported fields

func (*DB) Append

func (db *DB) Append(key []byte, value []byte) (int64, error)

func (*DB) BLPop

func (db *DB) BLPop(keys [][]byte, timeout time.Duration) ([]interface{}, error)

func (*DB) BRPop

func (db *DB) BRPop(keys [][]byte, timeout time.Duration) ([]interface{}, error)

func (*DB) BitCount

func (db *DB) BitCount(key []byte, start int, end int) (int64, error)

func (*DB) BitOP

func (db *DB) BitOP(op string, destKey []byte, srcKeys ...[]byte) (int64, error)

func (*DB) BitPos

func (db *DB) BitPos(key []byte, on int, start int, end int) (int64, error)

func (*DB) Decr

func (db *DB) Decr(key []byte) (int64, error)

func (*DB) DecrBy

func (db *DB) DecrBy(key []byte, decrement int64) (int64, error)

func (*DB) Del

func (db *DB) Del(keys ...[]byte) (int64, error)

func (*DB) Dump

func (db *DB) Dump(key []byte) ([]byte, error)

func (*DB) Exists

func (db *DB) Exists(key []byte) (int64, error)

func (*DB) Expire

func (db *DB) Expire(key []byte, duration int64) (int64, error)

func (*DB) ExpireAt

func (db *DB) ExpireAt(key []byte, when int64) (int64, error)

func (*DB) FlushAll

func (db *DB) FlushAll() (drop int64, err error)

func (*DB) Get

func (db *DB) Get(key []byte) ([]byte, error)

func (*DB) GetBit

func (db *DB) GetBit(key []byte, offset int) (int64, error)

func (*DB) GetRange

func (db *DB) GetRange(key []byte, start int, end int) ([]byte, error)

func (*DB) GetSet

func (db *DB) GetSet(key []byte, value []byte) ([]byte, error)

func (*DB) GetSlice

func (db *DB) GetSlice(key []byte) (store.Slice, error)

func (*DB) HClear

func (db *DB) HClear(key []byte) (int64, error)

func (*DB) HDel

func (db *DB) HDel(key []byte, args ...[]byte) (int64, error)

func (*DB) HDump

func (db *DB) HDump(key []byte) ([]byte, error)

func (*DB) HExpire

func (db *DB) HExpire(key []byte, duration int64) (int64, error)

func (*DB) HExpireAt

func (db *DB) HExpireAt(key []byte, when int64) (int64, error)

func (*DB) HGet

func (db *DB) HGet(key []byte, field []byte) ([]byte, error)

func (*DB) HGetAll

func (db *DB) HGetAll(key []byte) ([]FVPair, error)

func (*DB) HIncrBy

func (db *DB) HIncrBy(key []byte, field []byte, delta int64) (int64, error)

func (*DB) HKeyExists

func (db *DB) HKeyExists(key []byte) (int64, error)

func (*DB) HKeys

func (db *DB) HKeys(key []byte) ([][]byte, error)

func (*DB) HLen

func (db *DB) HLen(key []byte) (int64, error)

func (*DB) HMclear

func (db *DB) HMclear(keys ...[]byte) (int64, error)

func (*DB) HMget

func (db *DB) HMget(key []byte, args ...[]byte) ([][]byte, error)

func (*DB) HMset

func (db *DB) HMset(key []byte, args ...FVPair) error

func (*DB) HPersist

func (db *DB) HPersist(key []byte) (int64, error)

func (*DB) HRevScan

func (db *DB) HRevScan(key []byte, cursor []byte, count int, inclusive bool, match string) ([]FVPair, error)

func (*DB) HScan

func (db *DB) HScan(key []byte, cursor []byte, count int, inclusive bool, match string) ([]FVPair, error)

func (*DB) HSet

func (db *DB) HSet(key []byte, field []byte, value []byte) (int64, error)

func (*DB) HTTL

func (db *DB) HTTL(key []byte) (int64, error)

func (*DB) HValues

func (db *DB) HValues(key []byte) ([][]byte, error)

func (*DB) Incr

func (db *DB) Incr(key []byte) (int64, error)

func (*DB) IncrBy

func (db *DB) IncrBy(key []byte, increment int64) (int64, error)

func (*DB) Index

func (db *DB) Index() int

func (*DB) LClear

func (db *DB) LClear(key []byte) (int64, error)

func (*DB) LDump

func (db *DB) LDump(key []byte) ([]byte, error)

func (*DB) LExpire

func (db *DB) LExpire(key []byte, duration int64) (int64, error)

func (*DB) LExpireAt

func (db *DB) LExpireAt(key []byte, when int64) (int64, error)

func (*DB) LIndex

func (db *DB) LIndex(key []byte, index int32) ([]byte, error)

func (*DB) LKeyExists

func (db *DB) LKeyExists(key []byte) (int64, error)

func (*DB) LLen

func (db *DB) LLen(key []byte) (int64, error)

func (*DB) LMclear

func (db *DB) LMclear(keys ...[]byte) (int64, error)

func (*DB) LPersist

func (db *DB) LPersist(key []byte) (int64, error)

func (*DB) LPop

func (db *DB) LPop(key []byte) ([]byte, error)

func (*DB) LPush

func (db *DB) LPush(key []byte, args ...[]byte) (int64, error)

func (*DB) LRange

func (db *DB) LRange(key []byte, start int32, stop int32) ([][]byte, error)

func (*DB) LTTL

func (db *DB) LTTL(key []byte) (int64, error)

func (*DB) MGet

func (db *DB) MGet(keys ...[]byte) ([][]byte, error)

func (*DB) MSet

func (db *DB) MSet(args ...KVPair) error

func (*DB) Persist

func (db *DB) Persist(key []byte) (int64, error)

func (*DB) RPop

func (db *DB) RPop(key []byte) ([]byte, error)

func (*DB) RPush

func (db *DB) RPush(key []byte, args ...[]byte) (int64, error)

func (*DB) Restore

func (db *DB) Restore(key []byte, ttl int64, data []byte) error

func (*DB) RevScan

func (db *DB) RevScan(dataType DataType, cursor []byte, count int, inclusive bool, match string) ([][]byte, error)

if inclusive is true, revscan range (-inf, cursor] else (inf, cursor)

func (*DB) SAdd

func (db *DB) SAdd(key []byte, args ...[]byte) (int64, error)

func (*DB) SCard

func (db *DB) SCard(key []byte) (int64, error)

func (*DB) SClear

func (db *DB) SClear(key []byte) (int64, error)

func (*DB) SDiff

func (db *DB) SDiff(keys ...[]byte) ([][]byte, error)

func (*DB) SDiffStore

func (db *DB) SDiffStore(dstKey []byte, keys ...[]byte) (int64, error)

func (*DB) SDump

func (db *DB) SDump(key []byte) ([]byte, error)

func (*DB) SExpire

func (db *DB) SExpire(key []byte, duration int64) (int64, error)

func (*DB) SExpireAt

func (db *DB) SExpireAt(key []byte, when int64) (int64, error)

func (*DB) SInter

func (db *DB) SInter(keys ...[]byte) ([][]byte, error)

func (*DB) SInterStore

func (db *DB) SInterStore(dstKey []byte, keys ...[]byte) (int64, error)

func (*DB) SIsMember

func (db *DB) SIsMember(key []byte, member []byte) (int64, error)

func (*DB) SKeyExists

func (db *DB) SKeyExists(key []byte) (int64, error)

func (*DB) SMclear

func (db *DB) SMclear(keys ...[]byte) (int64, error)

func (*DB) SMembers

func (db *DB) SMembers(key []byte) ([][]byte, error)

func (*DB) SPersist

func (db *DB) SPersist(key []byte) (int64, error)

func (*DB) SRem

func (db *DB) SRem(key []byte, args ...[]byte) (int64, error)

func (*DB) SRevScan

func (db *DB) SRevScan(key []byte, cursor []byte, count int, inclusive bool, match string) ([][]byte, error)

func (*DB) SScan

func (db *DB) SScan(key []byte, cursor []byte, count int, inclusive bool, match string) ([][]byte, error)

func (*DB) STTL

func (db *DB) STTL(key []byte) (int64, error)

func (*DB) SUnion

func (db *DB) SUnion(keys ...[]byte) ([][]byte, error)

func (*DB) SUnionStore

func (db *DB) SUnionStore(dstKey []byte, keys ...[]byte) (int64, error)

func (*DB) Scan

func (db *DB) Scan(dataType DataType, cursor []byte, count int, inclusive bool, match string) ([][]byte, error)

fif inclusive is true, scan range [cursor, inf) else (cursor, inf)

func (*DB) Set

func (db *DB) Set(key []byte, value []byte) error

func (*DB) SetBit

func (db *DB) SetBit(key []byte, offset int, on int) (int64, error)

func (*DB) SetEX

func (db *DB) SetEX(key []byte, duration int64, value []byte) error

func (*DB) SetNX

func (db *DB) SetNX(key []byte, value []byte) (int64, error)

func (*DB) SetRange

func (db *DB) SetRange(key []byte, offset int, value []byte) (int64, error)

func (*DB) StrLen

func (db *DB) StrLen(key []byte) (int64, error)

func (*DB) TTL

func (db *DB) TTL(key []byte) (int64, error)

func (*DB) XLSort

func (db *DB) XLSort(key []byte, offset int, size int, alpha bool, desc bool, sortBy []byte, sortGet [][]byte) ([][]byte, error)

func (*DB) XSSort

func (db *DB) XSSort(key []byte, offset int, size int, alpha bool, desc bool, sortBy []byte, sortGet [][]byte) ([][]byte, error)

func (*DB) XZSort

func (db *DB) XZSort(key []byte, offset int, size int, alpha bool, desc bool, sortBy []byte, sortGet [][]byte) ([][]byte, error)

func (*DB) ZAdd

func (db *DB) ZAdd(key []byte, args ...ScorePair) (int64, error)

func (*DB) ZCard

func (db *DB) ZCard(key []byte) (int64, error)

func (*DB) ZClear

func (db *DB) ZClear(key []byte) (int64, error)

func (*DB) ZCount

func (db *DB) ZCount(key []byte, min int64, max int64) (int64, error)

func (*DB) ZDump

func (db *DB) ZDump(key []byte) ([]byte, error)

func (*DB) ZExpire

func (db *DB) ZExpire(key []byte, duration int64) (int64, error)

func (*DB) ZExpireAt

func (db *DB) ZExpireAt(key []byte, when int64) (int64, error)

func (*DB) ZIncrBy

func (db *DB) ZIncrBy(key []byte, delta int64, member []byte) (int64, error)

func (*DB) ZInterStore

func (db *DB) ZInterStore(destKey []byte, srcKeys [][]byte, weights []int64, aggregate byte) (int64, error)

func (*DB) ZKeyExists

func (db *DB) ZKeyExists(key []byte) (int64, error)

func (*DB) ZLexCount

func (db *DB) ZLexCount(key []byte, min []byte, max []byte, rangeType uint8) (int64, error)

func (*DB) ZMclear

func (db *DB) ZMclear(keys ...[]byte) (int64, error)

func (*DB) ZPersist

func (db *DB) ZPersist(key []byte) (int64, error)

func (*DB) ZRange

func (db *DB) ZRange(key []byte, start int, stop int) ([]ScorePair, error)

func (*DB) ZRangeByLex

func (db *DB) ZRangeByLex(key []byte, min []byte, max []byte, rangeType uint8, offset int, count int) ([][]byte, error)

func (*DB) ZRangeByScore

func (db *DB) ZRangeByScore(key []byte, min int64, max int64,
	offset int, count int) ([]ScorePair, error)

min and max must be inclusive if no limit, set offset = 0 and count = -1

func (*DB) ZRangeByScoreGeneric

func (db *DB) ZRangeByScoreGeneric(key []byte, min int64, max int64,
	offset int, count int, reverse bool) ([]ScorePair, error)

min and max must be inclusive if no limit, set offset = 0 and count = -1

func (*DB) ZRangeGeneric

func (db *DB) ZRangeGeneric(key []byte, start int, stop int, reverse bool) ([]ScorePair, error)

func (*DB) ZRank

func (db *DB) ZRank(key []byte, member []byte) (int64, error)

func (*DB) ZRem

func (db *DB) ZRem(key []byte, members ...[]byte) (int64, error)

func (*DB) ZRemRangeByLex

func (db *DB) ZRemRangeByLex(key []byte, min []byte, max []byte, rangeType uint8) (int64, error)

func (*DB) ZRemRangeByRank

func (db *DB) ZRemRangeByRank(key []byte, start int, stop int) (int64, error)

func (*DB) ZRemRangeByScore

func (db *DB) ZRemRangeByScore(key []byte, min int64, max int64) (int64, error)

min and max must be inclusive

func (*DB) ZRevRange

func (db *DB) ZRevRange(key []byte, start int, stop int) ([]ScorePair, error)

func (*DB) ZRevRangeByScore

func (db *DB) ZRevRangeByScore(key []byte, min int64, max int64, offset int, count int) ([]ScorePair, error)

min and max must be inclusive if no limit, set offset = 0 and count = -1

func (*DB) ZRevRank

func (db *DB) ZRevRank(key []byte, member []byte) (int64, error)

func (*DB) ZRevScan

func (db *DB) ZRevScan(key []byte, cursor []byte, count int, inclusive bool, match string) ([]ScorePair, error)

func (*DB) ZScan

func (db *DB) ZScan(key []byte, cursor []byte, count int, inclusive bool, match string) ([]ScorePair, error)

func (*DB) ZScore

func (db *DB) ZScore(key []byte, member []byte) (int64, error)

func (*DB) ZTTL

func (db *DB) ZTTL(key []byte) (int64, error)

func (*DB) ZUnionStore

func (db *DB) ZUnionStore(destKey []byte, srcKeys [][]byte, weights []int64, aggregate byte) (int64, error)

type DataType

type DataType byte
const (
	KV DataType = iota

for out use

func (DataType) String

func (d DataType) String() string

type DumpHead

type DumpHead struct {
	CommitID uint64

func (*DumpHead) Read

func (h *DumpHead) Read(r io.Reader) error

func (*DumpHead) Write

func (h *DumpHead) Write(w io.Writer) error

type FVPair

type FVPair struct {
	Field []byte
	Value []byte

type KVPair

type KVPair struct {
	Key   []byte
	Value []byte

type Ledis

type Ledis struct {
	// contains filtered or unexported fields

func Open

func Open(cfg *config.Config) (*Ledis, error)

func (*Ledis) AddNewLogEventHandler

func (l *Ledis) AddNewLogEventHandler(h NewLogEventHandler) error

func (*Ledis) Close

func (l *Ledis) Close()

func (*Ledis) CompactStore

func (l *Ledis) CompactStore() error

func (*Ledis) Dump

func (l *Ledis) Dump(w io.Writer) error

func (*Ledis) DumpFile

func (l *Ledis) DumpFile(path string) error

func (*Ledis) FlushAll

func (l *Ledis) FlushAll() error

Flush All will clear all data and replication logs

func (*Ledis) IsReadOnly

func (l *Ledis) IsReadOnly() bool

func (*Ledis) LoadDump

func (l *Ledis) LoadDump(r io.Reader) (*DumpHead, error)

clear all data and load dump file to db

func (*Ledis) LoadDumpFile

func (l *Ledis) LoadDumpFile(path string) (*DumpHead, error)

clear all data and load dump file to db

func (*Ledis) ReadLogsTo

func (l *Ledis) ReadLogsTo(startLogID uint64, w io.Writer) (n int, nextLogID uint64, err error)

func (*Ledis) ReadLogsToTimeout

func (l *Ledis) ReadLogsToTimeout(startLogID uint64, w io.Writer, timeout int, quitCh chan struct{}) (n int, nextLogID uint64, err error)

try to read events, if no events read, try to wait the new event singal until timeout seconds

func (*Ledis) ReplicationStat

func (l *Ledis) ReplicationStat() (*rpl.Stat, error)

func (*Ledis) ReplicationUsed

func (l *Ledis) ReplicationUsed() bool

func (*Ledis) Select

func (l *Ledis) Select(index int) (*DB, error)

func (*Ledis) StoreLogsFromData

func (l *Ledis) StoreLogsFromData(data []byte) error

func (*Ledis) StoreLogsFromReader

func (l *Ledis) StoreLogsFromReader(rb io.Reader) error

func (*Ledis) StoreStat

func (l *Ledis) StoreStat() *store.Stat

func (*Ledis) WaitReplication

func (l *Ledis) WaitReplication() error

type Limit

type Limit struct {
	Offset int
	Size   int

type NewLogEventHandler

type NewLogEventHandler func(rl *rpl.Log)

type ScorePair

type ScorePair struct {
	Score  int64
	Member []byte

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL