Redis笔记架构介绍(redis笔记架构介绍)

2023-05-16 05:09:56 架构 介绍 笔记

Redis笔记:架构介绍

Redis是一种快速、高效的内存数据库,具有可扩展性、高可用性和数据类型丰富等优点,在各种应用场景中被广泛应用。在介绍具体使用方式之前,我们先来了解一下Redis的架构。

Redis的架构可以分成3个部分:客户端、中间件和存储层。

一、客户端

Redis支持多种客户端协议,如Redis命令行协议、HTTP协议以及各种编程语言所支持的Redis客户端库。客户端是与Redis服务器进行通信的一方,负责发送请求、接收响应和处理数据。

客户端通过一个指向服务器的TCP连接与Redis进行通信。并且可以通过多路复用技术,在同一个连接中发送多个请求和接收多个响应。

客户端的设计是非常简单的,因为其核心功能只是将请求封装成协议的形式,然后将其发送给Redis服务器。为了提高应用的并发能力和效率,可以使用连接池技术,复用连接,最大化地利用连接资源。

二、中间件

Redis的中间件负责将客户端请求路由到不同的Redis服务器上,实现Redis的分布式存储。中间件可以是自己开发的,也可以是市面上已有的中间件产品,如Twemproxy、Codis、Redis-cluster等。

中间件的核心功能是数据的路由、负载均衡和数据一致性的维护。通过对多个Redis服务器之间的数据进行分布式管理和数据同步,确保数据的高可用和数据的一致性。

从性能角度考虑,中间件的设计要高效,能够支持高并发访问和大规模的Redis服务器集群。

三、存储层

Redis的存储层是真正存储数据的地方。Redis可以将数据存储在内存中,也可以将数据持久化到磁盘上。Redis的存储层包括了多个具有不同职能的模块,例如:

1.管理内存的内存分配器;

2.数据结构的实现,如字符串、列表、集合、有序集合等;

3.数据的持久化模块,可以将数据保存到磁盘上,以免数据丢失;

4.数据的淘汰机制,当内存不够用时,Redis会根据一些策略,选择一些数据进行删除。

Redis的存储层设计非常简单,具有很好的扩展性和可维护性,支持多线程、异步IO等技术,提高了系统的并发访问能力和数据处理能力。

综上所述,Redis的架构非常清晰简单,每个部分都具有明确的职责和任务。在实际应用中可以根据自己的需求,选择不同的客户端协议、中间件和存储模式,灵活地搭建Redis应用。

代码示例:

// Redis连接池实现

import redis.clients.jedis.JedisPool;

import redis.clients.jedis.JedisPoolConfig;

public class RedisPool {

private static JedisPool pool; // Jedis连接池

private static String ADDR = “127.0.0.1”; // Redis IP

private static int PORT = 6379; // Redis 端口号

private RedisPool() {

}

public static JedisPool getJedisPool() {

if (pool == null) {

JedisPoolConfig config = new JedisPoolConfig();

config.setMaxTotal(200); // 最大连接数

config.setMaxIdle(100); // 连接池最大空闲数

config.setMaxWtMillis(10000); // 最大等待时间

pool = new JedisPool(config, ADDR, PORT);

}

return pool;

}

}

// Redis连接池使用示例

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;

import redis.clients.jedis.JedisPoolConfig;

public class RedisUtils {

private static JedisPool jedisPool = RedisPool.getJedisPool();

private static final int TIMEOUT = 5000; // 连接超时时间

/**

* 获取Jedis对象

*/

public static Jedis getJedis() {

Jedis jedis = null;

try {

jedis = jedisPool.getResource();

jedis.connect(); //重新连接

} catch (Exception e) {

e.printStackTrace();

}

return jedis;

}

/**

* 归还Jedis对象

*/

public static void returnResource(Jedis jedis) {

if (jedis != null && jedisPool != null) {

jedis.flushDB(); // 清空当前库中的所有数据

jedis.close();

}

}

}

// Redis操作示例

import redis.clients.jedis.Jedis;

import java.util.Set;

public class RedisDemo {

private static Jedis jedis = RedisUtils.getJedis();

public static void mn(String[] args) {

// 操作字符串

jedis.set(“name”, “Tom”);

String name = jedis.get(“name”);

System.out.println(“Name is ” + name);

// 操作集合

jedis.sadd(“fruits”, “apple”, “banana”, “orange”);

Set fruits = jedis.smembers(“fruits”);

for (String fruit : fruits) {

System.out.println(fruit);

}

// 操作有序集合

jedis.zadd(“scores”, 100, “Tom”);

jedis.zadd(“scores”, 90, “Jerry”);

jedis.zadd(“scores”, 80, “Mike”);

Set topScores = jedis.zrevrange(“scores”, 0, 2);

for (String score : topScores) {

System.out.println(score);

}

RedisUtils.returnResource(jedis);

}

}

相关文章