2024-08-29

安装Redis的步骤通常如下:

  1. 下载Redis源码:



wget http://download.redis.io/releases/redis-6.2.6.tar.gz
  1. 解压源码:



tar xzf redis-6.2.6.tar.gz
  1. 进入解压后的Redis目录:



cd redis-6.2.6
  1. 编译Redis:



make
  1. 安装Redis(可选):



sudo make install
  1. 启动Redis服务器:



src/redis-server
  1. 可选:安装Redis的初始化脚本,以便可以将Redis作为服务运行:



sudo make install-server
  1. 配置Redis(可选):

    编辑 /etc/redis/redis.conf 文件,根据需要进行配置。

  2. 启动Redis服务:



sudo systemctl start redis.service
  1. 使Redis服务开机自启:



sudo systemctl enable redis.service

请根据你的操作系统和需求选择适当的步骤。上述步骤以Linux系统为例。如果你使用的是Windows,你可能需要下载Windows兼容的Redis版本或者使用WSL(Windows子系统Linux)。

2024-08-29

在Redis中,管道(Pipeline)是一种提高客户端和服务器之间大量请求传输效率的方法。它可以将多条指令打包发送到服务器,而不是逐条发送,从而减少了客户端与服务器之间的网络往返时间(RTT),提高了数据处理的吞吐量。

以下是一个使用Python的redis-py库来演示管道(Pipeline)的例子:




import redis
 
# 连接到Redis服务器
r = redis.Redis(host='localhost', port=6379, db=0)
 
# 开启管道
pipe = r.pipeline()
 
# 使用管道批量设置键值对
pipe.set('key1', 'value1')
pipe.set('key2', 'value2')
pipe.set('key3', 'value3')
 
# 执行管道中的所有命令
pipe.execute()
 
# 使用管道批量获取键对应的值
pipe.get('key1')
pipe.get('key2')
pipe.get('key3')
 
# 执行管道中的所有命令并获取结果
values = pipe.execute()
 
print(values)  # 输出结果列表,包含'key1', 'key2', 'key3'对应的值

在这个例子中,我们首先创建了一个Redis连接,然后开启了一个管道。接着,我们使用管道来批量设置三个键值对,然后执行这些命令。最后,我们使用管道来批量获取这三个键对应的值,并再次执行这些命令来获取结果。这样做既减少了RTT,也提高了数据处理的效率。

2024-08-29

Redis的EVAL命令用于在Redis服务器上直接执行Lua脚本。Lua脚本可以用来执行更复杂的操作,它在Redis内部被解析和执行,不需要从Redis解析到外部应用程序。

在Java中,你可以使用Jedis库来执行Redis的EVAL命令。以下是一个使用Jedis执行Redis Lua脚本的例子:




import redis.clients.jedis.Jedis;
 
public class RedisEvalExample {
    public static void main(String[] args) {
        // 连接到Redis服务器
        Jedis jedis = new Jedis("localhost", 6379);
 
        // Lua脚本
        String script = "return redis.call('get', KEYS[1])";
 
        // 脚本参数
        List<String> keys = Arrays.asList("key"); // 假设我们有一个名为"key"的键
 
        // 脚本参数
        List<String> args = Arrays.asList("arg1", "arg2");
 
        // 执行Lua脚本
        Object result = jedis.eval(script, keys, args);
 
        System.out.println("Result: " + result);
 
        // 关闭连接
        jedis.close();
    }
}

在这个例子中,我们连接到Redis服务器,然后执行一个简单的Lua脚本,该脚本尝试获取与KEYS[1]对应的键的值。"key"是我们传递给脚本的唯一键。args是传递给脚本的参数列表,在这个例子中没有用到,但你可以根据需要来使用。最后,我们打印出结果并关闭连接。

2024-08-29

在CentOS 7上安装Redis的步骤如下:

  1. 使用yum安装Redis:



sudo yum install epel-release -y
sudo yum update -y
sudo yum install redis -y
  1. 启动Redis服务并设置开机自启:



sudo systemctl start redis
sudo systemctl enable redis
  1. 验证Redis是否正在运行:



redis-cli ping

如果返回PONG,则表示Redis正在正常运行。

  1. (可选)配置Redis:

    编辑Redis配置文件/etc/redis.conf,根据需要进行配置更改。

  2. (可选)设置Redis密码:

    /etc/redis.conf中找到# requirepass foobared这行,去掉注释并将foobared替换为你的密码。

  3. 重启Redis服务以应用配置更改:



sudo systemctl restart redis

以上步骤会在CentOS 7上安装Redis,并确保它随系统启动。如果需要更高级的配置,请编辑/etc/redis.conf文件。

2024-08-29

redis-benchmark 是 Redis 官方提供的性能测试工具,用于测试 Redis 在特定条件下的性能。

基本使用方法如下:




redis-benchmark [option] [option value]

常用参数:

  • -h 指定服务器的 host 默认是 127.0.0.1
  • -p 指定服务器端口 默认是 6379
  • -s 指定服务器 socket
  • -c 并发连接数 默认是 50
  • -n 请求总数 默认是 100000
  • -d 数据大小 默认是 3 bytes
  • --csv 将结果以 CSV 格式输出
  • --latency 测试延迟
  • --timeout 超时时间 默认是 30s
  • --idle 测试空闲数据库连接性能
  • --dbnum 测试的数据库数量 默认是 16
  • --acl 指定 ACL 规则
  • --user 指定用户名
  • --pass 指定密码
  • \`--ssl 使用 SSL 连接
  • --lua-script 指定 Lua 脚本路径
  • --set-client-output-buffer-limit 设置客户端输出缓冲区大小
  • \`--no-loop 不循环执行测试

实例代码:




# 测试本地 Redis 默认设置
redis-benchmark
 
# 测试指定的 host 和 port
redis-benchmark -h localhost -p 6379
 
# 测试 10000 个请求
redis-benchmark -n 10000
 
# 使用 50 个并发连接
redis-benchmark -c 50
 
# 设置数据大小为 1KB
redis-benchmark -d 1024
 
# 将结果输出为 CSV 格式
redis-benchmark --csv
 
# 设置超时时间为 60 秒
redis-benchmark --timeout 60
 
# 测试 Lua 脚本性能
redis-benchmark --lua-script my_script.lua

以上命令行参数可以根据实际需要进行组合使用,以测试不同条件下的 Redis 性能。

2024-08-29



# 安装ZanRedisDB之前,请确保已经安装了Redis和Jemalloc
# 安装Redis和Jemalloc可以使用以下命令
sudo apt-get install redis-server libjemalloc-dev

# 下载ZanRedisDB源码
git clone https://github.com/ZanKr/ZanRedisDB.git
cd ZanRedisDB

# 编译ZanRedisDB
make

# 安装ZanRedisDB
sudo make install

# 配置ZanRedisDB
# 修改配置文件 /path/to/ZanRedisDB/conf/redis.conf
# 比如设置最大内存为2GB
maxmemory 2gb

# 启动ZanRedisDB实例
# 使用自定义的配置文件启动
redis-server /path/to/ZanRedisDB/conf/redis.conf

# 注意:以上命令仅为示例,具体路径和配置需要根据实际环境进行调整。

这个示例展示了如何在类Unix系统中从源码安装ZanRedisDB,并进行基本的配置。在实际部署时,需要根据具体的操作系统和环境进行调整。

2024-08-29

在Spring Boot中,可以使用spring-boot-starter-data-redis库来实现Redis消息的订阅与分布。以下是一个简单的例子,展示如何使用Spring Data Redis实现发布/订阅模式。

首先,在pom.xml中添加依赖:




<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

然后,配置Redis消息监听器容器:




@Configuration
public class RedisConfig {
 
    @Autowired
    private RedisConnectionFactory redisConnectionFactory;
 
    @Bean
    RedisMessageListenerContainer redisMessageListenerContainer() {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(redisConnectionFactory);
        return container;
    }
}

创建一个消息监听器来处理接收到的消息:




@Component
public class RedisMessageSubscriber implements MessageListener {
 
    @Override
    public void onMessage(Message message, byte[] pattern) {
        String receivedMessage = new String(message.getBody(), StandardCharsets.UTF_8);
        System.out.println("Received Message: " + receivedMessage);
        // 根据接收到的消息进行业务逻辑处理
    }
}

最后,发布消息:




@Service
public class RedisMessagePublisher {
 
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
 
    public void publish(String channel, String message) {
        stringRedisTemplate.convertAndSend(channel, message);
    }
}

在上述代码中,我们定义了一个配置类RedisConfig来创建RedisMessageListenerContainer,并设置了连接工厂。我们还实现了一个RedisMessageSubscriber类来监听消息,并在其中处理接收到的消息。RedisMessagePublisher服务用于发布消息到指定的频道。

要订阅一个频道,你需要在RedisMessageSubscriber中设置你感兴趣的频道,并将其注册到RedisMessageListenerContainer




@Component
public class RedisMessageSubscriber implements MessageListener {
 
    @Autowired
    private RedisMessageListenerContainer redisMessageListenerContainer;
 
    @PostConstruct
    public void subscribe()
2024-08-29



import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
 
@Configuration
public class RedisConfig {
 
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
 
        // 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
 
        // 配置template的序列化方式
        template.setDefaultSerializer(jackson2JsonRedisSerializer);
 
        return template;
    }
 
    @Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
 
        // 设置键的序列化方式
        template.setKeySerializer(new StringRedisSerializer());
        // 设置值的序列化方式
        template.setValueSerializer(new StringRedisSerializer());
 
        return template;
    }
}

这段代码定义了两个Bean,一个用于序列化Object的RedisTemplate和一个用于操作字符串的StringRedisTemplate。通过自定义Jackson2JsonRedisSerializer来实现对象的序列化与反序列化,以便于存储复杂类型的数据。同时,它展示了如何设置RedisTemplate的默认序列化方式和键值的特定序列化方式。这是一个在Spring Boot项目中整合Redis的实践案例。

2024-08-29

Redis 的 Sorted Set(有序集合)是一种数据类型,它不仅存储元素,而且还将每个元素关联到一个浮点数的分数。在 Sorted Set 中,元素是唯一的,但分数可以重复。Sorted Set 中的元素按分数进行排序,分数可以升序或降序排序。

一、命令语法:

  1. ZADD key [NX|XX] [CH] [INCR] score member [score member ...]:将一个或多个成员元素及其分数值加入到有序集当中。
  2. ZCARD key:获取有序集的成员数。
  3. ZCOUNT key min max:计算在有序集中分数在 min 和 max 之间的成员的数量。
  4. ZINCRBY key increment member:有序集成员的分数加上增量 increment。
  5. ZRANGE key start stop [WITHSCORES]:通过索引区间返回有序集成员。
  6. ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]:根据分数返回有序集成员的列表。
  7. ZRANK key member:返回有序集成员的排名。
  8. ZREM key member [member ...]:移除有序集中的一个或多个成员。
  9. ZREVRANGE key start stop [WITHSCORES]:有序集成员按分数从高到低排列。
  10. ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]:有序集成员按分数从高到低排列。
  11. ZREVRANK key member:返回有序集成员的排名,成员按分数从高到低排列。
  12. ZSCORE key member:获取有序集中成员的分数。
  13. ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [SUM|MIN|MAX]:计算给定的一个或多个有序集的并集,并存储在新的有序集合 key 中。
  14. ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [SUM|MIN|MAX]:计算给定的一个或多个有序集的交集,并存储在新的有序集合 key 中。

二、操作示例:

  1. 添加成员到 Sorted Set:



ZADD myzset 1 "one"
ZADD myzset 2 "two" 3 "three"
  1. 获取 Sorted Set 的成员数:



ZCARD myzset
  1. 获取 Sorted Set 指定分数范围内的成员:



ZRANGEBYSCORE myzset 1 3
  1. 获取 Sorted Set 的成员分数:



ZSCORE myzset "two"
  1. 移除 Sorted Set 的成员:



ZREM myzset "one"

三、命令返回值:

  1. ZADD:返回被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员的分数。
  2. ZCARD:返回有序集的成员数。
  3. ZCOUNT:返回分数在 min 和 max 之间的成员的数量。
  4. ZINCRBY:返回新的成员分数值。
  5. ZRANGEZRANGEBYSCORE:返回指定范围内的成员列表。
  6. ZRANK
2024-08-29



import { Module, Global } from '@nestjs/common';
import { RedisModule } from 'nestjs-redis-module';
 
@Global() // 全局模块
@Module({
  imports: [
    RedisModule.register({
      host: 'localhost',
      port: 6379,
      db: 0,
    }),
  ],
  exports: [RedisModule],
})
export class RedisConfigModule {}
 
// 在其他模块中使用
import { Module } from '@nestjs/common';
import { RedisConfigModule } from './redis-config.module';
 
@Module({
  imports: [RedisConfigModule],
  // 其他配置...
})
export class AnyModule {}

这段代码展示了如何在NestJS中设置一个全局的Redis配置模块,并在其他模块中导入它。这样做可以确保Redis客户端在整个应用程序中是共享的,并且可以在一个地方管理配置。