一:Redis的使用

1.先引入pom.xml的依赖

  1. <dependency>
  2. <groupId>redis.clients</groupId>
  3. <artifactId>jedis</artifactId>
  4. <version>2.9.0</version>
  5. </dependency>

2.开始编码

  1. package me.silentdoer.redisrabbitmq;
  2.  
  3. import redis.clients.jedis.Jedis;
  4. import redis.clients.jedis.JedisPool;
  5. import redis.clients.jedis.JedisPoolConfig;
  6. import redis.clients.util.Pool;
  7.  
  8. import java.io.UnsupportedEncodingException;
  9.  
  10. /**
  11. * @author silentdoer
  12. * @version 1.0
  13. * @description the description
  14. * @date 4/11/18 9:03 PM
  15. */
  16. public class Entrance {
  17. public static Pool<Jedis> jedisPool;

  18. // TODO 在项目里对redis的使用其实更通过radis-cli的方式几乎一模一样;
  19. public static void main(String[] args) throws UnsupportedEncodingException {
  20. // 通过配置初始化Jedis连接池,类似初始化数据库连接池的步骤
  21. initJedisPool();
  22. // 通过Jedis连接池来管理Jedis,这样当jedis.close()时能够复用内部的数据传输模块
  23. Jedis jedis = jedisPool.getResource();
  24.  
  25. // 设置db0中的key,value
  26. jedis.set("中国".getBytes("utf8"), "我里试试试".getBytes("utf8"));
  27. // 对于set字符串,最终也是通过set(SafeEncoder.encode(key), SafeEncoder.encode(value))转换为byte数组,看了下是UTF-8
  28. //jedis.set("strKey", "value");
  29. // 这里的value最终也是通过SafeEncoder.encodeMany(strs),将字符串数组(List类型的value)转换为了二位字节数组
  30. //jedis.rpush("listKey", new String[]{"value1", "value2", "value3"});
  31.  
  32. // 注意,set时是什么形式,get时最好就应该是什么形式
  33. byte[] content = jedis.get("中国".getBytes("utf8"));
  34. System.out.println(new String(content, "UTF8"));
  35. // 虽然这样也行,但是为了未来兼容性,还是手动转换为字节数组比较靠谱,比较后面的版本不一定就换成别的编码了
  36. //String content = jedis.get("中国");
  37. //System.out.println(content);
  38.  
  39. //选择redis的内存db,这个大小是可以在配置里规定的,个人规定的是一个redis实例的db大小不能超过16
  40. //jedis.select(1);
  41.  
  42. // 若此Jedis对象由JedisPool创建则close时将会设置此jedis不可用,但是回收内部的数据传输模块
  43. jedis.close();
  44. }
  45.  
  46. public static synchronized void initJedisPool(){
  47. JedisPoolConfig config = new JedisPoolConfig();
  48. config.setMaxIdle(24); // 最大空闲数(这里应该还有个设置多久后认定是空闲的)
  49. config.setMaxTotal(48); // 最大连接数
  50. config.setMaxWaitMillis(3000); // 当连接不够时等待的时长
  51. config.setTestOnBorrow(false);
  52. try {
  53. jedisPool = new JedisPool(config, "localhost", 6379, 10000, null); // 最后一个为auth,没有即为null
  54. } catch (Exception ex) {
  55. ex.printStackTrace();
  56. }
  57. }
  58. }

二:RabbitMQ的使用

1.引入依赖

  1. <dependency>
  2. <groupId>com.rabbitmq</groupId>
  3. <artifactId>amqp-client</artifactId>
  4. <version>4.1.0</version>
  5. </dependency>

2.生产者编码

  1. package me.silentdoer.redisrabbitmq;
  2.  
  3. import com.rabbitmq.client.Channel;
  4. import com.rabbitmq.client.Connection;
  5. import com.rabbitmq.client.ConnectionFactory;
  6.  
  7. import java.io.IOException;
  8. import java.util.Scanner;
  9. import java.util.concurrent.TimeoutException;
  10.  
  11. /**
  12. * @author silentdoer
  13. * @version 1.0
  14. * @description the description
  15. * @date 4/11/18 10:23 PM
  16. */
  17. public class MqProducer {
  18. private static ConnectionFactory factory;
  19.  
  20. public static void main(String[] args) throws IOException, TimeoutException {
  21. initFactory();
  22. Connection connection = factory.newConnection();
  23. // channel的实现方式其实就是注册机制,即我通过某个tcp协议的socket对象,调有createChannel其实就是发送如:create channel 0的数据
  24. // 然后服务端收到后在相关注册表里添加条目 0 - conn0 - user - vhost 之类的数据,然后返回true给客户端,然后客户端也添加本地注册表
  25. // 这样就通过每次发送数据都加一个channel从而将不同channel的数据分隔开
  26. Channel chann0 = connection.createChannel(1); // TODO 此值要大于0
  27. Scanner scanner = new Scanner(System.in);
  28. String msg = "";
  29. while(!"exit".equals(msg)){
  30. msg = scanner.nextLine();
  31. chann0.basicPublish("", "test", null, msg.getBytes("utf8"));
  32. }
  33. // ""表示是默认的exchange(direct.default),但是还是得显示指定,TODO 注意不能是null
  34. //第三个参数props是消息包含的属性信息。RabbitMQ的消息属性和消息体是分开的,不像JMS消息那样同时包含在javax.jms.Message对象中,这一点需要特别注意
  35. //chann0.basicPublish("", "test", null, "payload的消息".getBytes("utf8"));
  36. //chann0.queueDeclare("name", true, false, false, null); // 创建一个queue(默认会创建一个default-queuename-queue的binding)
  37. //chann0.exchangeDeclare(..); // 创建一个exchange,只能指定builtin的类型,即direct/fanout/header/topic。。
  38. //chann0.exchangeBind(..); // 设置一个binding,将exchange和exchange绑定,类似责任链处理
  39. //chann0.queueBind(..); // 设置一个binding,将queue和exchange绑定
  40. chann0.close(); // 注意,其实只是在本地和服务器的注册表里删除了此channel的信息,以及将此channel设置为不可用而以
  41. connection.close(); // 真正关闭tcp连接
  42. }
  43.  
  44. public static void initFactory(){
  45. factory = new ConnectionFactory();
  46. factory.setHost("localhost");
  47. factory.setPort(5672);
  48. factory.setUsername("guest");
  49. factory.setPassword("guest");
  50. factory.setVirtualHost("/"); // default vhost is /
  51. factory.setConnectionTimeout(10000);
  52. }
  53. }

3.消费者代码

  1. package me.silentdoer.redisrabbitmq;
  2.  
  3. import com.rabbitmq.client.*;
  4.  
  5. import java.io.IOException;
  6. import java.util.concurrent.TimeoutException;
  7.  
  8. /**
  9. * @author silentdoer
  10. * @version 1.0
  11. * @description the description
  12. * @date 4/11/18 10:43 PM
  13. */
  14. public class MqConsumer {
  15. private static ConnectionFactory factory;
  16.  
  17. public static void main(String[] args) throws IOException, TimeoutException {
  18. initFactory();
  19. Connection connection = factory.newConnection();
  20. Channel channel = connection.createChannel(3); // channel 不需要和producer的一样
  21. // Consumer 是回调函数,即channel.basicConsume(..)获得一条消息后会调有此观察者的
  22. //handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)方法
  23. Consumer consumer = new DefaultConsumer(channel){
  24. // 默认此观察者的命令方法是什么都不做的,要将这里获取的值在其它地方引用只需写个ConsumerSupport即可,然后外部consumerSupport.getBody();
  25. @Override
  26. public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
  27. String message = new String(body, "UTF-8");
  28. System.out.println("收到一条需要我方处理的消息:" + message);
  29. }
  30. };
  31. while (true){
  32. // 注意,是channel在订阅消息,这个订阅和监听器不太一样,需要不断的订阅(有点像C#里的BeginAccept,获取后需要继续BeginAccept才行)
  33. channel.basicConsume("test", true, consumer);
  34. }
         //channel.close();
         //connection.close();
  35. }
  36.  
  37. public static void initFactory(){
  38. factory = new ConnectionFactory();
  39. factory.setHost("localhost");
  40. factory.setPort(5672);
  41. factory.setUsername("guest"); // TODO 注意,生产环境消费者和生产者的账户是不一样的,只不过vhost一样,ip:port也一样
  42. factory.setPassword("guest");
  43. factory.setVirtualHost("/");
  44. factory.setConnectionTimeout(10000);
  45. }
  46. }

Redis和RabbitMQ在项目中的使用的更多相关文章

  1. RabbitMQ之项目中实战

    说了那么多,还不是为了在项目中进行实战吗,在实践中检验真理,不然我学他干嘛,不能解决项目中的实际问题的技术都是耍流氓... 一.后台管理系统发送消息 瞎咧咧:后台管理系统发送消息到交换机中,然后通知其 ...

  2. redis缓存在项目中的使用

    关于redis为什么能作为缓存这个问题我们就不说了,直接来说一下redis缓存到底如何在项目中使用吧: 1.redis缓存如何在项目中配置? 1.1redis缓存单机版和集群版配置?(redis的客户 ...

  3. 【新手总结】在.Net项目中使用Redis作为缓存服务

    最近由于项目需要,在系统缓存服务部分上了redis,终于有机会在实际开发中玩一下,之前都是自己随便看看写写,很零碎也没沉淀下来什么,这次算是一个系统学习和实践过程的总结. 和Redis有关的基础知识 ...

  4. spring3.0结合Redis在项目中的运用

    推荐一个程序员的论坛网站:http://ourcoders.com/home/ 以下内容使用到的技术有:Redis缓存.SpringMVC.Maven.项目中使用了redis缓存,目的是在业务场景中, ...

  5. redis在java项目中的使用

    在上一篇文章中已经讲了redis的spring配置,这篇将会描述redis在java项目中的使用. redis存储形式都是key-value(键值对),按照存储的内容分为两种,一种是存简单数据,即数字 ...

  6. Redis学习笔记之二 :在Java项目中使用Redis

    成功配置redis之后,便来学习使用redis.首先了解下redis的数据类型. Redis的数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set( ...

  7. Redis的安装以及在项目中使用Redis的一些总结和体会

    第一部分:为什么我的项目中要使用Redis 我知道有些地方没说到位,希望大神们提出来,我会吸取教训,大家共同进步! 注册时邮件激活的部分使用Redis 发送邮件时使用Redis的消息队列,减轻网站压力 ...

  8. Spring + SpringMVC + Mybatis项目中redis的配置及使用

    maven文件 <!-- redis --> <dependency> <groupId>redis.clients</groupId> <art ...

  9. Django项目中使用Redis

    Django项目中使用Redis DjangoRedis 1 redis Redis 是一个 key-value 存储系统,常用于缓存的存储.django-redis 基于 BSD 许可, 是一个使 ...

随机推荐

  1. spring BeanUtils 工具实现对象之间的copy

    一般我们会开发中会遇到返回用户信息的时候,不需要返回密码或者其他参数,这时候我们需要重新定义一个VO类去除不需要的参数,将原对象copy到VO类中 使用spring的BeanUtils可以实现对象的c ...

  2. ARM板移植udev-126

    下载udev-126.tar.xz 下载的网址为: https://mirrors.edge.kernel.org/pub/linux/utils/kernel/hotplug/ 解压文件并且编译 # ...

  3. docker数据卷(转)

    原文地址:http://www.cnblogs.com/zydev/p/5809616.html Docker-数据卷和数据容器卷 容器中管理数据主要有两种方式: 数据卷(Data Volumes) ...

  4. idea中快捷键设置为eclipse中快捷键

    打开file-settings,然后搜索key,在keymap中选择eclipse (1) (2)

  5. c++中“箭头(->)”和“点号(.)”操作符的区别

    首先介绍一下C++中的结构.对于一个结构: struct MyStruct { int member_a; }; 如果有个变量MyStruct s,那么使用其中的成员元素时可以用: s.member_ ...

  6. Oracle_PL/SQL(9) 例外处理

    例外处理1.例外分类:预定义例外,非预定义例外,自定义例外三种传递例外:如果在例外处理部分exception没有捕捉例外,oracle会将例外传递到调用环境.捕捉并处理例外:使用例外处理部分完成exc ...

  7. linux 压缩命令

    .zip格式压缩 zip 压缩文件名 源文件     压缩文件 zip -r 压缩文件名 源目录    #压缩目录 .zip格式解压缩 unzip 压缩文件     #解压缩 .gz格式压缩 gzip ...

  8. Ubuntu 软件包管理工具 dpkg, APT 的一些命令(转载)

    转载地址: http://www.dreamxu.com/ubuntu-package-dpkg-and-apt-commands/ dpkg dpkg 是由 Debian 开发的包管理系统,是一个比 ...

  9. kali安全工具

    http://www.kali.org.cn/ Kali linux下载安装 (27) kali linux是backtrack的最新代号,或者叫新版本的backtrack,欢迎下载使用. 908 / ...

  10. Cannot load JDBC driver class 'oracle.jdbc.OracleDriver'

    项目报这个错误,后来查了,是缺少ojdbc,也就是java操作oracle的包,通过https://mvnrepository.com/artifact/oracle/ojdbc/1.4,可以找到该包 ...