共计 1092 个字符,预计需要花费 3 分钟才能阅读完成。
作者:施洪宝
一. go 基础
go 通过锁或者原子操作解决协程之间的竞争问题, 本文主要介绍锁
go 通过通道 (有缓冲和无缓冲) 解决协程之间的通信问题, 一个协程可能同时与多个其他协程通信, 此时可以通过 select 进行处理
1.1 锁
mutex
mutex 即是一般的互斥锁, 只有一个协程可以获取锁, 其他协程获取时会被阻塞
rwmutex
rwmutex 为读写锁, 某一时刻可能存在多个读锁或者一个写锁
lock 可以获取写锁, 该调用会一直阻塞直到其他协程释放锁, 写锁的优先级高于读锁; unlock 释放写锁
rlock 获取读锁, 当只有读锁或者没有锁时可以成功获取锁, 否则被阻塞; runlock 释放读锁
1.2 select
select{
case communication clause:
statement(s)
case communication clause:
statement(s)
/* 可以定义任意多个 case */
/* default 也可以不定义 */
default:
statement(s)
}
每个 case 必须是 chan 操作, 可以为读或者写
如果只有一个 case 可以执行, 则执行该 case
如果有多个 case 可以执行, 伪随机一个 case 执行, 其他不执行
没有 case 可以执行则执行 default
没有 default 并且没有 case 可以执行则一直阻塞, 直到某个 case 可以执行
二. Codis
Codis 的结构图如下(该图来源于 https://github.com/CodisLabs/…
从 Codis 结构图中可以看出以下几点
codis-group 由多个 codis-server(也就是 redis-server)构成,每个 codis-group 中存在一个 master 服务器和任意多个 slave 服务器
codis-proxy 与每个 codis-group 中的服务器建立连接,并且将自己注册到 zookeeper(或者 etcd 等)中, 客户端从 zookeeper 中获取可用的 codis-proxy, 并与其建立连接, 之后由 codis-proxy 负责处理客户端的请求
codis-dashboard 为 codis 集群管理工具: 能够完成 codis-proxy、codis-group、codis-server 的增加以及删除; 数据在 codis-group 之间的迁移(也就是 slot 迁移)
codis-fe 为集群管理页面
Codis 自带的测试程序
codis-fe 默认监听的端口为 9090
codis-dashboard 默认的监听端口为 18080
codis-proxy 默认的监听端口为 11080
codis-server 默认监听的端口为 6379(也就是 redis 默认的监听端口)