栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

记录一次rediscluster 调用lua 脚本, 用于 list 批量获取

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

记录一次rediscluster 调用lua 脚本, 用于 list 批量获取

记录一次rediscluster 调用lua 脚本 用于 list 批量获取

需求:用redis list 当作消息队列(原来的架构固定不能变更),需要增加消费速度
改进方案的思想(不考虑业务逻辑变更优化,主要是原来的逻辑改不动,有些濫):
1、批量获取 2、多线程消费
改进中遇到的问题:
1.批量获取问题 2、多线程问题 3、分布式问题
解决方案:
1、批量获取问题
1)redis 6.2.2 版本前list 弹出队列只有单个出队列(lpop)变更版本不靠谱
2)搜索查询查看帖子 后了解到 通过lrange 结合ltrim 可以实现批量出队列
2、多线程问题
多线程的话就是加锁,给方法加锁
3、分布式问题
单点部署多线程加锁能保证单点上多线程对redis的lrange 和ltrim 是原子操作,但是分布式 就会出现问题,比如 服务器A 中的线程操作redis,redis 执行到了lrange 还没有执行到 ltrim,服务器B中的线程通过redis的执行了lrange,(redis内部是单线程执行),就会出现重复数据,然后再执行ltrim 会出现错误删除数据。
解决此情况: 就是让redis端保证 lrange 和ltrim 是原子操作,首先 想到redis 事务,可惜redis集群上不支持事务(需要改造,我觉得麻烦)
其次,lua 脚本 (通过redisson 了解到lua可以保证redis 原子操作)。开始尝试lua。
以下是代码 可以拿来直接用,

api 用的是  jediscluster,如何获取jediscluster 就直接略了
//  lua 脚本内容     
    public static String script_LUA = 
             " local rlist = redis.call('lrange', KEYS[1],0,ARGV[1])n" +
            "  redis.call('ltrim', KEYS[1],#rlist,-1)n" +
            " return  rlist n";
	//用于存储redis 对 lua脚本缓存
    static HashMap cmap = new HashMap<>();
    public static synchronized List batchList(String key, int size) {
        try {
            List keys = new ArrayList<>();
            keys.add(key);
            List params = new ArrayList<>();
            params.add(size + "");
            String UNSHA_LUA = cmap.get(key);
            if (StringUtils.isBlank(UNSHA_LUA)) {
            	//redis 加载lua脚本,返回唯一标识串
                UNSHA_LUA = jedisCluster.scriptLoad(script_LUA, key);
                cmap.put(key, UNSHA_LUA);
            }
            return (List) jedisCluster.evalsha(UNSHA_LUA, keys, params);//执行lua脚本
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

完结。。。。。
附 : 2个应用,1个应用 5个list,每个list 20线程获取,一次100,220W数据 测试可行

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/531481.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号