ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

redis实现在数据处理完成时删除数据

2021-07-04 12:00:20  阅读:162  来源: 互联网

标签:... String 删除 redis databaseNum 数据处理 queueJedis public


使用背景:

  如果存放在redis

 

使用思路:

  在获取

 

具体操作:

  1、构建一个redis工具类

import redis.clients.jedis.Jedis;
import java.util.Arrays;

public class RedisUtils {

    static String scriptLoadId;

    static Jedis queueJedis;

    private int databaseNum;
    
    public RedisUtils(String host, String password, int databaseNum) {
        this.databaseNum = databaseNum;
        queueJedis = new Jedis("127.0.0.1", 6379);
        queueJedis.auth("password!");
        queueJedis.select(databaseNum);
    }

    public RedisUtils spopAndSadd() {
        scriptLoadId = queueJedis.scriptLoad(
                // 把发生数据变更的命令以事务的方式做持久化和主从复制,从而允许在Lua脚本内进行随机写入
                "redis.replicate_commands()\n" +
                        "redis.call('select', " + databaseNum + ")\n" +
                        "local ret = redis.call('spop',KEYS[1])\n" +
                        "if type(ret) == 'boolean' then\n" +
                        "\treturn ret\n" +
                        "else\n" +
                        "\tredis.call('sadd',KEYS[2],ret)\n" +
                        "\treturn ret\n" +
                        "end");
        return this;
    }

    public Object getDataFromRedis(String dataSource, String dataBackup) {
        /**
         * 使用redis的Evalsha 命令根据给定的 sha1 校验码,执行缓存在服务器中的脚本。
         *
         * 执行该命令需要以下四个参数
         * sha1 : 通过 SCRIPT LOAD 生成的 sha1 校验码。
         * numkeys: 用于指定键名参数的个数。
         * key [key ...]: 键名参数。脚本中使用方法(KEYS[1],KEYS[2]...)
         * arg [arg ...]: 附加参数。脚本中使用方法(ARGV[1],ARGV[2]...)
         *
         * jedis 中原始方法如下
         * public Object evalsha(String sha1, int keyCount, String... params) {
         *     1、判断是否开启了事务或管道
         *     2、将参数转化为字节数组,调用connect()构建套接字连接端口,使用RedisOutputStream写入命令给redis
         *     3、返回执行结果     使用RedisInputStream获取执行结果
         * }
         *
         * jedis做了封装, keyCount是计算keys 数组的大小, params是由keys、args合并成新的数组
         * public Object evalsha(String sha1, List<String> keys, List<String> args) {}
         */
        return queueJedis.evalsha(scriptLoadId, Arrays.asList(dataSource, dataBackup), Arrays.asList(""));
    }
}

  2、使用案例

public class Test {
    public static void main(String[] args) {
        RedisUtils redisUtils = new RedisUtils("127.0.0.1", "password", 1);
        Object dataFromRedis = redisUtils.spopAndSadd().getDataFromRedis("dataSource", "dataBackup");
        if (dataFromRedis instanceof String) {
            String text = (String) dataFromRedis;
            System.out.println("完成" + text + "数据消费");
        } else {
            // 数据使用失败,将数据放回原来的redis中,等待下次使用
            redisUtils.spopAndSadd().getDataFromRedis("dataBackup", "dataSource");
        }
    }
}

 

标签:...,String,删除,redis,databaseNum,数据处理,queueJedis,public
来源: https://www.cnblogs.com/yumoblogs/p/14968604.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有