iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Go重写Redis中间件 - Go实现内存数据库
  • 282
分享到

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

数据库redis中间件 2023-09-16 14:09:34 282人浏览 安东尼
摘要

Go实现内存数据库 前面我们实现了一个简单的回发Redis,这里我们要实现一个真正的Redis内核 实现底层Dict数据结构 新建一个datastruct文件夹,放一些我们要用的数据结构,比如Redis的核心起始就是一个map,再新建一个包

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 breaktype Consumer func(key string, val interface{}) bool// Dict is interface of a key-value data structuretype 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,没有存进去回复0PutIfAbsent(key string, val interface{}) (result int) //如果没有则存进对应的key - valuePutIfExists(key string, val interface{}) (result int) //如果有则修改对应的key - valueRemove(key string) (result int)                       //从字典中删除key - valueForEach(consumer Consumer)//遍历整个字典,传入的是一个方法Keys() []string           //列出所有的keyRandomKeys(limit int) []string                        //随机列一定数量的键RandomDistincTKEys(limit int) []string                //随机返回一定数据量不重复的keyClear()                   //清空字典}

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

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做垃圾回收即可

// SyncDict wraps a map, it is not thread safetype SyncDict struct {m sync.Map}// MakeSyncDict makes a new mapfunc MakeSyncDict() *SyncDict {return &SyncDict{}}// Get returns the binding value and whether the key is existfunc (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 dictfunc (dict *SyncDict) Len() int {lenth := 0dict.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-valuefunc (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-valuefunc (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-valuefunc (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-valuefunc (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 dictfunc (dict *SyncDict) Keys() []string {result := make([]string, dict.Len())i := 0dict.m.Range(func(key, value interface{}) bool {result[i] = key.(string)i++return true})return result}// ForEach traversal the dictfunc (dict *SyncDict) ForEach(consumer Consumer) {di

来源地址:https://blog.csdn.net/qq_47431008/article/details/131980077

您可能感兴趣的文档:

--结束END--

本文标题: Go重写Redis中间件 - Go实现内存数据库

本文链接: https://www.lsjlt.com/news/409960.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Go重写Redis中间件 - Go实现内存数据库
    GO实现内存数据库 前面我们实现了一个简单的回发Redis,这里我们要实现一个真正的Redis内核 实现底层Dict数据结构 新建一个datastruct文件夹,放一些我们要用的数据结构,比如Redis的核心起始就是一个map,再新建一个包...
    99+
    2023-09-16
    数据库 redis 中间件
  • 如何用Go语言和Redis实现数据缓存
    如何用Go语言和Redis实现数据缓存随着互联网应用的迅速发展,数据缓存成为提高系统性能和响应速度的重要手段之一。而Go语言作为一门高效、可靠的编程语言,搭配Redis这个高性能的缓存数据库,可以实现快速的数据缓存。本文将介绍如何使用Go语...
    99+
    2023-10-27
    Go语言 redis 数据缓存
  • go语言数据库中间件怎么使用
    Go语言数据库中间件的使用方法有以下几个步骤:1. 引入数据库驱动包:根据所选中间件的类型,引入对应的数据库驱动包。例如,如果选择使...
    99+
    2023-10-20
    go语言 数据库
  • redis是数据库还是中间件
    redis既是数据库又是中间件,可用于数据持久化、数据结构存储、高速缓存、消息传递和会话管理。 Redis是数据库还是中间件 Redis即Redis Database Server,它...
    99+
    2024-04-19
    redis 数据丢失
  • Uber用Go重写Schemaless数据库的分片层分析
    本篇内容介绍了“Uber用Go重写Schemaless数据库的分片层分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能...
    99+
    2024-04-02
  • 如何使用Go语言和Redis实现数据库备份
    如何使用Go语言和Redis实现数据库备份云计算时代,数据的备份和恢复已经成为每个应用程序开发者和系统管理员必备的技能之一。而在进行数据库备份时,选择合适的工具和方法可以大大简化操作,并提高备份的效率。本文将介绍如何使用Go语言和Redis...
    99+
    2023-10-27
    Go语言 redis 数据库备份
  • golang内存数据库怎么实现
    在Golang中实现一个内存数据库可以通过以下步骤: 定义数据库结构:首先,你需要确定数据库的结构,即定义每个表的字段以及数据类型...
    99+
    2023-10-23
    golang
  • GO web 数据库预处理的实现
    目录什么是预处理? 那么预处理有啥好处? Go实现 MySQL 的事务 sqlx使用 gin + mysql + rest full api  上一篇文章我们进行了数据操作...
    99+
    2024-04-02
  • SpringBoot集成Redis数据库,实现缓存管理
    目录一、Redis简介  二、Spring2.0集成Redis  1、核心依赖2、配置文件3、简单测试案例4、自定义序列化配置5、序列化测试三、源代码地址&nbs...
    99+
    2024-04-02
  • Redis数据库基础与ASP.NET Core缓存实现
    目录基础Redis 库连接 Redis能用 redis 干啥Redis 数据库存储字符串订阅发布RedisValueASP.NET Core 缓存与分布式缓存内存中的缓存ASP.NE...
    99+
    2024-04-02
  • Spring 如何结合Redis数据库实现缓存
    这篇文章将为大家详细讲解有关 Spring 如何结合Redis数据库实现缓存,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1. 依赖包安装pom.xml 加入:<!-- redis c...
    99+
    2023-05-31
    spring redis 缓存
  • MySQL 数据库如何实现存储时间
    目录1.切记不要用字符串存储日期2.Datetime 和 Timestamp 之间抉择2.1 DateTime 类型没有时区信息的2.2 DateTime 类型耗费空间更大3.再看 ...
    99+
    2024-04-02
  • MySQL数据库怎么实现存储时间
    这篇文章将为大家详细讲解有关MySQL数据库怎么实现存储时间,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.切记不要用字符串存储日期字符串占用的空间更大!字符串存储的日期比较效率比较低(逐个字符进行比对...
    99+
    2023-06-29
  • SpringBoot2 中怎么利用Redis数据库实现缓存管理
    SpringBoot2 中怎么利用Redis数据库实现缓存管理,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、Redis简介Spring Boot中除了对常用...
    99+
    2023-06-02
  • Redis如何实现数据库读写分离详解
    前言 Redis是一种NoSQL的文档数据库,通过key-value的结构存储在内存中,Redis读的速度是110000次/s,写的速度是81000次/s,性能很高,使用范围也很广。Redis是一个key-...
    99+
    2024-04-02
  • 如何在Go语言中实现路由中间件
    如何在Go语言中实现路由中间件,需要具体代码示例引言:在Go语言的Web开发中,路由是不可或缺的一部分。路由中间件是一种在请求到达目标处理函数之前执行的功能模块。它们可以对请求进行拦截、验证、记录等操作,从而帮助开发者处理一些通用功能,并提...
    99+
    2023-12-17
    路由 实现 中间件
  • 基于Golang怎么实现内存数据库
    今天小编给大家分享一下基于Golang怎么实现内存数据库的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。GO实现内存数据库实现...
    99+
    2023-07-05
  • Go简单实现多租户数据库隔离
    目录多租户为什么需要多租户?数据隔离方式物理分离详细实现启动服务数据库配置多租户 在 SaaS 系统中多租户是一个很重要的架构,在服务上仅需运行一个软件实例就能够支持每个租户的功能,...
    99+
    2023-05-20
    Go 多租户隔离 Go 多租户
  • Java数据库读写分离中的数据库中间件DBProxy是怎样的
    Java数据库读写分离中的数据库中间件DBProxy是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言碎语好久没更博了,今天引用美团技术团队的一篇文章来...
    99+
    2023-06-17
  • GO语言中怎么实现Mysql数据库的CURD操作
    这期内容当中小编将会给大家带来有关GO语言中怎么实现Mysql数据库的CURD操作,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、先导入驱动包和增强版Mysql操作库Sqlxpackage m...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作