redis-memory-server
Version:
Redis Server for testing. The server will allow you to connect your favorite client library to the Redis Server and run parallel integration tests isolated from each other.
199 lines (142 loc) • 7.06 kB
Markdown
This package spins up a real Redis server programmatically from Node.js, for testing or mocking during development.
It holds the data in memory. Each `redis-server` process takes about 4Mb of memory.
The server will allow you to connect your favorite client library to the Redis server and run integration tests isolated from each other.
It is inspired heavily by [mongodb-memory-server](https://npmjs.com/package/mongodb-memory-server).
On install, it [downloads](
compiles the `redis-server` binary, and saves it to a cache folder.
On starting a new instance of the in-memory server, if the binary cannot be found,
it will be downloaded and compiled; thus, the first run may take some time.
All further runs will be fast because they will use the downloaded binaries.
This package automatically downloads source code from [https://download.redis.io/](https://download.redis.io/).
Every `RedisMemoryServer` instance starts a fresh Redis server on a free port.
You may start up several `redis-server` processes simultaneously.
When you terminate your script or call `stop()`, the Redis server(s) will be automatically shut down.
It works in Travis CI without additional `services` or `addons` in `.travis.yml`.
- [Redis In-Memory Server](#redis-in-memory-server)
- [Installation](#installation)
- [Requirements](#requirements)
- [Windows:](#windows)
- [Configuring which `redis-server` binary to use](#configuring-which-redis-server-binary-to-use)
- [Usage](#usage)
- [Simple server start](#simple-server-start)
- [Start server via npx](#start-server-via-npx)
- [Available options for RedisMemoryServer](#available-options-for-redismemoryserver)
- [Options which can be set via environment variables](#options-which-can-be-set-via-environment-variables)
- [Options which can be set via `package.json`](#options-which-can-be-set-via-packagejson)
- [Simple test with `ioredis`](#simple-test-with-ioredis)
- [Debug mode](#debug-mode)
- [Credits](#credits)
- [License](#license)
## Installation
```bash
yarn add redis-memory-server --dev
# OR
npm install redis-memory-server --save-dev
```
On install, this package auto-downloads and compiles version `stable` of the `redis-server` binary to `node_modules/.cache/redis-binaries`.
### Requirements
- NodeJS: 16+
- Typescript: 3.8+ (if used)
- `make`
### Windows:
Although Windows is not officially supported by Redis, but there is a downloadable version of [redis: 3.0.503 (June 28, 2016) for win64 by microsoft](https://github.com/ServiceStack/redis-windows#option-3-running-microsofts-native-port-of-redis). This is an older version. It will work for most of the simple tasks like basic storage and pubsub. Probably what is missing or old is lua scripting.
Please note it will download the redis binary from github from URL: `https://raw.githubusercontent.com/ServiceStack/redis-windows/master/downloads/redis-latest.zip`.
Optionally, you could provide your own URL before running `npm install`:
`npx cross-env REDISMS_DOWNLOAD_URL='https://raw.githubusercontent.com/ServiceStack/redis-windows/master/downloads/redis-latest.zip' npm install`
The default behavior is that version `stable` will be downloaded.
You can set configurations via [environment variables](
or via [`package.json`](
```js
import { RedisMemoryServer } from 'redis-memory-server';
const redisServer = new RedisMemoryServer();
const host = await redisServer.getHost();
const port = await redisServer.getPort();
// `redis-server` has been started
// you may use `host` and `port` as connection parameters for `ioredis` (or similar)
// you may check instance status
redisServer.getInstanceInfo(); // returns an object with instance data
// you may stop `redis-server` manually
await redisServer.stop();
// when `redis-server` is killed, its running status should be `false`
redisServer.getInstanceInfo();
// even if you forget to stop `redis-server`,
// when your script exits, a special process killer will shut it down for you
```
```bash
npx redis-memory-server
REDISMS_PORT=6379 npx redis-memory-server
```
All settings are optional.
```js
const redisServer = new RedisMemoryServer({
instance: {
port: number, // by default, choose any free port
ip: string, // by default, '127.0.0.1'; for binding to all IP addresses set it to `::,0.0.0.0`,
args: [], // by default, no additional arguments; any additional command line arguments for `redis-server`
},
binary: {
version: string, // by default, 'stable'
downloadDir: string, // by default, 'node_modules/.cache/redis-memory-server/redis-binaries'
systemBinary: string, // by default, undefined
},
autoStart: boolean, // by default, true
});
```
```sh
REDISMS_DOWNLOAD_DIR=/path/to/redis/binaries
REDISMS_VERSION=6.0.10
REDISMS_DEBUG=1
REDISMS_DOWNLOAD_MIRROR=host
REDISMS_DOWNLOAD_URL=url
REDISMS_DISABLE_POSTINSTALL=1
REDISMS_SYSTEM_BINARY=/usr/local/bin/redis-server
```
You can also use `package.json` to configure the installation process.
It will search up the hierarchy looking for `package.json` files and combine all configurations, where closer `package.json` files take precedence.
Environment variables have higher priority than contents of `package.json` files.
```json
{
"redisMemoryServer": {
"downloadDir": "/path/to/redis/binaries",
"version": "6.0.10",
"debug": "1",
"downloadMirror": "url",
"disablePostinstall": "1",
"systemBinary": "/usr/local/bin/redis-server"
}
}
```
By default, it starts looking for `package.json` files at `process.cwd()`.
To change this:
```ts
import { findPackageJson } from 'redis-memory-server/lib/util/resolve-config';
findPackageJson('/custom/path');
```
Take a look at this [test file](https://github.com/mhassan1/redis-memory-server/blob/main/src/__tests__/singleDB-test.ts).
Debug mode can be enabled with an environment variable or in `package.json`:
```sh
REDISMS_DEBUG=1
```
or
```json
{
"redisMemoryServer": {
"debug": "1"
}
}
```
This package is inspired heavily by [mongodb-memory-server](https://npmjs.com/package/mongodb-memory-server).
MIT