在go中实现redis

rah*_*shr 0 go redis

我正在尝试实现red的基本功能,如下面的Go.

  1. 得到
  2. 组
  3. ZADD
  4. ZCARD
  5. ZCOUNT
  6. ZRANGE
  7. 保存

Did*_*zia 5

如果你想实现一个提供一些Redis功能的Go服务器,这很容易.您需要决定goroutine模型,然后实现/重用一些数据结构(map和skiplist),然后实现Redis协议(这很简单).

我建议使用每个客户端连接2个goroutine的goroutine模型,以及一个用于实现Redis引擎和管理数据结构的goroutine.此模型的好处是您可以轻松支持流水线和Redis命令的原子性属性,而无需任何显式锁定.如果您希望稍后通过支持阻塞命令(例如对队列有用的命令)来扩展范围,则可以很好地调整此模型.

现在,如果您还想模仿相同的Redis行为,那么这更复杂.特别是,使用Go(因为分叉不起作用)将难以在后台利用OS写时复制机制保存数据.对于内存数据库,前台保存总是很容易.背景节省非常困难.

您可能还想查看以下尝试,并简化/丰富它们以符合您的目标: