> For the complete documentation index, see [llms.txt](https://www.ankitavirani.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://www.ankitavirani.com/experience/messaging-caching/redis.md).

# Redis

## Redis: In-Memory Data Structure Store 🚀

Redis (Remote Dictionary Server) is an open-source, in-memory data structure store that can be used as a database, cache, message broker, and queue. It's known for its high performance and versatility.

### Architecture 🏗️

Redis follows a client-server architecture:

<figure><img src="/files/jlinZufWqfUrQ9HCduZW" alt=""><figcaption></figcaption></figure>

### Key Concepts 🗝️

* In-memory data storage
* Key-value data model
* Data structures: Strings, Lists, Sets, Hashes, Sorted Sets
* Pub/Sub messaging
* Transactions
* Lua scripting

### Installation and Setup 🛠️

To install Redis on Ubuntu:

```bash
sudo apt update
sudo apt install redis-server
```

To start Redis server:

```bash
sudo systemctl start redis-server
```

### Basic Redis Commands 💻

Here are some basic Redis commands:

```bash
SET key value
GET key
DEL key
EXISTS key
INCR key
EXPIRE key seconds
```

### Using Redis with Node.js 🟢

First, install the Redis client for Node.js:

```bash
npm install redis
```

Here's a simple example of using Redis with Node.js:

```jsx
const redis = require('redis');
const client = redis.createClient();

client.on('error', (err) => console.log('Redis Client Error', err));

async function main() {
    await client.connect();

    // Set a key
    await client.set('user:1', 'John Doe');

    // Get a key
    const value = await client.get('user:1');
    console.log(value); // Output: John Doe

    // Close the connection
    await client.quit();
}

main();
```

### Redis Data Structures 📊

#### 1. Strings

```jsx
await client.set('mykey', 'Hello, Redis!');
const value = await client.get('mykey');
console.log(value); // Output: Hello, Redis!
```

#### 2. Lists

```jsx
await client.lPush('mylist', 'world');
await client.lPush('mylist', 'hello');
const list = await client.lRange('mylist', 0, -1);
console.log(list); // Output: [ 'hello', 'world' ]
```

#### 3. Sets

```jsx
await client.sAdd('myset', 'member1');
await client.sAdd('myset', 'member2');
const members = await client.sMembers('myset');
console.log(members); // Output: [ 'member1', 'member2' ]
```

#### 4. Hashes

```jsx
await client.hSet('user:1000', 'name', 'John Doe');
await client.hSet('user:1000', 'email', 'john@example.com');
const user = await client.hGetAll('user:1000');
console.log(user); // Output: { name: 'John Doe', email: 'john@example.com' }
```

### Redis Pub/Sub 📡

Redis Pub/Sub implementation:

```jsx
const publisher = redis.createClient();
const subscriber = publisher.duplicate();

await Promise.all([publisher.connect(), subscriber.connect()]);

await subscriber.subscribe('news', (message) => {
    console.log(message); // 'Hello world!'
});

await publisher.publish('news', 'Hello world!');
```

### Redis Transactions 🔒

Example of a Redis transaction:

```jsx
const multi = client.multi();
multi.set('key1', 'value1');
multi.set('key2', 'value2');
const results = await multi.exec();
console.log(results); // Output: ['OK', 'OK']
```

### Deployment 🚀

For production deployment, consider using Redis Cloud or setting up a Redis cluster for high availability and scalability. Always ensure proper security measures are in place, such as authentication and encryption.

&#x20;Remember to configure Redis for persistence if you need data to survive server restarts. You can use RDB snapshots or AOF (Append Only File) for this purpose.

With its speed, versatility, and rich feature set, Redis is an excellent choice for various use cases in modern application development, from caching to real-time analytics and more.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://www.ankitavirani.com/experience/messaging-caching/redis.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
