go语言手写一个类似兼容redis的nosql数据库代码
代码语言:golang
所属分类:其他
代码描述:go语言手写一个类似兼容redis的nosql数据库代码
代码标签: go 语言 手写 一个 类似 兼容 redis nosq l数据库 代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
// main.go
package main
import (
"bufio"
"fmt"
"log"
"net"
"strconv"
"strings"
"sync"
"time"
)
// 数据存储结构
type DataStore struct {
mu sync.RWMutex
data map[string]string
expires map[string]time.Time
}
// 创建新的数据存储
func NewDataStore() *DataStore {
ds := &DataStore{
data: make(map[string]string),
expires: make(map[string]time.Time),
}
// 启动过期清理协程
go ds.cleanupExpired()
return ds
}
// 定期清理过期的键
func (ds *DataStore) cleanupExpired() {
ticker := time.NewTicker(1 * time.Second)
for range ticker.C {
ds.mu.Lock()
now := time.Now()
for key, expireTime := range ds.expires {
if now.After(expireTime) {
delete(ds.data, key)
delete(ds.expires, key)
}
}
ds.mu.Unlock()
}
}
// SET操作
func (ds *DataStore) Set(key, value string, expire int) {
ds.mu.Lock()
defer ds.mu.Unlock()
ds.data[key] = value
if expire > 0 {
ds.expires[key] = time.Now().Add(time.Duration(expire) * time.Second)
} else {
delete(ds.expires, key)
}
}
// GET操作
func (ds *DataStore) Get(key string) (string, bool) {
ds.mu.RLock()
defer ds.mu.RUnlock()
// 检查是否过期
if expireTime, exists := ds.expires[key]; exists {
if time.Now().After(expireTime) {
return "", false
}
}
value, exists := ds.data[key]
return value, exists
}
// DEL操作
func (ds *DataStore) Del(keys []string) int {
ds.mu.Lock()
defer ds.mu.Unlock()
count := 0.........完整代码请登录后点击上方下载按钮下载查看















网友评论0