2024-08-29

Redis 提供了三种日志:

  1. 慢查询日志:记录执行时间超过指定阈值的命令。
  2. 错误日志:记录 Redis 启动、运行或停止时遇到的问题。
  3. 通用日志:记录所有请求的命令和参数。

配置文件中设置:




# 慢查询日志的相关配置
slowlog-log-slower-than 10000   # 慢于10000微秒的命令会被记录,值为0则记录所有命令,-1则不记录
slowlog-max-len 128              # 慢查询日志的最大长度
 
# 错误日志的路径
logfile "/var/log/redis/redis-server.log"
 
# 通用日志的路径和格式
appendonly yes                   # 开启AOF持久化
appendfilename "appendonly.aof"   # AOF文件名
appendfsync everysec              # 每秒同步到磁盘
 
# 如果使用的是Redis 6.0及以上版本,可以使用以下配置
# 这是新的慢查询日志格式,可以直接设置为ON来启用
slowlog-version 1

在运行时可以通过 CONFIG SET 命令临时更改配置,例如:




redis-cli CONFIG SET slowlog-log-slower-than 10000
redis-cli CONFIG SET slowlog-max-len 128
redis-cli CONFIG SET logfile /var/log/redis/redis-server.log
# 开启AOF
redis-cli CONFIG SET appendonly yes
redis-cli CONFIG SET appendfilename "appendonly.aof"
redis-cli CONFIG SET appendfsync everysec
# 如果是Redis 6.0及以上
redis-cli CONFIG SET slowlog-version 1

使用 SLOWLOG GET 命令查看慢查询日志,使用 CONFIG GET 查看和设置配置参数,使用 BGREWRITEAOF 重写 AOF 文件。

注意:日志文件的路径应根据实际服务器环境进行设置,并确保 Redis 进程有权限写入这些文件。

2024-08-29

Redis 提供了 Bitmaps 这种数据类型,主要用于二进制数据的存储。Bitmaps 可以用来实现布隆过滤器(Bloom Filter),用于记录状态或是计数。

Bitmap 提供了 GET、SET、INCR、DECR 等操作,但是这些操作的对象不是 key,而是 key 对应的二进制位。

以下是一些常用的 Bitmap 命令:

  1. SETBIT:设置指定 key 的二进制位的值。



SETBIT key offset value
  1. GETBIT:获取指定 key 的二进制位的值。



GETBIT key offset
  1. BITCOUNT:统计指定 key 中值为 1 的二进制位的数量。



BITCOUNT key
  1. BITOP:对一个或多个二进制位的 key 进行位元操作。



BITOP operation destkey key [key ...]
  1. BITFIELD:对一个二进制位的字符串进行自定义的无符号整数操作。



BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL]

例如,我们可以使用 SETBIT 来设置某个用户的在线状态:




SETBIT user:1000 0 1

这样,我们就可以通过 GETBIT 来获取这个用户的在线状态:




GETBIT user:1000 0

如果我们想要知道有多少用户在线,我们可以从 0 开始,逐位查询:




BITCOUNT user:1000

这些命令可以用于实现用户在线状态、访问统计、用户访问频率统计等功能。

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



# 在OpenResty中配置多级缓存
 
http {
    # ...
 
    upstream tomcat_server {
        server 127.0.0.1:8080;
    }
 
    server {
        listen 80;
 
        # 配置本地缓存
        location /local_cache/ {
            # 设置本地缓存存储路径
            proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
 
            # 启用缓存
            proxy_cache my_cache;
 
            # 缓存有效期
            proxy_cache_valid 200 1d;
 
            # 代理设置
            proxy_pass http://tomcat_server;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
            # 设置缓存键
            proxy_cache_key $uri$is_args$args;
        }
 
        # 配置Redis缓存
        location /redis_cache/ {
            # 设置Redis连接参数
            set $redis_key $uri$is_args$args;
            redis_pass 127.0.0.1:6379;
 
            # 设置缓存查询失败时的回退处理
            default_type text/plain;
            error_page 404 = @tomcat;
 
            # 从Redis缓存中获取数据
            redis_code 200 "get $redis_key";
 
            # 设置缓存有效期
            redis_code 200 "expire $redis_key 1d";
        }
 
        # 请求未命中Redis缓存时,代理到Tomcat服务器
        location @tomcat {
            proxy_pass http://tomcat_server;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 
            # 将响应数据存储到Redis缓存中
            proxy_store on;
            proxy_store_access user:rw group:rw all:rw;
            proxy_temp_path /data/nginx/temp;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_request_body off;
            proxy_pass_request_headers on;
            proxy_connect_timeout 10s;
            proxy_send_timeout 10s;
            proxy_read_timeout 10s;
 
            # 设置数据存储到Redis的键和过期时间
            set $redis_key $uri$is_args$args;
            set_by_lua_block $redis_expire $msec {
                return tonumber(ngx.var.msec) + 86400000;
            }
            lua_shared_dict msec 1m;
            lua_shared_dict redis_commands 1m;
            content_by_lua_block {
                local msec = ngx.shared.msec
                
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()