当前位置: 代码网 > it编程>编程语言>Java > 使用Java代码实现Redis和数据库数据同步

使用Java代码实现Redis和数据库数据同步

2024年06月12日 Java 我要评论
这里我用到了redis当中的发布订阅模式实现(java代码实现)先看图示下面为代码实现首先将redismessagelistenercontainer交给spring管理.@configuration

这里我用到了redis当中的发布订阅模式实现(java代码实现)

先看图示 

下面为代码实现

首先将redismessagelistenercontainer交给spring管理.

@configuration
public class redisconfig {
    @autowired
    redisconnectionfactory redisconnectionfactory;
 
    @autowired
    @qualifier("carservicedb")
    private carservice carservice;//操作数据库
    @bean
    public redismessagelistenercontainer listenercontainer(){
        //创建一个redis消息监听器容器对象
        redismessagelistenercontainer listenercontainer = new redismessagelistenercontainer();
         //设置redis连接工厂对象
        listenercontainer.setconnectionfactory(redisconnectionfactory);
 
        //向监听器容器中添加一个监听器,该监听器的主题为inserted
        listenercontainer.addmessagelistener(new messagelistener() {
            @override
            public void onmessage(message message, byte[] pattern) {
                system.out.println("*************insert*************");
 
                string carjsonstr = new string(message.getbody());
                car car = jsonobject.parseobject(carjsonstr, car.class);
 
                carservice.addcar(car);
 
 
 
                system.out.println(new string(message.getbody()));
                system.out.println(new string(pattern));
                system.out.println("*************insert*************");
            }
        }, new channeltopic(channelenum.inserted.name()));
 
        //向监听器容器中添加一个监听器,该监听器的主题为updated
        listenercontainer.addmessagelistener(new messagelistener() {
            @override
            public void onmessage(message message, byte[] pattern) {
                system.out.println("*************updated*************");
                string carjsonstr = new string(message.getbody());
                car car = jsonobject.parseobject(carjsonstr, car.class);
                carservice.updatacount(car.getbookid(),car.getnumber(),car.getuserid());
 
                system.out.println(new string(message.getbody()));
                system.out.println(new string(pattern));
                system.out.println("*************updated*************");
            }
        }, new channeltopic(channelenum.updated.name()));
 
        //向监听器容器中添加一个监听器,该监听器的主题为deleted
        listenercontainer.addmessagelistener(new messagelistener() {
            @override
            public void onmessage(message message, byte[] pattern) {
                system.out.println("*************deleted*************");
                system.out.println(new string(message.getbody()));
                system.out.println(new string(pattern));
 
                list<string[]> strings = jsonarray.parsearray(new string(message.getbody()), string[].class);
                string[] bookids = strings.get(0);
                string userid = strings.get(1)[0];
                carservice.delcar(bookids,userid);
                system.out.println("----------------------");
                system.out.println(arrays.tostring(bookids));
                system.out.println(userid);
                system.out.println("--------delete--------");
                system.out.println("*************deleted*************");
            }
        }, new channeltopic(channelenum.deleted.name()));
        return listenercontainer;
    }
}

下面代码中的 stringredistemplate.convertandsend();就是发送消息的,其中参数1是发送消息的名称,参数2是发送消息的内容

@service("carservice")
@slf4j
public class carserviceimpl extends serviceimpl<carmapper, car> implements carservice {
    //购物车hash的key
    public static final string car_key = "carkey";
    //hash购物车中field的前缀
    public static final string user_car_hash_field_prefix = "car::";
    @resource
    private stringredistemplate stringredistemplate;
 
    /**
     * 这里存储的时候采用redis当中的hash存储
     *
     * @param car
     */
    @override
    @synchronized
    public void addcar(car car) {
        //这里存储的时候采用redis当中的hash存储
        hashoperations<string, string, string> opsforhash = stringredistemplate.opsforhash();
 
        //这里field为car_hash_field
        string usercarkey = user_car_hash_field_prefix + car.getuserid();
 
        //map<string,car>  键(存储bookid)  值存储购物车某一个商品的信息
        map<string, car> carmap = null;
        boolean flag = true;
        //获得redis中以存储的当前用户的购物车信息
        if (opsforhash.haskey(car_key, usercarkey)) {
            //存在当前用户的购物车信息,那么获取原有的数据
            string carmapjson = opsforhash.get(car_key, usercarkey);
 
            carmap = jsonobject.parseobject(carmapjson, new typereference<map<string, car>>() {
            });
 
            //检测当前购物车信息中是否包含新添加上的商品,如果包含则更新数量,如果不包含才新增
            if (carmap.containskey(car.getbookid())) {
                //获取原先商品的数量
                integer beforenumber = carmap.get(car.getbookid()).getnumber();
                log.info("beforenumber==============>{}", beforenumber);
                integer nownumber = car.getnumber(); //前端传过来现在的
                log.info("nownumber==============>{}", nownumber);
                carmap.get(car.getbookid()).setnumber(beforenumber + nownumber);
 
                flag = false; //存在商品
                //修改
 
                //包含才新增 图书的数量 在原有的基础上新增图书的数量
            } else {
                //新增
                //如果不包含当前商品信息 那么直接将商品添加到购物车信息当中
                carmap.put(car.getbookid(), car);
            }
        } else {
            /*   新增
             *
             * 当前的用户的购物车信息不存在
             *       首先把其添加的商品首先存储到carmap中
             * */
            carmap = new hashmap<>();
            carmap.put(car.getbookid(), car);
        }
 
        //最后将其存入redis当中
        opsforhash.put(car_key, usercarkey, jsonobject.tojsonstring(carmap));
 
        if (flag){
            //新增
            stringredistemplate.convertandsend(channelenum.inserted.name(), jsonobject.tojsonstring(carmap.get(car.getbookid())));
        }else {
            //修改
            stringredistemplate.convertandsend(channelenum.updated.name(), jsonobject.tojsonstring(carmap.get(car.getbookid())));
        }
    }
 
    @override
    public collection<car> getcarlist(string userid) {
        //这里存储的时候采用redis当中的hash存储
        hashoperations<string, string, string> opsforhash = stringredistemplate.opsforhash();
        string usercarkey = user_car_hash_field_prefix + userid;
        string jsonstr = opsforhash.get(car_key, usercarkey);
        map<string,car> carmap = jsonobject.parseobject(jsonstr, map.class);
        return carmap.values();
    }
 
    @override
    public void updatacount(string bookid, int number, string userid) {
        //这里存储的时候采用redis当中的hash存储
        hashoperations<string, string, string> opsforhash = stringredistemplate.opsforhash();
        string usercarkey = user_car_hash_field_prefix + userid;
 
        string jsonstr = opsforhash.get(car_key, usercarkey);
        map<string,car> carmap = jsonobject.parseobject(jsonstr, new typereference<map<string, car>>() {
        });
        if (!carmap.containskey(bookid)){ //不包含
            return;
        }
 
        car car = carmap.get(bookid);
        car.setnumber(number);
 
        //最后将其存入redis当中
        opsforhash.put(car_key, usercarkey, jsonobject.tojsonstring(carmap));
        stringredistemplate.convertandsend(channelenum.updated.name(), jsonobject.tojsonstring(carmap.get(car.getbookid())));
 
    }
 
    @override
    public void delcar(string[] bookids, string userid) {
        //获得操作redishash的对象
        hashoperations<string, string, string> forhash = stringredistemplate.opsforhash();
        string usercarkey = user_car_hash_field_prefix+userid;
        list<string[]> list = new arraylist<>();
        //从redis中获取用户对应的购物车数据
        string carjsonstr = forhash.get(car_key, usercarkey);
        //修改指定商品的数量
        map<string,car> carmap = jsonobject.parseobject(carjsonstr, new typereference<map<string,car>>() {
        });
        for(string bookid : bookids){
            carmap.remove(bookid);
        }
 
        //将修改后的数据重新添加到redis中
        forhash.put(car_key,usercarkey,jsonobject.tojsonstring(carmap));
        list.add(bookids);
        list.add(new string[]{userid});
 
        stringredistemplate.convertandsend(channelenum.deleted.name(), jsonobject.tojsonstring(list));
    }
}

上述的两段代码中

第二段代码中stringredistemplate.convertandsend();就是发送消息的,其中参数1是发送消息的名称,参数2是发送消息的内容

第一段代码中的这个就是监听到后接收到的消息,其中参数1{当中的onmessage方法的参数1message为发送消息的内容,参数2pattern是发送消息的名称}    参数2为监听指定的消息名称(这个要和stringredistemplate.convertandsend()中参数1的要保持一致)

listenercontainer.addmessagelistener(new messagelistener() {
            @override
            public void onmessage(message message, byte[] pattern) {
                
            }
        }, new channeltopic(channelenum.inserted.name()));

以上就是使用java代码实现redis和数据库数据同步的详细内容,更多关于java redis和数据库同步的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com