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