{"id":17649221,"url":"https://github.com/kenanbek/memdb","last_synced_at":"2025-05-07T06:20:36.600Z","repository":{"id":57518853,"uuid":"248645079","full_name":"KenanBek/memdb","owner":"KenanBek","description":"In-memory database with O(1) insert, delete and search.","archived":false,"fork":false,"pushed_at":"2020-03-20T05:12:14.000Z","size":10,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-05-06T23:38:20.022Z","etag":null,"topics":["database","go","golang","in-memory-database"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/KenanBek.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-03-20T01:52:19.000Z","updated_at":"2022-09-21T20:22:49.000Z","dependencies_parsed_at":"2022-09-26T18:00:43.768Z","dependency_job_id":null,"html_url":"https://github.com/KenanBek/memdb","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KenanBek%2Fmemdb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KenanBek%2Fmemdb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KenanBek%2Fmemdb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KenanBek%2Fmemdb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KenanBek","download_url":"https://codeload.github.com/KenanBek/memdb/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252824892,"owners_count":21809855,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database","go","golang","in-memory-database"],"created_at":"2024-10-23T11:24:58.663Z","updated_at":"2025-05-07T06:20:36.556Z","avatar_url":"https://github.com/KenanBek.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MemDB\n\nIn-memory database with O(1) insert, delete and search.\n\n**Note** for now it's not safe for concurrent use\n\n### Usage\n\nFirst, we define model to be used. It should implement `memdb.Entry` interface:\n\n```Go\n// User model.\ntype User struct {\n    Username  string\n    FirstName string\n    LastName  string\n}\n\n// Key returns unique username of the user.\nfunc (u *User) Key() string {\n    return u.Username\n}\n```\n\nKey function required to implement Entry interface.\n\nInitialize database and insert an entry:\n\n```Go\nuser := User{\n    Username:  \"user1\",\n    FirstName: \"user1 first name\",\n    LastName:  \"user1 last name\",\n}\n\ndb := NewMemDb()\ndb.AddEntry(\u0026user)\n```\n\nSearch and delete:\n\n```Go\n// search for entry by key\nentry1 := db.GetEntry(\"user1\")\n// cast entry to User type\nentry1user := entry1.(*User)\n// delete an entry\ndb.DeleteEntry(\"user1\")\n```\n\n#### Groups\n\nIt's also possible to group entries. Let's say we have another model called Post:\n\n```go\n// Post model.\ntype Post struct {\n\tSlug    string\n\tAuthor  string\n\tTitle   string\n\tContent string\n}\n\n// Key returns unique slug of the post.\nfunc (p *Post) Key() string {\n\treturn p.Slug\n}\n```\n\nUsing `AddGroupEntry`, `GetGroupEntry`, `DeleteGroupEntry` and `ListGroupEntry` we can manipulate items in a group.\n\n```go\nuser1 := User{\n    Username:  \"user1\",\n    FirstName: \"user1 first name\",\n    LastName:  \"user1 last name\",\n}\npost1 := Post{\n    Slug:    \"post1\",\n    Author:  \"user1\",\n    Title:   \"post1 title\",\n    Content: \"post1 content\",\n}\npost2 := Post{\n    Slug:    \"post2\",\n    Author:  \"user2\",\n    Title:   \"post2 title\",\n    Content: \"post2 content\",\n}\n\ndb := NewMemDb()\ndb.AddGroupEntry(\"users\", \u0026user1)\ndb.AddGroupEntry(\"posts\", \u0026post1)\ndb.AddGroupEntry(\"posts\", \u0026post2)\n```\n\n`GetGroupEntry` returns an entry in a group:\n\n```go\ndb.GetGroupEntry(\"users\", \"user1\")\ndb.GetGroupEntry(\"posts\", \"post1\")\n```\n\nReturned interface can be casted to the origin type:\n\n```go\nentry := db.GetGroupEntry(\"users\", \"user1\")\nuser := entry.(*User)\n```\n\nIt's also possible to add different types to database without specifying any group:\n\n```go\nuser1 := User{\n    Username:  \"user1\",\n    FirstName: \"user1 first name\",\n    LastName:  \"user1 last name\",\n}\npost1 := Post{\n    Slug:    \"post1\",\n    Author:  \"user1\",\n    Title:   \"post1 title\",\n    Content: \"post1 content\",\n}\n\ndb := NewMemDb()\ndb.AddEntry(\u0026user1)\ndb.AddEntry(\u0026post1)\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkenanbek%2Fmemdb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkenanbek%2Fmemdb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkenanbek%2Fmemdb/lists"}