项目简介
本项目是基于Go语言构建的分布式缓存服务系统,名为震寅Cache(ZYCache)。系统具有轻量级特点,提供键值对内存缓存服务。它分为ZhenCache和YinLog两部分,前者缓存服务功能基本完善,后者是日志系统,采用无锁队列进行日志缓存,记录数据集查询与添加操作,实现了基于Json的持久化及快照 + 日志恢复功能。系统既支持单机缓存,也支持分布式缓存服务。
项目的主要特性和功能
- 泛型支持与定时缓存:提供类似Go2.0提案中参数列表化泛型支持的KeyStruct类型索引,具备定时缓存键值对功能。
- 多样数据结构:有序键值对集合有经典红黑树、Redis采用的跳表两种可选数据结构,还提供原生Map以及带LRU缓存的Map作为K - V缓存底层。
- 单机便捷使用:调用服务无需初始化,定义KeyStruct并调用相应方法,函数内部开启Goroutine处理插入与查询,多次操作幂等,单数据库实例响应多线程操作。
- 分布式缓存服务:类似memcache或GroupCache,支持string Key,提供基于简单RPC的客户端和服务端程序。服务端用一致性哈希算法进行负载均衡,每个服务器自带客户端,可正确存储和获取键值对。
- 其他特性:具备分布式一致性、可扩展性、高可用性、数据持久化等特性,内置日志系统记录操作日志,支持从日志中恢复数据,支持高并发访问,提供高效并发控制机制。
安装使用步骤
单机缓存使用步骤
- 定义自己的KeyStruct,继承原来的默认Key并重写相关内容和比较函数,目前支持string/int32/int64三种类型的键,后续易扩展。示例代码如下: ```go //继承原来的默认Key并重写参数列表中想要的内容 type TestKey struct { keystruct.DefaultKey key string }
//重写比较函数 func (key TestKey) CompareBiggerThan(other keystruct.KeyStruct) bool { return key.key > other.KeyString() }
//重写作为主键以及在比较中需要用到的键的索引
func (key TestKey) KeyString() string {
return key.key
}
2. 直接进行调用,函数内部会开一个Goroutine进行插入与查询的处理,多次操作是幂等的,仅有一个数据库实例对多线程操作进行响应。示例代码如下:
go
//Get方法的使用
val, err := store.GetValue(TestKey{keystruct.DefaultKey{}, "test"})
if err!= nil {
handle_err()
}
handle_val(val)
/****/
//Set方法的使用
//这个键会保持15分钟的缓存时间,过期后将无法获得
store.Set(TestKey{keystruct.DefaultKey{},"test"},"value of testkey",15time.Minute)
```
分布式缓存使用步骤
客户端调用
通过直接调用.\ZYCache\zhenCache\rpcdef\clientcall.go的两个函数来远程使用服务,需要注意目前仍然需要客户自己手动将value序列化为字符串,在读取之后进行反序列化。示例代码如下: ```go //get some value by cli //assert return interface as marshalled string func Get(key string, serverAddr string) (interface{}, error) { .... }
//set some value by cli //need value to be marshal func Set(key string, value string, expire time.Duration, serverAddr string) error { .... } ```
服务端配置
服务端采用一致性哈希算法进行负载均衡,每个服务器自带客户端。首先在server.go中进行注册,示例代码如下: ```go func main() { var host string flag.IntVar(&host, "host", "ZhenYin serve host") flag.Parse()
addrMap := map[int]string{
1: "10.0.8.22:9090",
2: "10.0.8.18:9090",
3: "10.0.8.33:9090",
}
var addrs []string
for _, v := range addrMap {
addrs = append(addrs, v)
}
cood := rpcdef.New(host,"9090",addrs)
cood.CoodinatorServe()
select{}
}
然后使用启动脚本启动服务,以Peer1为例:
shell
!/bin/bash
trap "rm server;kill 0" EXIT
go build -o server ./server -host="10.0.8.22" ```
下载地址
点击下载 【提取码: 4003】【解压密码: www.makuang.net】