Skip to content
项目

xssed/owlcache has 906 GitHub stars and 208 forks. GitHot measured 0 stars in 24 hours. Last checked 2026-11-15 07:44 UTC. Last push 2026-03-21.

这些数字如何统计

可以做什么

  • 💡Cross-platform operation
  • 🚀Single node ultra high performance
  • ⛓Non-centralized, distributed
  • 🎯One Key to Many Values

实测星标增长

24小时
0
7天
正在收集历史
15天
正在收集历史
1个月
正在收集历史

各周期内的星标净变化,周期相互重叠,并非每日新增。缺失的测量保持空白。星标代表关注度,不代表软件质量。

关于

🦉owlcache is a lightweight, high-performance, non-centralized, distributed Key/Value in-memory Cache written in Go. keyword : golang cache、go cache、golang nosql

数据

doc/README_zh.md

原文

English | 中文简介

🦉owlcache

Image text

License release

🦉owlcache 是一款由Go编写的轻量级、高性能、无中心、分布式的Key/Value内存缓存。它是一个独立进程并且高性能的数据中间件,并提供了多种数据获取和导入方式。你可以通过查询一个节点的Key来获取节点集群中拥有相同Key的所有内容(一Key取多值)。操作一个节点的Key后将数据自动同步到所有节点集群。

亮点与功能简述

  • 💡跨平台运行
  • 🚀单机超高性能
  • ⛓无中心分布式
  • 🎯一Key取多值
  • 🌈数据并发安全
  • 🔍支持数据过期
  • 🖥数据落地存储
  • 🎨使用简单,操作命令只有几个
  • ⚔️身份认证
  • 📝日志记录
  • 🔭支持TCP和HTTP/HTTPS、WebSocket(搜索)连接
  • 🍻支持Memcache、Redis(String)、Url数据对接

使用文档

Image text

子项目

🦌 deerfs:使用它,您可以构建一个简单的无中心分布式文件系统。项目地址: deerfs

如何编译

Show

编译环境要求

  • golang >= 1.16

源码下载

  • go命令下载(会自动下载依赖库,如果直接下载源码编译会提示类库缺失)
  • go get命令无法执行请检查本机是否安装Git服务和设置Go环境
go get -u github.com/xssed/owlcache

⚠⚠⚠如果你的Go语言环境开启了GOMOD,你需要在电脑本地创建一个目录,进入该目录,再次执行git clone https://github.com/xssed/owlcache.git命令将源代码下载.

编译

  • 进入owlcache主目录执行编译命令(GOPATH模式下进入GOPATH目录的owlcache主目录,GOMOD模式则进入上一步提示中你自己创建的本地目录)
go build

运行

  • 注意owlcache.conf文件要跟主程序同目录(下面有介绍动态的设置owlcache.conf文件路径参数)。
  • .conf配置文件必须是统一的UTF-8编码。
  • 请先给在配置文件owlcache.conf中设置选项。

Linux

./owlcache

Windows (DOS)

  • 如果你打算使用cmd.exe长时间运行owlcache,请右键,在弹出菜单中选择【属性】->【选项】->关闭【快速编辑模式】和【插入模式】,否则长时间运行owlcache会出现卡顿或者休眠现象。
owlcache

参数help

  • 运行前您可以查看使用帮助
  • 注意运行时的配置参数要优先于*.conf文件里的配置参数
owlcache -help
Welcome to use owlcache. Version:XXX
If you have any questions,Please contact us: [email protected]
Project Home:https://github.com/xssed/owlcache
                _                _
   _____      _| | ___ __ _  ___| |__   ___
  / _ \ \ /\ / / |/ __/ _' |/ __| '_ \ / _ \
 | (_) \ V  V /| | (_| (_| | (__| | | |  __/
  \___/ \_/\_/ |_|\___\__,_|\___|_| |_|\___|

Usage of owlcache:
  -config string
        owlcache config file path.[demo:/var/home/owl.conf] (default "owlcache.conf")
  -host string
        binding local host ip address. (default "0.0.0.0")
  -log string
        owlcache log file path.[demo:/var/log/] (default "./log_file/")
  -pass string
        owlcache Http connection password. (default "")

带配置参数运行的例子

owlcache -config /var/home/owl.conf -host 127.0.0.1 -log /var/log/ -pass 1245!df2A

简单使用示例

单节点获取Key值

  • TCP 命令: get <key>\n
get hello\n
  • HTTP 注意:HTTP获取数据不用密码验证,只有其他更改数据的操作需要验证身份。
请求参数 参数值
cmd get
key key名称
curl "http://127.0.0.1:7721/data/?cmd=get&key=hello"
  • Websocket command: get <key>
get hello

响应结果例子:

world

如果是HTTP请求,在响应报文中会有Key的详细信息
Key: hello
Keycreatetime: 2021-11-26 18:12:45.1932019 +0800 CST
Responsehost: 127.0.0.1:7721

单节点获取Key值的信息

  • TCP 命令: get <key> info\n
get hello info\n
  • HTTP

owlcache 版本 >= 0.4.2, Http不再支持 'info'

http://127.0.0.1:7721/data/?cmd=get&key=hello&valuedata=info

  • Websocket 命令: get <key> info <Custom return string (not necessary, such as UUID)>
get hello info

或者

get hello info 5c9eff00-3bed-4113-a095-2f3c771683d9

响应结果例子:

{
    "Cmd": "get",
    "Status": 200,
    "Results": "SUCCESS",
    "Key": "hello",
    "Data": "d29ybGQ=",
    "ResponseHost": "127.0.0.1:7721",
    "KeyCreateTime": "2021-11-09T14:12:36.8431596+08:00"
}

注意HTTP请求返回的HTTP状态码,解释请参考“通讯协议”章节。

集群获取Key值

  • 假设现在有三个owlcache HTTP服务:127.0.0.1:7721、127.0.0.1:7723、127.0.0.1:7725。每个服务中都有一个Key名称叫hello的数据。
请求参数 参数值
cmd get
key key名称
curl "http://127.0.0.1:7721/group_data/?cmd=get&key=hello"

响应结果例子:

world

得到的结果是集群查询中更新时间最新的那一个值。

集群获取Key值的信息

curl "http://127.0.0.1:7721/group_data/?cmd=get&key=hello&valuedata=info"

响应结果例子:

[
    {
        "Address": "127.0.0.1:7721",
        "Data": "d29ybGQ=",
        "Key": "hello",
        "KeyCreateTime": "2025-02-21T13:02:35.5876031+08:00",
        "Status": 200
    },
    {
        "Address": "127.0.0.1:7723",
        "Data": "d29ybGQ=",
        "Key": "hello",
        "KeyCreateTime": "2025-02-20T13:02:35.5876031+08:00",
        "Status": 200
    },
    {
        "Address": "127.0.0.1:7725",
        "Data": "d29ybGQ=",
        "Key": "hello",
        "KeyCreateTime": "2025-02-18T13:02:35.5876031+08:00",
        "Status": 200
    }
]

结果是有关集群中哪个节点拥有此Key的信息。

查询集群时,可以指定查询对象节点,以提高查询效率

curl "http://127.0.0.1:7721/group_data/?cmd=get&key=hello&target=127.0.0.1:7723&valuedata=info"

响应结果例子:

[
    {
        "Address": "127.0.0.1:7723",
        "Data": "d29ybGQ=",
        "Key": "hello",
        "KeyCreateTime": "2025-02-20T13:02:35.5876031+08:00",
        "Status": 200
    }
]

结果是有关集群中指定的节点拥有此Key的信息。

......更多请参阅文档的详细说明

设计

Show

Image text

常见问题

1.owlcache没有主-从模式,如果一个key写入一个节点后,该节点此时宕机,那这个key不就访问不到了?

作者认为主-从模式会占用大量服务器资源和造成数据过分冗余(一Key映射多个值的场景例外)。建议重要的key在设置时可以同时写入到两个以上的节点,这样在相对的情况下几乎不会影响key的访问,如果整个集群的节点全部宕机,那真的是不可能访问到key的。

2.owlcache的集群方式怎么选择?

owlcache的集群方式有三种,他们分别是“Http”(短链接)、“Websocket”(长链接)和“Gossip”(数据最终一致)。
★如果你的业务量较小可以选择“Http”(短链接)集群的方式。
★如果你的业务量较大可以选择“Websocket”(长链接)集群的方式。
★“Gossip”(数据最终一致)的集群方式和前面两种集群方式并不冲突,他们可以共存。但是你需要注意配置项并且调试好复杂的服务器的网络环境。你可以理解为前面两种方式是主动集群,后者是被动集群,用来同步集群中的数据。但是,如果你开启“Gossip”,你的集群一个Key取多个值的使用场景将失去意义。

开发与讨论(不接商业合作)