Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
B
beego
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
go
beego
Commits
292d8f2c
Commit
292d8f2c
authored
Mar 06, 2016
by
liuchun
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add ssdb cache adapter
parent
fbb98fbe
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
342 additions
and
0 deletions
+342
-0
ssdb.go
cache/ssdb/ssdb.go
+239
-0
ssdb_test.go
cache/ssdb/ssdb_test.go
+103
-0
No files found.
cache/ssdb/ssdb.go
0 → 100644
View file @
292d8f2c
package
ssdb
import
(
"encoding/json"
"errors"
"strconv"
"strings"
"github.com/ssdb/gossdb/ssdb"
"time"
"github.com/astaxie/beego/cache"
)
// Cache SSDB adapter
type
Cache
struct
{
conn
*
ssdb
.
Client
conninfo
[]
string
}
//NewSsdbCache create new ssdb adapter.
func
NewSsdbCache
()
cache
.
Cache
{
return
&
Cache
{}
}
// Get get value from memcache.
func
(
rc
*
Cache
)
Get
(
key
string
)
interface
{}
{
if
rc
.
conn
==
nil
{
if
err
:=
rc
.
connectInit
();
err
!=
nil
{
panic
(
err
)
}
}
value
,
err
:=
rc
.
conn
.
Get
(
key
)
if
err
==
nil
{
return
value
}
return
nil
}
// GetMulti get value from memcache.
func
(
rc
*
Cache
)
GetMulti
(
keys
[]
string
)
[]
interface
{}
{
size
:=
len
(
keys
)
var
values
[]
interface
{}
if
rc
.
conn
==
nil
{
if
err
:=
rc
.
connectInit
();
err
!=
nil
{
for
i
:=
0
;
i
<
size
;
i
++
{
values
=
append
(
values
,
err
)
}
return
values
}
}
res
,
err
:=
rc
.
conn
.
Do
(
"multi_get"
,
keys
)
if
err
==
nil
{
for
i
:=
1
;
i
<
size
*
2
;
i
+=
2
{
values
=
append
(
values
,
string
(
res
[
i
+
1
]))
}
return
values
}
for
i
:=
0
;
i
<
size
;
i
++
{
values
=
append
(
values
,
err
)
}
return
values
}
// DelMulti get value from memcache.
func
(
rc
*
Cache
)
DelMulti
(
keys
[]
string
)
error
{
if
rc
.
conn
==
nil
{
if
err
:=
rc
.
connectInit
();
err
!=
nil
{
return
err
}
}
_
,
err
:=
rc
.
conn
.
Do
(
"multi_del"
,
keys
)
if
err
!=
nil
{
return
err
}
return
nil
}
// Put put value to memcache. only support string.
func
(
rc
*
Cache
)
Put
(
key
string
,
value
interface
{},
timeout
time
.
Duration
)
error
{
if
rc
.
conn
==
nil
{
if
err
:=
rc
.
connectInit
();
err
!=
nil
{
return
err
}
}
v
,
ok
:=
value
.
(
string
)
if
!
ok
{
return
errors
.
New
(
"value must string"
)
}
var
resp
[]
string
var
err
error
ttl
:=
int
(
timeout
/
time
.
Second
)
if
ttl
<
0
{
resp
,
err
=
rc
.
conn
.
Do
(
"set"
,
key
,
v
)
}
else
{
resp
,
err
=
rc
.
conn
.
Do
(
"setx"
,
key
,
v
,
ttl
)
}
if
err
!=
nil
{
return
err
}
if
len
(
resp
)
==
2
&&
resp
[
0
]
==
"ok"
{
return
nil
}
return
errors
.
New
(
"bad response"
)
}
// Delete delete value in memcache.
func
(
rc
*
Cache
)
Delete
(
key
string
)
error
{
if
rc
.
conn
==
nil
{
if
err
:=
rc
.
connectInit
();
err
!=
nil
{
return
err
}
}
_
,
err
:=
rc
.
conn
.
Del
(
key
)
if
err
!=
nil
{
return
err
}
return
nil
}
// Incr increase counter.
func
(
rc
*
Cache
)
Incr
(
key
string
)
error
{
if
rc
.
conn
==
nil
{
if
err
:=
rc
.
connectInit
();
err
!=
nil
{
return
err
}
}
_
,
err
:=
rc
.
conn
.
Do
(
"incr"
,
key
,
1
)
return
err
}
// Decr decrease counter.
func
(
rc
*
Cache
)
Decr
(
key
string
)
error
{
if
rc
.
conn
==
nil
{
if
err
:=
rc
.
connectInit
();
err
!=
nil
{
return
err
}
}
_
,
err
:=
rc
.
conn
.
Do
(
"incr"
,
key
,
-
1
)
return
err
}
// IsExist check value exists in memcache.
func
(
rc
*
Cache
)
IsExist
(
key
string
)
bool
{
if
rc
.
conn
==
nil
{
if
err
:=
rc
.
connectInit
();
err
!=
nil
{
return
false
}
}
resp
,
err
:=
rc
.
conn
.
Do
(
"exists"
,
key
)
if
err
!=
nil
{
return
false
}
if
resp
[
1
]
==
"1"
{
return
true
}
else
{
return
false
}
}
// ClearAll clear all cached in memcache.
func
(
rc
*
Cache
)
ClearAll
()
error
{
if
rc
.
conn
==
nil
{
if
err
:=
rc
.
connectInit
();
err
!=
nil
{
return
err
}
}
key_start
,
key_end
,
limit
:=
""
,
""
,
50
resp
,
err
:=
rc
.
Scan
(
key_start
,
key_end
,
limit
)
for
err
==
nil
{
size
:=
len
(
resp
)
if
size
==
1
{
return
nil
}
keys
:=
[]
string
{}
for
i
:=
1
;
i
<
size
;
i
+=
2
{
keys
=
append
(
keys
,
string
(
resp
[
i
]))
}
_
,
e
:=
rc
.
conn
.
Do
(
"multi_del"
,
keys
)
if
e
!=
nil
{
return
e
}
key_start
=
resp
[
size
-
2
]
resp
,
err
=
rc
.
Scan
(
key_start
,
key_end
,
limit
)
}
return
err
}
// Scan key all cached in ssdb.
func
(
rc
*
Cache
)
Scan
(
key_start
string
,
key_end
string
,
limit
int
)
([]
string
,
error
)
{
if
rc
.
conn
==
nil
{
if
err
:=
rc
.
connectInit
();
err
!=
nil
{
return
nil
,
err
}
}
resp
,
err
:=
rc
.
conn
.
Do
(
"scan"
,
key_start
,
key_end
,
limit
)
if
err
!=
nil
{
return
nil
,
err
}
return
resp
,
nil
}
// StartAndGC start memcache adapter.
// config string is like {"conn":"connection info"}.
// if connecting error, return.
func
(
rc
*
Cache
)
StartAndGC
(
config
string
)
error
{
var
cf
map
[
string
]
string
json
.
Unmarshal
([]
byte
(
config
),
&
cf
)
if
_
,
ok
:=
cf
[
"conn"
];
!
ok
{
return
errors
.
New
(
"config has no conn key"
)
}
rc
.
conninfo
=
strings
.
Split
(
cf
[
"conn"
],
";"
)
if
rc
.
conn
==
nil
{
if
err
:=
rc
.
connectInit
();
err
!=
nil
{
return
err
}
}
return
nil
}
// connect to memcache and keep the connection.
func
(
rc
*
Cache
)
connectInit
()
error
{
conninfo_array
:=
strings
.
Split
(
rc
.
conninfo
[
0
],
":"
)
host
:=
conninfo_array
[
0
]
port
,
e
:=
strconv
.
Atoi
(
conninfo_array
[
1
])
if
e
!=
nil
{
return
e
}
var
err
error
rc
.
conn
,
err
=
ssdb
.
Connect
(
host
,
port
)
if
err
!=
nil
{
return
err
}
return
nil
}
func
init
()
{
cache
.
Register
(
"ssdb"
,
NewSsdbCache
)
}
cache/ssdb/ssdb_test.go
0 → 100644
View file @
292d8f2c
package
ssdb
import
(
"github.com/astaxie/beego/cache"
"strconv"
"testing"
"time"
)
func
TestMemcacheCache
(
t
*
testing
.
T
)
{
ssdb
,
err
:=
cache
.
NewCache
(
"ssdb"
,
`{"conn": "127.0.0.1:8888"}`
)
if
err
!=
nil
{
t
.
Error
(
"init err"
)
}
// test put and exist
if
ssdb
.
IsExist
(
"ssdb"
)
{
t
.
Error
(
"check err"
)
}
timeoutDuration
:=
10
*
time
.
Second
//timeoutDuration := -10*time.Second if timeoutDuration is negtive,it means permanent
if
err
=
ssdb
.
Put
(
"ssdb"
,
"ssdb"
,
timeoutDuration
);
err
!=
nil
{
t
.
Error
(
"set Error"
,
err
)
}
if
!
ssdb
.
IsExist
(
"ssdb"
)
{
t
.
Error
(
"check err"
)
}
// Get test done
if
err
=
ssdb
.
Put
(
"ssdb"
,
"ssdb"
,
timeoutDuration
);
err
!=
nil
{
t
.
Error
(
"set Error"
,
err
)
}
if
v
:=
ssdb
.
Get
(
"ssdb"
);
v
!=
"ssdb"
{
t
.
Error
(
"get Error"
)
}
//inc/dec test done
if
err
=
ssdb
.
Put
(
"ssdb"
,
"2"
,
timeoutDuration
);
err
!=
nil
{
t
.
Error
(
"set Error"
,
err
)
}
if
err
=
ssdb
.
Incr
(
"ssdb"
);
err
!=
nil
{
t
.
Error
(
"incr Error"
,
err
)
}
if
v
,
err
:=
strconv
.
Atoi
(
ssdb
.
Get
(
"ssdb"
)
.
(
string
));
err
!=
nil
||
v
!=
3
{
t
.
Error
(
"get err"
)
}
if
err
=
ssdb
.
Decr
(
"ssdb"
);
err
!=
nil
{
t
.
Error
(
"decr error"
)
}
// test del
if
err
=
ssdb
.
Put
(
"ssdb"
,
"3"
,
timeoutDuration
);
err
!=
nil
{
t
.
Error
(
"set Error"
,
err
)
}
if
v
,
err
:=
strconv
.
Atoi
(
ssdb
.
Get
(
"ssdb"
)
.
(
string
));
err
!=
nil
||
v
!=
3
{
t
.
Error
(
"get err"
)
}
if
err
:=
ssdb
.
Delete
(
"ssdb"
);
err
==
nil
{
if
ssdb
.
IsExist
(
"ssdb"
)
{
t
.
Error
(
"delete err"
)
}
}
//test string
if
err
=
ssdb
.
Put
(
"ssdb"
,
"ssdb"
,
-
10
*
time
.
Second
);
err
!=
nil
{
t
.
Error
(
"set Error"
,
err
)
}
if
!
ssdb
.
IsExist
(
"ssdb"
)
{
t
.
Error
(
"check err"
)
}
if
v
:=
ssdb
.
Get
(
"ssdb"
)
.
(
string
);
v
!=
"ssdb"
{
t
.
Error
(
"get err"
)
}
//test GetMulti done
if
err
=
ssdb
.
Put
(
"ssdb1"
,
"ssdb1"
,
-
10
*
time
.
Second
);
err
!=
nil
{
t
.
Error
(
"set Error"
,
err
)
}
if
!
ssdb
.
IsExist
(
"ssdb1"
)
{
t
.
Error
(
"check err"
)
}
vv
:=
ssdb
.
GetMulti
([]
string
{
"ssdb"
,
"ssdb1"
})
if
len
(
vv
)
!=
2
{
t
.
Error
(
"getmulti error"
)
}
if
vv
[
0
]
.
(
string
)
!=
"ssdb"
{
t
.
Error
(
"getmulti error"
)
}
if
vv
[
1
]
.
(
string
)
!=
"ssdb1"
{
t
.
Error
(
"getmulti error"
)
}
// test clear all done
if
err
=
ssdb
.
ClearAll
();
err
!=
nil
{
t
.
Error
(
"clear all err"
)
}
if
ssdb
.
IsExist
(
"ssdb"
)
||
ssdb
.
IsExist
(
"ssdb1"
)
{
t
.
Error
(
"check err"
)
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment