Go重写Redis中间件 - Go实现内存数据库

这篇具有很好参考价值的文章主要介绍了Go重写Redis中间件 - Go实现内存数据库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

GO实现内存数据库

前面我们实现了一个简单的回发Redis,这里我们要实现一个真正的Redis内核

实现底层Dict数据结构

新建一个datastruct文件夹,放一些我们要用的数据结构,比如Redis的核心起始就是一个map,再新建一个包实现这个map或者叫字典,字典的底层使用的就是map

dict.go

写一个Dict接口定义一些map要实现的功能,注意ForEach方法的入参是一个方法,把这个方法施加到全部k-v,和Range方法类似

// Consumer is used to traversal dict, if it returns false the traversal will be break
type Consumer func(key string, val interface{}) bool

// Dict is interface of a key-value data structure
type Dict interface {
	Get(key string) (val interface{}, exists bool)        //返回相应key对应的value和key是否存在
	Len() int                                             //字典中有多少个key - value键值对
	Put(key string, val interface{}) (result int)         //将key - value存进dict,存进去回复1,没有存进去回复0
	PutIfAbsent(key string, val interface{}) (result int) //如果没有则存进对应的key - value
	PutIfExists(key string, val interface{}) (result int) //如果有则修改对应的key - value
	Remove(key string) (result int)                       //从字典中删除key - value
	ForEach(consumer Consumer)                            //遍历整个字典,传入的是一个方法
	Keys() []string                                       //列出所有的key
	RandomKeys(limit int) []string                        //随机列一定数量的键
	RandomDistinctKeys(limit int) []string                //随机返回一定数据量不重复的key
	Clear()                                               //清空字典
}

然后就是实现刚才写的接口

sync_dict.go

首先是SyncDict结构体,他的成员只有一个就是sync.Map,然后写一个New方法,RandomKeys方法和RandomDistinctKeys方法实现逻辑上的区别是RandomKeys方法是在for循环里调用Range方法,Range方法里return false,每次for循环只调用一次Range方法,有可能遍历到相同的key,而RandomDistinctKeys方法是return true,直到计数器变量增加到limit时return false,Clear方法不用遍历map一个个删掉,只需要Make一个新的SyncDict,旧的SyncDict由GC做垃圾回收即可文章来源地址https://www.toymoban.com/news/detail-665540.html

// SyncDict wraps a map, it is not thread safe
type SyncDict struct {
	m sync.Map
}

// MakeSyncDict makes a new map
func MakeSyncDict() *SyncDict {
	return &SyncDict{}
}

// Get returns the binding value and whether the key is exist
func (dict *SyncDict) Get(key string) (val interface{}, exists bool) {
	val, ok := dict.m.Load(key) //Load方法是sync.map的Get方法
	return val, ok
}

// Len returns the number of dict
func (dict *SyncDict) Len() int {
	lenth := 0
	dict.m.Range(func(k, v interface{}) bool {
		lenth++
		return true
	})
	return lenth
}

// Put puts key value into dict and returns the number of new inserted key-value
func (dict *SyncDict) Put(key string, val interface{}) (result int) {
	_, existed := dict.m.Load(key)
	dict.m.Store(key, val)
	if existed {
		return 0 //仅修改,没有插入新的kv
	}
	return 1 //插入新的kv
}

// PutIfAbsent puts value if the key is not exists and returns the number of updated key-value
func (dict *SyncDict) PutIfAbsent(key string, val interface{}) (result int) {
	_, existed := dict.m.Load(key)
	if existed {
		return 0
	}
	dict.m.Store(key, val)
	return 1
}

// PutIfExists puts value if the key is exist and returns the number of inserted key-value
func (dict *SyncDict) PutIfExists(key string, val interface{}) (result int) {
	_, existed := dict.m.Load(key)
	if existed {
		dict.m.Store(key, val)
		return 1
	}
	return 0
}

// Remove removes the key and return the number of deleted key-value
func (dict *SyncDict) Remove(key string) (result int) {
	_, existed := dict.m.Load(key)
	dict.m.Delete(key)
	if existed {
		return 1
	}
	return 0
}

// Keys returns all keys in dict
func (dict *SyncDict) Keys() []string {
	result := make([]string, dict.Len())
	i := 0
	dict.m.Range(func(key, value interface{}) bool {
		result[i] = key.(string)
		i++
		return true
	})
	return result
}

// ForEach traversal the dict
func (dict *SyncDict) ForEach(consumer Consumer) {
	di

到了这里,关于Go重写Redis中间件 - Go实现内存数据库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 十万字图文详解mysql、redis、kafka、elasticsearch(ES)多源异构不同种类数据库集成、数据共享、数据同步、不同中间件技术实现与方案,如何构建数据仓库、数据湖、数仓一体化?

    数据库大数据量、高并发、高可用解决方案,十万字图文详解mysql、redis、kafka、elasticsearch(ES)多源异构不同种类数据库集成、数据共享、数据同步、不同中间件技术实现与方案,如何构建数据仓库、数据湖、数仓一体化?Delta Lake、Apache Hudi和Apache Iceberg数仓一体化技术架构

    2024年02月07日
    浏览(52)
  • Go Gin Gorm Casbin权限管理实现 - 3. 实现Gin鉴权中间件

    Casbin是用于Golang项目的功能强大且高效的开源访问控制库。 强大通用也意味着概念和配置较多,具体到实际应用(以Gin Web框架开发)需要解决以下问题: 权限配置的存储,以及 增删改查 Gin框架的中间件如何实现 经过一番摸索实践出经验,计划分为三个章节,循序渐进的介绍

    2024年02月07日
    浏览(41)
  • 华为云应用中间件DCS系列—Redis实现(社交APP)实时评论

    云服务、API、SDK,调试,查看,我都行 阅读短文您可以学习到:应用中间件系列之Redis实现(社交APP)实时评论 华为云开发者插件(Huawei Cloud Toolkit),作为华为云围绕其产品能力向开发者桌面上的延伸,帮助开发者快速在本地连接华为云,打通华为云到开发者的最后一公里

    2024年02月07日
    浏览(54)
  • 华为云应用中间件DCS系列—Redis实现(电商网站)秒杀抢购示例

    云服务、API、SDK,调试,查看,我都行 阅读短文您可以学习到:应用中间件系列之Redis实现(电商网站)秒杀抢购示例 华为云开发者插件(Huawei Cloud Toolkit),作为华为云围绕其产品能力向开发者桌面上的延伸,帮助开发者快速在本地连接华为云,打通华为云到开发者的最后

    2024年02月07日
    浏览(40)
  • Go Gin中间件

    Gin是一个用Go语言编写的Web框架,它提供了一种简单的方式来创建HTTP路由和处理HTTP请求。中间件是Gin框架中的一个重要概念,它可以用来处理HTTP请求和响应,或者在处理请求之前和之后执行一些操作。 以下是关于Gin中间件开发的一些基本信息: 中间件的定义 :在Gin中,中

    2024年02月05日
    浏览(47)
  • 使用Go编写HTTP中间件

    在Go语言中,HTTP中间件是一种处理HTTP请求和响应的函数,它可以拦截到请求并对其进行处理,然后再将请求传递给下一个中间件或目标处理程序。HTTP中间件在Web应用程序中非常常见,它提供了一种机制来执行各种任务,例如身份验证、授权、日志记录和错误处理等。 下面是

    2024年01月23日
    浏览(43)
  • GO——gin中间件和路由

    中间件 参考:https://learnku.com/articles/66234 结构 中间件是函数 中间件函数被放在调用链上 调用链的末尾是路由path对应的函数 执行过程 net/http包调用到gin的serverHTTP 参考:go/pkg/mod/github.com/gin-gonic/gin@v1.7.7/gin.go:506 通过path找到路由对应的处理链,赋值给context 参考:go/pkg/mod/git

    2024年01月17日
    浏览(42)
  • GO自研微服务框架-中间件

    中间件的作用是给应用添加一些额外的功能,但是并不会影响原有应用的编码方式,想用的时候直接添加,不想用可以很轻松的去除,做到所谓的可插拔。 中间件的实现位置在哪里? 不能耦合在用户的代码中 需要独立存在,但又能拿到上下文,并能做出影响 位置:在处理器

    2024年01月18日
    浏览(48)
  • 中间件redis的使用

    Java中的中间件配置体现在springboot的yml配置文件中。Springboot框架支持微服务和中间件和restful api远程服务的调用。中间件是Java web系统的中间层的服务系统的调用接口。Springboot的自动装配和约定大于配置机制初始化springcontext的容器空间和注册组件。使用容器管理服务注册对象

    2024年02月05日
    浏览(48)
  • Gin中间件的详解 ,用Jwt-go 和 Gin 的安全的登陆的中间件

    Gin 在不同的group 设置不同的中间件或者过滤器 Gin 的group下的路由上中间件或过滤器 用Jwt-go 和 Gin 的安全的登陆的中间件 JWT 类,它基本有所有基本功能,包括:GenerateToken,GenerateRefreshToken, ValidateToken, ParseToken 1. Gin 在不同的group 设置不同的中间件或者过滤器 Golang 中的 gin

    2024年02月15日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包