当前位置: 首页 > news >正文

成都网站设计创新互联有什么网络项目可以做的

成都网站设计创新互联,有什么网络项目可以做的,长泰微新闻,wordpress主机转移各部分分工职责 RabbitMQ负责添加、修改、删除的异步操作 Redis负责数据的缓存 RabbitMQ里面角色职责简单描述 RabbitMQ里面有几个角色要先分清以及他们的对应关系#xff1a; 交换机、队列、路由键 交换机和队列是一对多 队列和路由键是多对多 然后就是消息的发送者 交换机、队列、路由键 交换机和队列是一对多 队列和路由键是多对多 然后就是消息的发送者生产者和消息的接受者消费者 此案例中添加修改删除要从生产者发送到消费者也就是说消费者才是具体干活的角色消息生产者只需要把消息发送到对应的队列中由交换机根据路由键发送到对应的队列中 Redis职责简单描述 Redis只需要把要看的数据以及新添加的数据添加到缓冲中即可如果缓冲中没有就从数据库查再添加到缓存中所以此次数据类型用的Hash pom.xml文件坐标引入 !-- redis工具 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependency!-- JSON工具 https://mvnrepository.com/artifact/com.alibaba/fastjson --dependencygroupIdcom.alibaba/groupIdartifactIdfastjson/artifactIdversion1.2.47/version/dependency!--spring2.X集成redis所需common-pool2--dependencygroupIdorg.apache.commons/groupIdartifactIdcommons-pool2/artifactIdversion2.6.0/version/dependency!-- Spring Boot Starter AMQP --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-amqp/artifactId/dependency SpringBoot的配置文件 # RabbitMQ:配置,服务器地址,端口,用户名,密码 spring.rabbitmq.hostlocalhost spring.rabbitmq.port5672 spring.rabbitmq.usernameguest spring.rabbitmq.passwordguest# 使用 Redis 作为缓存存储,具体配置:服务器地址,端口,密码 spring.cache.typeredis spring.redis.host127.0.0.1 spring.redis.port6379 #spring.redis.passwordroot spring.redis.password # 连接工厂使用的数据库索引,redis默认有16个db,索引0-15 spring.redis.database0 #spring.redis.timeout0 # 连接池最大连接数使用负值表示没有限制 这个值决定了同时可以有多少个活动的连接 spring.redis.lettuce.pool.max-active8 ## 连接池最大阻塞等待时间-1表示没有限制 当连接池中的所有连接都被占用时新的请求会等待一段时间 spring.redis.lettuce.pool.max-wait-1 ## 连接池中的最大空闲连接连接池中最多可以有多少个空闲的连接 spring.redis.lettuce.pool.max-idle8 ## 连接池中的最小空闲连接连接池中至少要有多少个空闲的连接 spring.redis.lettuce.pool.min-idle0 Redis配置类 EnableCaching //开启缓存 Configuration public class RedisConfig {Beanpublic RedisTemplateString, Object redisTemplate(RedisConnectionFactory factory) {RedisTemplateString, Object template new RedisTemplate();template.setConnectionFactory(factory);// 使用 Jackson2JsonRedisSerializer 来序列化和反序列化 Redis 的值ValueGenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer new GenericJackson2JsonRedisSerializer();// 使用 StringRedisSerializer 来序列化和反序列化 Redis 的键KeyStringRedisSerializer stringRedisSerializer new StringRedisSerializer();// 设置键key的序列化器template.setKeySerializer(stringRedisSerializer);// 设置值value的序列化器template.setValueSerializer(jackson2JsonRedisSerializer);// 设置 Hash 键key的序列化器template.setHashKeySerializer(stringRedisSerializer);// 设置 Hash 值value的序列化器template.setHashValueSerializer(jackson2JsonRedisSerializer);template.afterPropertiesSet();return template;}Beanpublic CacheManager cacheManager(RedisConnectionFactory factory) {RedisSerializerString redisSerializer new StringRedisSerializer();Jackson2JsonRedisSerializer jackson2JsonRedisSerializer new Jackson2JsonRedisSerializer(Object.class);//解决查询缓存转换异常的问题ObjectMapper om new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);// 配置序列化解决乱码的问题,过期时间600秒RedisCacheConfiguration config RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofSeconds(600)) //设置数据过期时间600秒.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)).disableCachingNullValues();RedisCacheManager cacheManager RedisCacheManager.builder(factory).cacheDefaults(config).build();return cacheManager;} }RabbitMQ配置类 如果没有配置logback就把log.info()的代码全部删了不影响运行后面有的话也都删了 Configuration public class RabbitMQConfig {public static final String EXCHANGE_NAME bill.exchange; // 交换机名称public static final String QUEUE_SAVE_UPDATE bill.saveupdate; // 保存修改队列public static final String QUEUE_DELETE bill.delete; // 删除队列public static final String ROUTING_SAVE_UPDATE_KEY bill.saveupdatekey; // 保存修改路由键public static final String ROUTING_DELETE_KEY bill.deletekey; // 删除路由键/*** 添加/修改定义队列* return 队列对象*/Beanpublic Queue queueSaveUpdate() {log.info(QUEUE_SAVE_UPDATE RabbitMQ队列初始化成功 LocalDateTime.now());return new Queue(QUEUE_SAVE_UPDATE, true); // durable: 是否持久化}/*** 删除定义队列* return 队列对象*/Beanpublic Queue queueDelete() {log.info(QUEUE_DELETE RabbitMQ队列初始化成功 LocalDateTime.now());return new Queue(QUEUE_DELETE, true); // durable: 是否持久化}/*** 定义交换机* return 交换机对象*/Beanpublic TopicExchange exchange() {log.info(EXCHANGE_NAME RabbitMQ交换机初始化成功 LocalDateTime.now());return new TopicExchange(EXCHANGE_NAME);}/*** 绑定队列和交换机* return 绑定对象*/Beanpublic Binding bindingSaveUpdate() {log.info(ROUTING_SAVE_UPDATE_KEY RabbitMQ绑定队列和交换机成功 LocalDateTime.now());return BindingBuilder.bind(queueSaveUpdate()).to(exchange()).with(ROUTING_SAVE_UPDATE_KEY);}/*** 绑定队列和交换机* return 绑定对象*/Beanpublic Binding bindingDelete() {log.info(ROUTING_DELETE_KEY RabbitMQ绑定队列和交换机成功 LocalDateTime.now());return BindingBuilder.bind(queueDelete()).to(exchange()).with(ROUTING_DELETE_KEY);} } RabbitMQ配置消息发送者生产者 也就是说在需要异步调用的地方注入BillMessageSender然后调对应的方法就可以了 Service public class BillMessageSender {Autowiredprivate RabbitTemplate rabbitTemplate;/*** 发送用户添加修改消息* param bill 参数对象*/public void sendBillSaveUpdateMessage(Bill bill) {rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, RabbitMQConfig.ROUTING_SAVE_UPDATE_KEY, bill);}/*** 发送用户删除消息* param ids 参数列表*/public void sendBillDeleteMessage(ListLong ids) {rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, RabbitMQConfig.ROUTING_DELETE_KEY, ids);} }异步发送消息 这是在Service层 所以把ApiResult()这个自定义返回类换成你们的就行了 ObjectMapper这个工具主要是用来处理JSON数据的这里我用是因为为了方便实体类和Map之间相互转换的BillMapper是我自己用到的这个可以换成你们自己的不影响剩下的就基本上没啥了有不懂的可以评论区问看到会回复 Slf4j Service public class BillRedisService {Resourceprivate BillMapper billMapper;Resourceprivate ObjectMapper objectMapper;Resourceprivate BillMessageSender billMessageSender;Resourceprivate RedisTemplateString, Object redisTemplate;// redis 中 bill的键private static final String BILL_REDIS_KEY bill:info;/*** 保存或者修改信息* param bill* return*/Transactionalpublic ApiResult saveUpdateByRedis(Bill bill){if(bill.getId() null){billMessageSender.sendBillSaveUpdateMessage(bill); //把要添加的信息放入消息队列}else {log.info([ bill.getId() ] 修改缓存中的数据);String key BILL_REDIS_KEY bill.getId(); //找到要修改值对应的redis的keyMap map objectMapper.convertValue(bill, Map.class);//把对象转换成mapredisTemplate.opsForHash().putAll(key, map); //更新数据到缓存中billMessageSender.sendBillSaveUpdateMessage(bill); //把要修改的信息放入消息队列}return ApiResult.success();}/*** 从缓存取数据* param id* return*/Transactionalpublic Bill selectPrimaryKeyByRedis(Long id){Bill bill;String key BILL_REDIS_KEY id;//有这个键就取数据不然就查数据库if (redisTemplate.hasKey(key)) {log.info([ id ] 从缓存中取数据);MapObject, Object map redisTemplate.opsForHash().entries(key);bill objectMapper.convertValue(map, Bill.class);}else{log.info([ id ] 缓存中没有向数据库中查询数据);bill billMapper.selectByPrimaryKey(id);String putKey BILL_REDIS_KEY bill.getId(); //找到要修改值对应的redis的keyMap map objectMapper.convertValue(bill, Map.class); //把对象转换成mapredisTemplate.opsForHash().putAll(putKey, map); //更新数据到缓存中}return bill;}/*** 删除方法* param ids* return*/Transactionalpublic ApiResult delByRedis(ListLong ids) {log.info([ Arrays.toString(ids.toArray()) ] 以上数据要被删除);for (Long id : ids) {String key BILL_REDIS_KEY id;redisTemplate.delete(key); //删除缓存中的数据}//数据库信息交给消息队列删除billMessageSender.sendBillDeleteMessage(ids);return ApiResult.success();} }RabbitMQ配置消息接收者消费者 添加上这个注解RabbitListener(queues RabbitMQConfig.QUEUE_SAVE_UPDATE) 并指明监听的队列queues RabbitMQConfig.QUEUE_SAVE_UPDATE 就能获取到消息发送者发送过来的任务以及任务参数了就可以在这里写处理逻辑了如果没有配置logback可以把Slf4j以及log.info()这两个代码删除了 Slf4j Component public class BillMessageReceiver {Autowiredprivate BillMapper billMapper;Autowiredprivate ObjectMapper objectMapper;Resourceprivate RedisTemplateString, Object redisTemplate;// redis 中 bill的键private static final String BILL_REDIS_KEY bill:info;/*** 处理添加和修改操作* param bill 参数对象*/TransactionalRabbitListener(queues RabbitMQConfig.QUEUE_SAVE_UPDATE)public void receiveBillSaveUpdateMessage(Bill bill) {log.info(RabbitMQConfig.QUEUE_SAVE_UPDATE 队列获取到数据 bill.toString());if (bill null) {return;}if (bill.getId() null) {bill.setDeleted(0);bill.setCreateTime(new Date());billMapper.insertSelective(bill);} else {bill.setUpdateTime(new Date());billMapper.updateByPrimaryKeySelective(bill);}String key BILL_REDIS_KEY bill.getId(); //添加后就有主键了,拼接成redis的keyMap map objectMapper.convertValue(bill, Map.class);//把对象转换成mapredisTemplate.opsForHash().putAll(key, map); //把添加的数据放到缓存中}/*** 删除数据* param ids 参数列表*/TransactionalRabbitListener(queues RabbitMQConfig.QUEUE_DELETE)public void receiveBillDeleteMessage(ListLong ids) {log.info(RabbitMQConfig.QUEUE_DELETE 队列获取到数据 Arrays.toString(ids.toArray()));Bill bill new Bill();bill.setDeleted(1);Example example new Example(Bill.class);Example.Criteria criteria example.createCriteria();criteria.andIn(id,ids);billMapper.updateByExampleSelective(bill,example);}}总结 再把逻辑捋一下 添加修改删除这些操作统一发送给RabbitMQ由RabbitMQ的消费者处理后续操作 查看详情添加和更新的数据交给Redis缓存缓存没有就查数据库然后再缓存到Redis中就第一遍查数据库后续走的都是缓存 以上代码实现的功能就是 全部数据查询还是走的数据库数据量不多但是单个查询查询详情先查缓存缓存没有再查数据库然后再添加到缓存中下次查询就不走数据库了 添加修改删除统一发送给RabbitMQ消息队列由消息队列异步完成后续的任务并更新或者删除对应的缓存 这比之前单独的对数据库操作多了2层逻辑RabbitMQ和缓存的处理这个例子就是简单的使用RabbitMQ和Redis算是个小入门如果有其他好的建议可以评论一下十分感谢
http://www.hkea.cn/news/14432138/

相关文章:

  • 东莞高埗做网站哪个公司好wordpress主题代码显示行
  • 提出网络营销思想的网站改版计划专业搭建网站
  • 长春建站宣传手淘网站建设需求分析
  • 中国六冶的网站谁做的怎么使用模板建设网站
  • 襄阳网站建设企业制作广告
  • 网站建设的市场需求app开发流程 网站开发
  • 鹿泉市建设局网站wordpress搬家 中文图片
  • 网站开发信息文档怎么进入网络管理系统
  • 中国建设建筑教育网站电商培训方案
  • 承德专业做网站的公司网页设计网站开发需要什么软件
  • 协会网站建设计划书阿里巴巴代加工平台
  • 怎么注册公司的网站网站建设与维护 许宝良 课件
  • 佛山网站建设与设计公司长沙推广网络营销公司
  • 焦作建设网站的公司网页源代码快捷键
  • 忻州市住房城乡建设局网站惠州网站开发
  • flex 做网站宝塔面安装wordpress
  • 在线呼叫网页版seo免费视频教程
  • 企业网站优化解决方案如何做电商网站 昆明
  • 南宁网站建设升上去网站分页设计
  • 网上国网app官方下载seo关键词是什么
  • 一个网站如何创建多个页面赤峰网站建设培训
  • 网站推广 方法石家庄有没有销售做被用的网站
  • 新网站建设平台西安做网站的云阔
  • 专业制作网站是什么网站建设的一般流程是怎样的
  • 做购物网站流程充电网站建设方案
  • 襄阳电商网站建设福建省建设工程信息网
  • 购物商城外贸网站建设网站建设全攻略
  • 小米手机做网站服务器吗关于建设网站的图片素材
  • 长沙做最好网站网站防采集 如何采集
  • 中国建设银行内部网站建筑模板的价格一览表