不懂就问,如何解决redis高并发

你看见了吗° 2020-11-12 11:42:00
将一个集合保存到redis
然后多个地方比较频繁的操作到这个集合,添加元素或者删除元素,并且保存
如何解决并发问题
朋友说用队列,但是没使用过队列,不怎么会用
...全文
3482 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ziqi0716 2020-11-13
  • 打赏
  • 举报
回复
先用一个任务队列来无脑存任务(如,向a库b表增加记录....,从a库c表中删除id为m的记录....),可用MQ或者RQ或则自己实现个简单的先进先出队列. 另一个线程去拿任务执行.
大叔obnijeh 2020-11-13
  • 打赏
  • 举报
回复
引用 楼主 你看见了吗° 的回复:
将一个集合保存到redis 然后多个地方比较频繁的操作到这个集合,添加元素或者删除元素,并且保存 如何解决并发问题 朋友说用队列,但是没使用过队列,不怎么会用
简单粗爆点。

//将一个list集合元素push到redis
public long setCollection(byte[] key, Collection<?> value) {

        Object result = redisTemplate.execute((conn) -> {
            long size = 0;
            for (Object val : value) {
                // 迭代list的每一个元素, push到key对应的list
                size = conn.rPush(key, SerializeUtil.serialize(val));
            }
            return size;
        } , false);

        return (long) result;
    }
//从redis获取list集合的某一部分数据
public <T> List<T> getList(byte[] key, int page, int size) {

        Object result = redisTemplate.execute((conn) -> {
            // 先查询list里面的总长度
            Long len = conn.lLen(key);

            // 得到偏移量
            int offeset = getOffeset(page, size);
            
            // 如果偏移量已经大于总长度, 则直接返回null 
            if (offeset > len) {
                return null;
            }
            
            // 得到集合里面对应位置的数据
            List<byte[]> list =  conn.lRange(key, offeset, size);
            
            List<T> listOs = Lists.newArrayList();
        
            // 将byte数组返序列化成对象
            for (byte[] bs : list) {
                listOs.add((T) SerializeUtil.unserialize(bs));
            }

            return listOs;
        } , false);
        return result == null ? Lists.newArrayList() : (List<T>) result;
    }
    
    /**
    * 获取偏移量
    **/
    private int getOffeset(int page, int size) {
        return page == 0 ? 0 : page * size;
    }

老王就是我 2020-11-13
  • 打赏
  • 举报
回复
redis的对象操作是单线程执行,只要对接队列就可以了,大不了上mq
luj_1768 2020-11-13
  • 打赏
  • 举报
回复
redis 是一个服务器集群,通过系统服务解决通知、检索、更新、同步等问题。你的内容访问量过大的话,就需要申请系统资源,或者提供相关的资源申请编入系统资源池。
韩_师兄 2020-11-13
  • 打赏
  • 举报
回复
list结构可以实现队列效果的
张zhic 2020-11-12
  • 打赏
  • 举报
回复
以下是个人理解:redis是单线程的,如果对一个集合频繁操作的话,因为redis是单线程的,对任何操作都是按照操作的顺序来的,是不是可以得出就没有redis数据并发的问题。 仅仅是个人理解。
tianfang 2020-11-12
  • 打赏
  • 举报
回复
随便折腾,redis自己使用队列保证单线程执行
Valerie00 2020-11-12
  • 打赏
  • 举报
回复
引用 7 楼 你看见了吗° 的回复:
[quote=引用 6 楼 KeepSayingNo 的回复:]redis 有list这个结构啊,可以用lpull,rpush

redis删除指定key中的指定元素,用哪个方法?lpull是什么方法,点不出来,也百度不到[/quote]
是jedis对象的方法
你看见了吗° 2020-11-12
  • 打赏
  • 举报
回复
引用 6 楼 KeepSayingNo 的回复:
redis 有list这个结构啊,可以用lpull,rpush
redis删除指定key中的指定元素,用哪个方法?lpull是什么方法,点不出来,也百度不到
KeepSayingNo 2020-11-12
  • 打赏
  • 举报
回复
redis 有list这个结构啊,可以用lpull,rpush
你看见了吗° 2020-11-12
  • 打赏
  • 举报
回复
引用 4 楼 Nihility/ 的回复:
[quote=引用 3 楼 你看见了吗° 的回复:][quote=引用 1 楼 长江水面写日记 的回复:]可能你想问的是,怎么保证数据一致性的问题,加redis锁就好了
加锁会影响性能[/quote] 那你可以学习一下队列,不可能遇到不会用的就不学了对吧~[/quote] 肯定是要学,但是毕竟是一个大科,不是一会就能琢磨透,所以想问下用哪个队列会比较好,至少会减少很多无用的操作,因为我试了好几个队列,都不能解决这个问题
Nihility/ 2020-11-12
  • 打赏
  • 举报
回复
引用 3 楼 你看见了吗° 的回复:
[quote=引用 1 楼 长江水面写日记 的回复:]可能你想问的是,怎么保证数据一致性的问题,加redis锁就好了
加锁会影响性能[/quote] 那你可以学习一下队列,不可能遇到不会用的就不学了对吧~
你看见了吗° 2020-11-12
  • 打赏
  • 举报
回复
引用 1 楼 长江水面写日记 的回复:
可能你想问的是,怎么保证数据一致性的问题,加redis锁就好了
加锁会影响性能
  • 打赏
  • 举报
回复
可能你想问的是,怎么保证数据一致性的问题,加redis锁就好了

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧