概述
- 首先我们通过hiredis 向redis 中写入了数据,这里我们主要以测试为目的,所以,Key 值设定为毫秒级时间戳。
- 但是当我们测试完成之后,需要验证实际情况,这里我们直接使用redis-cli 登录数据库看看。
- 本次测试完成,接下来要结合业务开始测试,需要清理数据库,但是一条一条的删除太慢了。这里给出lua 脚本,以及使用方式。
接下来为具体实际内容。
详述
通过消息队列接收数据,并向redis中存储。
使用技术栈:ZeroMQ、redis
简述:通过消息队列接收转发的消息内容,存储到缓存数据库中。
key-value: 毫秒级时间戳-消息内容
/* * @Author : Zry && 978524088@qq.com * @Date : 2023-07-05 15:31:34 * @LastEditors : Zry && 978524088@qq.com * @LastEditTime : 2023-07-05 15:46:04 * @FilePath : /zryTest/src/include/redis/redis_zmq/receiver.c * @Description : * * Copyright (c) 2023 by 978524088@qq.com, All Rights Reserved. */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <zmq.h> #include <hiredis/hiredis.h> // 定义Redis服务器的地址和端口 #define REDIS_HOST "127.0.0.1" #define REDIS_PORT 6379 // 定义消息的最大长度 #define MAX_MESSAGE_SIZE 1024 long long current_timestamp() { struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return ts.tv_sec * 1000LL + ts.tv_nsec / 1000000LL; } int main() { // 创建zmq的上下文和socket,用于接收路由消息 void *context = zmq_ctx_new(); void *socket = zmq_socket(context, ZMQ_ROUTER); zmq_bind(socket, "tcp://*:5566"); while (1) { // 接收路由消息的各个部分 zmq_msg_t identity; zmq_msg_init(&identity); zmq_msg_recv(&identity, socket, 0); zmq_msg_t empty; zmq_msg_init(&empty); zmq_msg_recv(&empty, socket, 0); zmq_msg_t message; zmq_msg_init(&message); zmq_msg_recv(&message, socket, 0); // 获取消息内容和类型 char *content = (char *)zmq_msg_data(&message); size_t content_size = zmq_msg_size(&message); char *type = (char *)zmq_msg_data(&empty); size_t type_size = zmq_msg_size(&empty); // 获取当前时间戳 long long timestamp = current_timestamp(); // 将消息存储到Redis缓存中 redisContext *redis = redisConnect(REDIS_HOST, REDIS_PORT); if (redis != NULL && redis->err == 0) { // 构造Key char key[256]; snprintf(key, sizeof(key), "%lld:%.*s", timestamp, (int)type_size, type); // 存储消息内容到Redis redisReply *reply = (redisReply *)redisCommand(redis, "SET %s %b", key, content, content_size); freeReplyObject(reply); // 打印存储结果 printf("Stored message: %s\n", key); // 断开与Redis服务器的连接 redisFree(redis); } else { printf("Failed to connect to Redis server\n"); } // 释放消息 zmq_msg_close(&identity); zmq_msg_close(&empty); zmq_msg_close(&message); } // 关闭zmq的socket和上下文 zmq_close(socket); zmq_ctx_destroy(context); return 0; }
通过 redis-cli 登录数据库查看具体的数据内容。
要通过Redis直接查看数据内容,你可以使用Redis的命令行工具redis-cli来连接到Redis服务器,并执行相应的命令来查看数据。
以下是一些常用的Redis命令,可以帮助你查看数据内容:
查看所有键:使用KEYS *命令可以列出所有的键。
KEYS *
获取键的值:使用GET命令可以获取指定键的值。
GET key
将key替换为你要查看的键的名称。
获取哈希表的字段和值:使用HGETALL命令可以获取指定哈希表的所有字段和值。
HGETALL hash
将hash替换为你要查看的哈希表的名称。
获取列表的元素:使用LRANGE命令可以获取指定列表的指定范围内的元素。
LRANGE list start stop
将list替换为你要查看的列表的名称,start和stop分别替换为范围的起始和结束索引。
获取集合的元素:使用SMEMBERS命令可以获取指定集合的所有元素。
SMEMBERS set
将set替换为你要查看的集合的名称。
获取有序集合的元素:使用ZRANGE命令可以获取指定有序集合的指定范围内的元素。
ZRANGE zset start stop
将zset替换为你要查看的有序集合的名称,start和stop分别替换为范围的起始和结束索引。
这里我使用 KEYS *查看,因为现在只有我存储的少量数据
127.0.0.1:6379> KEYS * ....... 1054) "3673007893:Hello, world!" 1055) "3673008590:" 1056) "3673009630:test" 1057) "3673010538:" 1058) "3673008562:" 1059) "3673010512:client" 1060) "3673008640:Hello, world!" 1061) "3673009571:client" 1062) "3673010513:Hello, world!" 1063) "3673006965:Hello, world!" 1064) "3673008613:Hello, world!" 1065) "3673006999:Hello, world!"
至此可以确认,数据已经从消息队列读取出,并保存到数据库中了。
使用lua 脚本 清理数据内容。
接下来,将设计具体消息内容,key 键种类、过期时间、为了数据干净,现在先要把当前存在的数据清理掉。
因为redis 我没找到直接形如 DEL * 的方式删掉全部,所以干脆通过lua 脚本 来批量删除
使用以下 的Lua脚本来批量删除键:
local keys = redis.call('KEYS', ARGV[1]) for i, key in ipairs(keys) do redis.call('DEL', key) end
将这个修正后的Lua脚本保存到一个文件中,例如delete_keys.lua。
然后,使用以下命令来执行Lua脚本并批量删除键:
redis-cli EVAL "$(cat delete_keys.lua)" 0 prefix:*
将prefix:*替换为实际的键的模式。
这个命令使用了Redis的EVAL命令和Lua脚本。它通过EVAL命令执行Lua脚本,并将键的模式作为参数传递给Lua脚本。Lua脚本使用KEYS命令获取匹配模式的键的列表,并使用DEL命令多次调用来删除每个键。
请注意,使用DEL命令删除键是不可逆的操作,一旦删除就无法恢复。在执行删除操作之前,请确保你已经备份了需要保留的数据。