Memurai-Win下的低开销Redis兼容之选
前言
Memurai是一种Windows下的Redis兼容实现,第一次邂逅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的驱逐策略。
安装
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