support multi transaction

This commit is contained in:
hdt3213
2021-05-31 21:20:33 +08:00
parent 9d03314359
commit 67c385ee4a
50 changed files with 1919 additions and 1122 deletions

View File

@@ -173,9 +173,6 @@ func execSetEX(db *DB, args [][]byte) redis.Reply {
Data: value,
}
db.Lock(key)
defer db.UnLock(key)
db.PutEntity(key, entity)
expireTime := time.Now().Add(time.Duration(ttl) * time.Millisecond)
db.Expire(key, expireTime)
@@ -201,9 +198,6 @@ func execPSetEX(db *DB, args [][]byte) redis.Reply {
Data: value,
}
db.Lock(key)
defer db.UnLock(key)
db.PutEntity(key, entity)
expireTime := time.Now().Add(time.Duration(ttlArg) * time.Millisecond)
db.Expire(key, expireTime)
@@ -213,6 +207,20 @@ func execPSetEX(db *DB, args [][]byte) redis.Reply {
return &reply.OkReply{}
}
func prepareMSet(args [][]byte) ([]string, []string) {
size := len(args) / 2
keys := make([]string, size)
for i := 0; i < size; i++ {
keys[i] = string(args[2*i])
}
return keys, nil
}
func undoMSet(db *DB, args [][]byte) []CmdLine {
writeKeys, _ := prepareMSet(args)
return rollbackGivenKeys(db, writeKeys...)
}
// execMSet sets multi key-value in database
func execMSet(db *DB, args [][]byte) redis.Reply {
if len(args)%2 != 0 {
@@ -227,9 +235,6 @@ func execMSet(db *DB, args [][]byte) redis.Reply {
values[i] = args[2*i+1]
}
db.Locks(keys...)
defer db.UnLocks(keys...)
for i, key := range keys {
value := values[i]
db.PutEntity(key, &DataEntity{Data: value})
@@ -238,6 +243,14 @@ func execMSet(db *DB, args [][]byte) redis.Reply {
return &reply.OkReply{}
}
func prepareMGet(args [][]byte) ([]string, []string) {
keys := make([]string, len(args))
for i, v := range args {
keys[i] = string(v)
}
return nil, keys
}
// execMGet get multi key-value from database
func execMGet(db *DB, args [][]byte) redis.Reply {
keys := make([]string, len(args))
@@ -277,10 +290,6 @@ func execMSetNX(db *DB, args [][]byte) redis.Reply {
values[i] = args[2*i+1]
}
// lock keys
db.Locks(keys...)
defer db.UnLocks(keys...)
for _, key := range keys {
_, exists := db.GetEntity(key)
if exists {
@@ -319,9 +328,6 @@ func execGetSet(db *DB, args [][]byte) redis.Reply {
func execIncr(db *DB, args [][]byte) redis.Reply {
key := string(args[0])
db.Lock(key)
defer db.UnLock(key)
bytes, err := db.getAsString(key)
if err != nil {
return err
@@ -353,9 +359,6 @@ func execIncrBy(db *DB, args [][]byte) redis.Reply {
return reply.MakeErrReply("ERR value is not an integer or out of range")
}
db.Lock(key)
defer db.UnLock(key)
bytes, errReply := db.getAsString(key)
if errReply != nil {
return errReply
@@ -388,9 +391,6 @@ func execIncrByFloat(db *DB, args [][]byte) redis.Reply {
return reply.MakeErrReply("ERR value is not a valid float")
}
db.Lock(key)
defer db.UnLock(key)
bytes, errReply := db.getAsString(key)
if errReply != nil {
return errReply
@@ -418,9 +418,6 @@ func execIncrByFloat(db *DB, args [][]byte) redis.Reply {
func execDecr(db *DB, args [][]byte) redis.Reply {
key := string(args[0])
db.Lock(key)
defer db.UnLock(key)
bytes, errReply := db.getAsString(key)
if errReply != nil {
return errReply
@@ -453,9 +450,6 @@ func execDecrBy(db *DB, args [][]byte) redis.Reply {
return reply.MakeErrReply("ERR value is not an integer or out of range")
}
db.Lock(key)
defer db.UnLock(key)
bytes, errReply := db.getAsString(key)
if errReply != nil {
return errReply
@@ -480,20 +474,18 @@ func execDecrBy(db *DB, args [][]byte) redis.Reply {
}
func init() {
RegisterCommand("Set", execSet, nil, -3)
RegisterCommand("SetNx", execSetNX, nil, 3)
RegisterCommand("SetEX", execSetEX, nil, 4)
RegisterCommand("PSetEX", execPSetEX, nil, 4)
RegisterCommand("MSet", execMSet, nil, -3)
RegisterCommand("MGet", execMGet, nil, -2)
RegisterCommand("MSetNX", execMSetNX, nil, -3)
RegisterCommand("Get", execGet, nil, 2)
RegisterCommand("MSet", execMSet, nil, -3)
RegisterCommand("GetSet", execGetSet, nil, 3)
RegisterCommand("MSet", execMSet, nil, -3)
RegisterCommand("Incr", execIncr, nil, 2)
RegisterCommand("IncrBy", execIncrBy, nil, 3)
RegisterCommand("IncrByFloat", execIncrByFloat, nil, 3)
RegisterCommand("Decr", execDecr, nil, 2)
RegisterCommand("DecrBy", execDecrBy, nil, 3)
RegisterCommand("Set", execSet, writeFirstKey, rollbackFirstKey, -3)
RegisterCommand("SetNx", execSetNX, writeFirstKey, rollbackFirstKey, 3)
RegisterCommand("SetEX", execSetEX, writeFirstKey, rollbackFirstKey, 4)
RegisterCommand("PSetEX", execPSetEX, writeFirstKey, rollbackFirstKey, 4)
RegisterCommand("MSet", execMSet, prepareMSet, undoMSet, -3)
RegisterCommand("MGet", execMGet, prepareMGet, nil, -2)
RegisterCommand("MSetNX", execMSetNX, prepareMSet, undoMSet, -3)
RegisterCommand("Get", execGet, readFirstKey, nil, 2)
RegisterCommand("GetSet", execGetSet, writeFirstKey, rollbackFirstKey, 3)
RegisterCommand("Incr", execIncr, writeFirstKey, rollbackFirstKey, 2)
RegisterCommand("IncrBy", execIncrBy, writeFirstKey, rollbackFirstKey, 3)
RegisterCommand("IncrByFloat", execIncrByFloat, writeFirstKey, rollbackFirstKey, 3)
RegisterCommand("Decr", execDecr, writeFirstKey, rollbackFirstKey, 2)
RegisterCommand("DecrBy", execDecrBy, writeFirstKey, rollbackFirstKey, 3)
}