Win下的低开销Redis兼容之选-Memurai

第一次邂逅Memurai是在2019年暑假,当时在Windows上使用老旧的Redis 3.x构建时遇到了一些奇怪的问题,找不到解决方案。跑虚拟机/Docker Desktop的话启动慢并且吃资源,WSL1兼容性(I/O太差)又不给力。折腾许久,最后在StackOverflow上发现了这个Redis的兼容实现–Memurai。当时Memurai还是1.x,似乎在Preview阶段,兼容Redis5的API,试用一番后还算满意,没有什么大坑,日常使用Windows开发时可以考虑使用。

一年多过去了,它依旧不温不火(甚至热度更低了),大概是因为在Windows上跑一个Redis实例本身就不是刚需,加上WSL2的诞生,性能和稳定性略更胜一筹,使得Memurai更无人问津了。对了,它还有商业化的计划,免费版本存在限制。但不可否认,它依旧是一个轻量易用的Redis兼容实现,对于不想折腾WSL2或者的机器性能吃紧的同学来说是一个选择。

在Windows下使用Redis的一些建议

  • 使用原生3.x构建:不推荐,早已被官方放弃支持,版本太老
  • 使用虚拟机:不推荐,大材小用,启动慢,吃资源
  • 使用Docker Desktop:不推荐,基于Hyper-V,本质还是虚拟机,启动慢,吃资源
  • 使用Memurai较为推荐,轻量、易用,但不能完全与Redis划等号,免费版存在限制
  • 使用WSL2推荐,依旧基于Hyper-V,但拥有很多黑魔法,启动快,支持内存动态分配

注:WSL2依旧存在page cache回收策略不合理导致占满宿主内存的问题,临时的解决方法是限制最大内存用量

开发缘由

以下两端翻译自官方博客

从历史上看,寻找受支持的Redis Windows版本的开发人员很不幸。没有Redis官方的Windows构建,大多数其他选择都有相同的缺点:不是原生的Windows程序。开发人员不能将广受欢迎的Redis数据结构完美集成到Windows基础结构中,也无法享受原生实现带来的性能和可靠性的提升。此外,官方已放弃Windows下的Redis,连Redis的正式Microsoft Open Tech版本也已存档不再更新。

PS:得益于Hyper-V优秀的虚拟化性能,WSL2中运行的Redis依旧能吊打Memurai

特性

Memurai是Windows平台下Redis 5的兼容实现。它旨在提供企业级Windows环境所需的可靠性和性能。与Redis一样,Memurai使用基于内存的数据结构来大幅提升性能,并且Memurai支持了所有Redis功能,例如持久性,复制,事务,LUA脚本,高可用性,发布/订阅,群集,模块,Stream和LRU数据驱逐。并且,Memurai支持所有Redis 5的驱逐策略。

安装

官方网站:https://www.memurai.com/

下载页面:https://www.memurai.com/get-memurai

1.我们打开下载页面,找到Developer Edition,点击FREE DOWNLOAD即可下载免费版本。

事实上,Memurai还提供企业版,不过真到大规模应用,有几个人会选择Win Server呢?

2.下载完成后我们得到了一个标准msi安装包,直接安装就可以了

3.安装过程中可以配置一下端口,默认会安装为服务

4.安装完就可以退出了,Memurai已经被安装为系统服务

使用

安装时会自动将Memurai的根目录添加到环境变量PATH中,我们来看一下有什么内容

可以看到可执行文件都是以memurai开头,比如redis-cli就是memurai-cli

使用CLI

我们需要用memurai-cli,两者只是bin名字不同,API是完全兼容的

修改配置

配置文件为根目录下的memurai.conf,它提供和Redis一样丰富的配置,修改完用net指令重启服务就可以了

更多选项可查阅官方文档https://docs.memurai.com/

性能

Memurai并不自带redis-benchmark工具,可以到官方的3.x构建中拿一个用

由于时间关系,这里完全使用默认参数做一个压测

篇幅所限,删除了结果中的参数,压测参数如下

100000 requests
50 parallel clients
3 bytes payload
keep alive: 1

压测结果

还是比较优秀的,性能比在WSL2中运行的Redis实例低20%左右,但它是原生应用,静默状态下对宿主机资源的占用非常低。在WSL2中跑Redis虽然性能好,但吃宿主内存的缺点不容忽视。如果只是用Memurai做日常开发的兼容,那么它在易用性和省资源上有很大的优势,内存吃紧的小伙伴可以尝试一下它。

====== PING_INLINE ======
99.76% <= 1 milliseconds
100.00% <= 1 milliseconds
60790.27 requests per second

====== PING_BULK ======
99.87% <= 1 milliseconds
100.00% <= 1 milliseconds
60496.07 requests per second

====== SET ======
99.38% <= 1 milliseconds
99.93% <= 2 milliseconds
99.95% <= 3 milliseconds
99.95% <= 16 milliseconds
99.95% <= 18 milliseconds
99.97% <= 19 milliseconds
100.00% <= 20 milliseconds
59559.26 requests per second

====== GET ======
99.87% <= 1 milliseconds
100.00% <= 1 milliseconds
60240.96 requests per second

====== INCR ======
99.91% <= 1 milliseconds
100.00% <= 1 milliseconds
61690.31 requests per second

====== LPUSH ======
99.74% <= 1 milliseconds
100.00% <= 2 milliseconds
100.00% <= 2 milliseconds
61690.31 requests per second

====== LPOP ======
99.90% <= 1 milliseconds
100.00% <= 1 milliseconds
62266.50 requests per second

====== SADD ======
99.86% <= 1 milliseconds
100.00% <= 1 milliseconds
61842.92 requests per second

====== SPOP ======
99.81% <= 1 milliseconds
99.96% <= 4 milliseconds
100.00% <= 4 milliseconds
62539.09 requests per second

====== LPUSH (needed to benchmark LRANGE) ======
99.56% <= 1 milliseconds
100.00% <= 2 milliseconds
100.00% <= 2 milliseconds
61957.87 requests per second

====== LRANGE_100 (first 100 elements) ======
59.46% <= 1 milliseconds
99.88% <= 2 milliseconds
100.00% <= 3 milliseconds
100.00% <= 3 milliseconds
24881.81 requests per second

====== LRANGE_300 (first 300 elements) ======
0.01% <= 1 milliseconds
75.39% <= 2 milliseconds
99.46% <= 3 milliseconds
99.96% <= 4 milliseconds
100.00% <= 4 milliseconds
12858.43 requests per second

====== LRANGE_500 (first 450 elements) ======
0.00% <= 1 milliseconds
0.16% <= 2 milliseconds
88.08% <= 3 milliseconds
99.49% <= 4 milliseconds
99.94% <= 5 milliseconds
100.00% <= 5 milliseconds
9521.09 requests per second

====== LRANGE_600 (first 600 elements) ======
0.00% <= 1 milliseconds
0.04% <= 2 milliseconds
20.20% <= 3 milliseconds
94.76% <= 4 milliseconds
99.82% <= 5 milliseconds
99.94% <= 6 milliseconds
100.00% <= 6 milliseconds
7572.89 requests per second

====== MSET (10 keys) ======
98.77% <= 1 milliseconds
99.91% <= 2 milliseconds
100.00% <= 2 milliseconds
62383.03 requests per second

Azure99

计算机专业学生,已经大三啦,是只休闲音游玩家,喜欢折腾vps、玩机,偶尔写写代码

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注