【实战】使用Lua脚本怎么清理redis中的数据【实战】使用Lua脚本怎么清理redis中的数据

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 首先我们通过hiredis 向redis 中写入了数据,这里我们主要以测试为目的,所以,Key 值设定为毫秒级时间戳。

概述

  1. 首先我们通过hiredis 向redis 中写入了数据,这里我们主要以测试为目的,所以,Key 值设定为毫秒级时间戳。
  2. 但是当我们测试完成之后,需要验证实际情况,这里我们直接使用redis-cli 登录数据库看看。
  3. 本次测试完成,接下来要结合业务开始测试,需要清理数据库,但是一条一条的删除太慢了。这里给出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命令删除键是不可逆的操作,一旦删除就无法恢复。在执行删除操作之前,请确保你已经备份了需要保留的数据。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
缓存 NoSQL Java
基于SpringBoot的Redis开发实战教程
Redis在Spring Boot中的应用非常广泛,其高性能和灵活性使其成为构建高效分布式系统的理想选择。通过深入理解本文的内容,您可以更好地利用Redis的特性,为应用程序提供高效的缓存和消息处理能力。
180 79
|
6月前
|
NoSQL 安全 测试技术
Redis游戏积分排行榜项目中通义灵码的应用实战
Redis游戏积分排行榜项目中通义灵码的应用实战
152 4
|
7月前
|
缓存 NoSQL Redis
Redis 脚本
10月更文挑战第18天
72 3
|
3月前
|
缓存 NoSQL 搜索推荐
【📕分布式锁通关指南 03】通过Lua脚本保证redis操作的原子性
本文介绍了如何通过Lua脚本在Redis中实现分布式锁的原子性操作,避免并发问题。首先讲解了Lua脚本的基本概念及其在Redis中的使用方法,包括通过`eval`指令执行Lua脚本和通过`script load`指令缓存脚本。接着详细展示了如何用Lua脚本实现加锁、解锁及可重入锁的功能,确保同一线程可以多次获取锁而不发生死锁。最后,通过代码示例演示了如何在实际业务中调用这些Lua脚本,确保锁操作的原子性和安全性。
172 6
【📕分布式锁通关指南 03】通过Lua脚本保证redis操作的原子性
|
2月前
|
缓存 NoSQL 测试技术
Redis压测脚本及持久化机制
Redis压测脚本及持久化机制简介: Redis性能压测通过`redis-benchmark`工具进行,可评估读写性能。持久化机制包括无持久化、RDB(定期快照)和AOF(操作日志),以及两者的结合。RDB适合快速备份与恢复,但可能丢失数据;AOF更安全,记录每次写操作,适合高数据安全性需求。两者结合能兼顾性能与安全性,建议同时开启并定期备份RDB文件以确保数据安全。
59 9
|
3月前
|
NoSQL Redis 数据库
Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
通过本文的介绍,我们详细讲解了 Lua 脚本在 Redis 中的作用、`eval` 命令的使用方法以及 `redis.call` 和 `redis.pcall` 的区别和用法。通过合理使用 Lua 脚本,可以实现复杂的业务逻辑,确保操作的原子性,并减少网络开销,从而提高系统的性能和可靠性。
125 13
|
5月前
|
监控 安全
公司用什么软件监控电脑:Lua 脚本在监控软件扩展功能的应用
在企业环境中,电脑监控软件对保障信息安全、提升效率至关重要。Lua 脚本在此类软件中用于扩展功能,如收集系统信息、监控软件使用时长及文件操作,向指定服务器发送数据,支持企业管理和运营。
84 6
|
7月前
|
缓存 NoSQL Java
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
132 3
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
|
7月前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:优化百万数据查询的实战经验
【10月更文挑战第13天】 在处理大规模数据集时,传统的关系型数据库如MySQL可能会遇到性能瓶颈。为了提升数据处理的效率,我们可以结合使用MySQL和Redis,利用两者的优势来优化数据查询。本文将分享一次实战经验,探讨如何通过MySQL与Redis的协同工作来优化百万级数据统计。
362 5
|
7月前
|
缓存 NoSQL Java
Spring Boot与Redis:整合与实战
【10月更文挑战第15天】本文介绍了如何在Spring Boot项目中整合Redis,通过一个电商商品推荐系统的案例,详细展示了从添加依赖、配置连接信息到创建配置类的具体步骤。实战部分演示了如何利用Redis缓存提高系统响应速度,减少数据库访问压力,从而提升用户体验。
324 2

热门文章

最新文章