Skip to content

Commit a06aabe

Browse files
committed
add szet
1 parent 55aa1da commit a06aabe

File tree

6 files changed

+139
-21
lines changed

6 files changed

+139
-21
lines changed

redis/command.go

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,6 @@ func (c Command) Bytes() []byte {
2323
return buf.Bytes()
2424
}
2525

26-
func (c Command) Size() int {
27-
sum := 0
28-
for i := 0; i < len(c); i++ {
29-
sum += len(c[i])
30-
}
31-
return sum
32-
}
33-
3426
func (c Command) String() string {
3527
arr := make([]string, len(c))
3628
for i := range c {

redis/session.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,14 @@ import (
77
"io"
88
"net"
99
"strconv"
10-
"sync"
1110
)
1211

1312
// cmd, err := session.ReadCommand()
1413
// session.WriteReply(reply)
1514
// session.Write(reply.Bytes())
1615
type Session struct {
1716
net.Conn
18-
rd *bufio.Reader
19-
rlock sync.Mutex
17+
rd *bufio.Reader
2018
}
2119

2220
func NewSession(conn net.Conn) *Session {
@@ -27,8 +25,6 @@ func NewSession(conn net.Conn) *Session {
2725
}
2826

2927
func (s *Session) ReadCommand() (Command, error) {
30-
s.rlock.Lock()
31-
defer s.rlock.Unlock()
3228
// Read ( *<number of arguments> CR LF )
3329
if err := s.skipByte('*'); err != nil { // io.EOF
3430
return nil, err

rocks/db.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ func (d *DB) objFromCache(key []byte, e ElementType) interface{} {
3737
obj = NewHashElement(d, key)
3838
case LIST:
3939
obj = NewListElement(d, key)
40+
case SORTEDSET:
41+
obj = NewSortedSetElement(d, key)
4042
}
4143
d.caches.Add(skey, obj)
4244
}
@@ -51,6 +53,10 @@ func (d *DB) List(key []byte) *ListElement {
5153
return d.objFromCache(key, LIST).(*ListElement)
5254
}
5355

56+
func (d *DB) SortedSet(key []byte) *SortedSetElement {
57+
return d.objFromCache(key, SORTEDSET).(*SortedSetElement)
58+
}
59+
5460
func (d *DB) Delete(key []byte) error {
5561
return nil
5662
}

rocks/list.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,6 @@ func (l *ListElement) indexKey(i int64) []byte {
208208

209209
// split l[key]index into index
210210
func (l *ListElement) indexInKey(key []byte) int64 {
211-
idxbuf := bytes.TrimLeft(key, string(l.keyPrefix()))
211+
idxbuf := bytes.TrimPrefix(key, l.keyPrefix())
212212
return BytesToInt64(idxbuf[1:]) // skip sign "0/1"
213213
}

rocks/util.go

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@ var (
2020
type ElementType byte
2121

2222
const (
23-
STRING ElementType = 's'
24-
HASH = 'h'
25-
LIST = 'l'
26-
ZSET = 'z'
27-
NONE = '0'
23+
STRING ElementType = 's'
24+
HASH = 'h'
25+
LIST = 'l'
26+
SORTEDSET = 'z'
27+
NONE = '0'
2828
)
2929

3030
func (e ElementType) String() string {
@@ -49,8 +49,11 @@ const (
4949
IterBackward
5050
)
5151

52-
// 字节最大范围
53-
const MAXBYTE byte = math.MaxUint8
52+
// 字节范围
53+
const (
54+
MINBYTE byte = 0
55+
MAXBYTE byte = math.MaxUint8
56+
)
5457

5558
func rawKey(key []byte, t ElementType) []byte {
5659
return bytes.Join([][]byte{KEY, key, SEP, []byte{byte(t)}}, nil)

rocks/zset.go

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
package rocks
2+
3+
import (
4+
"bytes"
5+
"errors"
6+
"github.com/tecbot/gorocksdb"
7+
"sync"
8+
)
9+
10+
// SortedSet
11+
// +key,z = ""
12+
// z[key]m member = score
13+
// z[key]s score member = ""
14+
type SortedSetElement struct {
15+
db *DB
16+
key []byte
17+
mu sync.RWMutex
18+
}
19+
20+
type SortedSetEnumerateFunc func(i int, score, member []byte, quit *bool)
21+
22+
func NewSortedSetElement(db *DB, key []byte) *SortedSetElement {
23+
s := &SortedSetElement{db: db, key: key}
24+
return s
25+
}
26+
27+
// http://redis.io/commands/zadd#return-value
28+
func (s *SortedSetElement) Add(scoreMembers ...[]byte) (int, error) {
29+
s.mu.Lock()
30+
defer s.mu.Unlock()
31+
32+
count := len(scoreMembers)
33+
if count < 2 || count%2 != 0 {
34+
return 0, errors.New("invalid score/member pairs")
35+
}
36+
37+
batch := gorocksdb.NewWriteBatch()
38+
defer batch.Destroy()
39+
40+
added := 0
41+
for i := 0; i < count; i += 2 {
42+
score, member := scoreMembers[i], scoreMembers[i+1]
43+
skey, mkey := s.scoreKey(score, member), s.memberKey(member)
44+
45+
// remove old score key
46+
oldscore, err := s.db.RawGet(mkey)
47+
if err != nil {
48+
return 0, err
49+
} else if oldscore != nil {
50+
batch.Delete(skey)
51+
} else {
52+
added++
53+
}
54+
55+
// put new value
56+
batch.Put(mkey, score)
57+
batch.Put(skey, nil)
58+
}
59+
60+
return added, s.db.WriteBatch(batch)
61+
}
62+
63+
func (s *SortedSetElement) Score(member []byte) ([]byte, error) {
64+
s.mu.RLock()
65+
defer s.mu.RUnlock()
66+
return s.score(member)
67+
}
68+
69+
func (s *SortedSetElement) score(member []byte) ([]byte, error) {
70+
return s.db.RawGet(s.memberKey(member))
71+
}
72+
73+
func (s *SortedSetElement) Remove(members ...[]byte) (int, error) {
74+
return 0, nil
75+
}
76+
77+
// +key,z = ""
78+
func (s *SortedSetElement) rawKey() []byte {
79+
return rawKey(s.key, SORTEDSET)
80+
}
81+
82+
// z[key]
83+
func (s *SortedSetElement) keyPrefix() []byte {
84+
return bytes.Join([][]byte{[]byte{SORTEDSET}, SOK, s.key, EOK}, nil)
85+
}
86+
87+
func (s *SortedSetElement) memberKey(member []byte) []byte {
88+
return bytes.Join([][]byte{s.keyPrefix(), []byte{'m'}, member}, nil)
89+
}
90+
91+
func (s *SortedSetElement) scoreKey(score, member []byte) []byte {
92+
return bytes.Join([][]byte{s.keyPrefix(), []byte{'s'}, score, []byte{' '}, member}, nil)
93+
}
94+
95+
// split (z[key]s score member) into (score, member)
96+
func (s *SortedSetElement) splitScoreKey(skey []byte) ([]byte, []byte, error) {
97+
buf := bytes.TrimPrefix(skey, s.keyPrefix())
98+
pairs := bytes.Split(buf[1:], []byte{' '}) // skip score mark 's'
99+
if len(pairs) != 2 {
100+
return nil, nil, errors.New("invalid score/member key: " + string(skey))
101+
}
102+
return pairs[0], pairs[1], nil
103+
}
104+
105+
// split (z[key]m member) into (member)
106+
func (s *SortedSetElement) splitMemberKey(mkey []byte) ([]byte, error) {
107+
buf := bytes.TrimPrefix(mkey, s.keyPrefix())
108+
return buf[1:], nil // skip member mark 'm'
109+
}
110+
111+
func (s *SortedSetElement) RemoveByScore(min, max []byte) (int, error) {
112+
return 0, nil
113+
}
114+
115+
func (s *SortedSetElement) RangeByScore(min, max []byte, fn SortedSetEnumerateFunc) error {
116+
return nil
117+
}
118+
119+
func (s *SortedSetElement) RangeByMember(min, max []byte, fu SortedSetEnumerateFunc) error {
120+
return nil
121+
}

0 commit comments

Comments
 (0)