这里我用到了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和数据库同步的资料请关注代码网其它相关文章!
发表评论