精华内容
下载资源
问答
  • 保存书店交易记录程序 程序编写:编写一个保存书店每日交易记录的程序,将书店的交易信息记录在本地的csv或txt文件中。...保存的时候需要判断本地是否存在当天的数据,如果存在则追加,不存在则新建

    保存书店交易记录程序

    程序编写:编写一个保存书店每日交易记录的程序,将书店的交易信息记录在本地的csv或txt文件中。当用户输入图书编号时,后台会根据图书编号查询到相应图书信息,并返回打印出来。用户紧接着输入购买数量,系统会判定库存是否充足,如果充足则将信息保存至本地的csv文件中,其中每条记录包含“图书编号”、“图书名称”、“购买数量”、“单价”、“总价”和“出版社”等数据。每个数据之间用英文逗号或空格分隔,每条数据之间由换行符分隔。保存的时候需要判断本地是否存在当天的数据,如果存在则追加,不存在则新建。文件命名格式为“销售记录”加上当天日期加上“.csv”或“.txt”后缀。

    Books

    package bookstore;
    
    /*
     * 图书类
     */
    public class Books {
        private int id;
        private String name;//图书名称
        private int number;//图书数量
        private double price;//图书单价
        private double money;//总价
        private String publish;//出版社
        //构造方法
    	public Books() {
    		super();
    	}
    	
    	public Books(int id, String name, int number, double price, double money, String publish) {
    		super();
    		this.id = id;
    		this.name = name;
    		this.number = number;
    		this.price = price;
    		this.money = money;
    		this.publish = publish;
    	}
    	
    	//取值赋值构造get,set
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public int getNumber() {
    		return number;
    	}
    	public void setNumber(int number) {
    		this.number = number;
    	}
    	public double getPrice() {
    		return price;
    	}
    	public void setPrice(double price) {
    		this.price = price;
    	}
    	public double getMoney() {
    		return money;
    	}
    	public void setMoney(double money) {
    		this.money = money;
    	}
    	public String getPublish() {
    		return publish;
    	}
    	public void setPublish(String publish) {
    		this.publish = publish;
    	}
        @Override
        public String toString() {
        	String message = "图书编号: " + id + " 图书名称: " + name + " 出版社: " + publish + "  单价: " + price + " 库存数量: " + number;
        	return message;
        }
    }
    

    RecordBooksOrder

    package bookstore;
    
    import java.io.BufferedOutputStream;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.Scanner;
    
    /*
     * 图书订单信息
     */
    public class RecordBooksOrder {
    	//书架
    	public static ArrayList<Books> booksList = new ArrayList<Books>();
    	
        public static void main(String[] args) {
    		//初始化书架
        	init();
        	//将书架上所有的书打印出来————遍历
        	for (Books book : booksList) {
    			System.out.println(book);
    		}
        	//购买图书
        	while (true) {
    			//获取控制台输入内容
        		Scanner scan = new Scanner(System.in);
        		System.out.print("请输入图书编号:");
        		int bookId = scan.nextInt();
        		//根据输入的图书编号获取图书信息
        		Books stockBooks = getBooksById(bookId);
        		//判断是否存在这本书
        		if (stockBooks != null) {
    				//说明找到该图书
        			System.out.println("当前图书信息" + stockBooks);
        			System.out.print("请输入购买数量:");
        			int bookNumber = scan.nextInt();//输入购买书的数量
        			//判断当前库存数量是否足够
        			if (bookNumber <= stockBooks.getNumber() ) {
    					//可以购买,图书充足
        				//将购买图书的信息封装成Books对象
        				Books books = new Books(stockBooks.getId(), stockBooks.getName(), bookNumber, stockBooks.getPrice(), stockBooks.getMoney()*bookNumber, stockBooks.getPublish());
        				//将本条购买信息保存至本地文件
        				//拼接文件昵称
        				Date date =new Date();
        				DateFormat format = new SimpleDateFormat("yyyyMMdd");//定义日期格式
        				String fileName = "销售记录" + format.format(date)+".csv" ;
        				try {
    						FileInputStream in = new FileInputStream(fileName);
        				    if (in != null) {
        				    	//说明该文件存在
    					    	in.close();
    					    	//打开文件,追加数据
    					    	saveBooks(fileName, true, books);
    					   }
    					} catch (FileNotFoundException e) {
    						// 说明该文件不存在,创建新文件,写入数据
    						saveBooks(fileName, false, books);
    					}catch(IOException e){
    						e.printStackTrace();
    					}
    				}
        				
        			else {
    					//不能购买,图书不够	
        			System.out.println("库存不足!");
        				//修改当前书的库存数量
        				stockBooks.setNumber(stockBooks.getNumber() - bookNumber);
    				}
        			
    			}
        	else{
    				//没有找到
    				System.out.println("图书编号输入错误!");
    			}
    		}
    
    }
        /*
         *初始化书架上的图书信息,将图书放在书架上
         */
        public static void init() {
    		//创建书
        	Books good1 = new Books(101, "JAVA基础入门", 100, 44.5, 4450.00, "清华大学出版社");
        	Books good2 = new Books(102, "JAVA编程思想", 50, 108.0, 5400.00, "机械工业出版社");
        	Books good3 = new Books(103, "疯狂JAVA讲义", 100, 90.0, 9000.00, "电子工业出版社");
        	//把书添加到书架上
        	booksList.add(good1);
        	booksList.add(good2);
        	booksList.add(good3);
    	}
        /**
         * 根据输入对应的图书编号信息,进行书架图书信息遍历,找到图书编号所对应的信息
         * @param bookId 输入的图书编号
         * @return 找到的图书信息
         */
        public static Books getBooksById(int bookId) {
    		for(Books thisBooks : booksList) {
    		//判断当前书的Id 与输入的图书编号是否一致
    			if (thisBooks.getId() == bookId) {
    				return thisBooks;
    			}
    		}
    		//没找到Id对应的书,返回null
    		return null;
        }
        
        /**
         * 图书的售出信息保存到本地,可通过labe1标识来判断是否是修改文件还是新建文件
         * @param fileName  文件名
         * @param label 文件是否已存在的标识。true: 文件已存,则内容修改; false: 文件不存在,则新建文件
         * @param books 图书信息
         */
        public static void saveBooks (String fileName,boolean label,Books books) {
        	try {
        		BufferedOutputStream out = null; //操作文件的输出流
        		StringBuffer sbf = new StringBuffer() ; //记录文件中要存的数据
        		//判断该文件是否存在
            	if (label) {//说明已存在当天的文件,则在文件内容后追加新数据
                	out = new BufferedOutputStream(new FileOutputStream(fileName, true));
        		}else {//说明不存在当天的文件,则新建文件
        	    	out = new BufferedOutputStream(new FileOutputStream(fileName));
        		    //新文件中,需要写入表头信息
        	     	String[] fieldSort = {"图书编号","图书名称","购买数量","单价","总价","出版社"};
        	    	for (String field : fieldSort) {
    		  	    	sbf.append(field).append(",");
    		     	}
                }
            	//写入购买图书信息到表格
                sbf.append("\r\n");//添加换行符
                sbf.append(books.getId()).append(",");
                sbf.append(books.getName()).append(",");
                sbf.append(books.getNumber()).append(",");
                sbf.append(books.getPrice()).append(",");
                sbf.append(books.getMoney()).append(",");
                sbf.append(books.getPublish());
               //通过操作文件的输出流,把图书信息写入到文件中  
                String result = sbf.toString();
                byte[] bys = result.getBytes();
                out.write( bys );
                out.close();
    
        	}catch(IOException e){
        		e.printStackTrace();
        	}
        	
        }
    
    }
    
    

    运行上面的代码
    在这里插入图片描述
    在项目下点击Refresh,可以得到一个.csv结尾的文件,将该文件复制到桌面打开,可以看到书店的交易信息记录
    在这里插入图片描述

    展开全文
  • 3.1、保存时需要判断是否存在当天数据,如果存在,则追加,如果不存在则新建。 3.2、文件命名格式为“销售记录”加上当天日期加上“.csv”后缀 实现思路: 1、书店必须有书,创建实体书类Book(编号,名称,价格,...

    任务描述:

    1、该程序运行时,首先显示书店中所有的书籍。

    2、当用户输入图书编号时,可以查询到该编号对应的图书信息。

    3、用户继续输入购买数量,程序可以判断库存是否充足,如果充足,则将购买信息存入本地文件。

    3.1、保存时需要判断是否存在当天数据,如果存在,则追加,如果不存在则新建。

    3.2、文件命名格式为“销售记录”加上当天日期加上“.csv”后缀

    实现思路:

    1、书店必须有书,创建实体书类Book(编号,名称,价格,出版社,库存)

    2、书要放在书架上,在程序中,谁能作为书架呢?那么集合ArrayList把书添加到集合中。

    3、显示所有书,遍历集合。

    4、键盘录取编号,遍历集合,判断输入的编号和遍历到书的编号比较,如果相等,就返回这本书

    5、键盘录取数量,判断返回这本书的库存量和录入数量比较,如果大于录入的数量,把购买这本书的信息写到本地文件中。

    代码分部实现:

    首先要实现的就是要定义Book类,定义相应的构造方法和get、set方法。
    要注意,不要忘记重写toString方法

    public class StoreBook {
      public static void main(String[] args) {
       
      }
    }
    class Book{
     private int id;
     private String name;
     private double price;
     private int number;
     private String publice;
     public Book(int id, String name, double price, int number, String publice) {
      super();
      this.id = id;
      this.name = name;
      this.price = price;
      this.number = number;
      this.publice = publice;
     }
     public int getId() {
      return id;
     }
     public void setId(int id) {
      this.id = id;
     }
     public String getName() {
      return name;
     }
     public void setName(String name) {
      this.name = name;
     }
     public double getPrice() {
      return price;
     }
     public void setPrice(double price) {
      this.price = price;
     }
     public int getNumber() {
      return number;
     }
     public void setNumber(int number) {
      this.number = number;
     }
     public String getPublice() {
      return publice;
     }
     public void setPublice(String publice) {
      this.publice = publice;
     }
     public String toString() {//------------------------重写toString方法
      String message = "图书编号:"+getId()+"\t图书名称:"+getName()+"\t图书价格:"+getPrice()+"\t图书出版社:"+getPublice()+"\t图书库存量:"+getNumber();
      return message;
     }
    }

    如何创建书架唉?

    static ArrayList<Book> booklist = new ArrayList<Book>();

    知道为什么上面的集合要定义成静态的吗?因为这样更方便成员方法中该集合的调用。

    书架还要添加书的内容:
    这个时候,定义一个成员方法即可:

    public static void init() {//静态方法只能引用静态成员------------------把书添加到集合中的成员方法
      Book b1 = new Book(101,"java基础",60,30,"山东大学出版社");
      Book b2 = new Book(102,"武林外传",48.8,10,"国蛮出版社");
      Book b3 = new Book(103,"那些年一起追过的女孩",38.8,53,"匡威出版社");
      Book b4 = new Book(104,"红蛇崛起之战",55.8,2,"颖彤出版社");
      booklist.add(b1);
      booklist.add(b2);
      booklist.add(b3);
      booklist.add(b4);
     }

    还想根据书的编号来查找书籍并返回查找到的书籍,这个时候也只需要定义一个成员方法即可:

     public static Book getBookById(int id) {//根据书的编号来查找书籍并返回查找到的书籍
      for(Book thisbook : booklist) {
       if(thisbook.getId()==id)
        return thisbook;
      }
      return null;//未查找到书籍的编号时返回空
     }

    那么如何将文件命名格式为“销售记录”加上当天日期加上“.csv”后缀?

    class FileUtil{
     static final String a = "\r\n";
     static final String b = ",";
     public static void savaName(Book book) throws IOException {
      Date date = new Date();
      SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
      String riqi =sdf.format(date);
      String filename = "销售记录"+riqi+".csv";

    最关键啊,最重要的部分来了,仔细看,做好笔记:
    如何将文件写入本地文件呢?

    那么需要根据文件是否存在,来新建或者修改文件,并向文件中添加内容

    public static void creatFile(String name,Book book,boolean flag) throws IOException {//如果有文件追加内容,没有文件,创建文件再添加内容 
       BufferedOutputStream bos = null;
       StringBuffer sb = new StringBuffer();//方便追加内容 ,用来保存购买的书的记录,因为长度可变,用于追加
       try {
        if(flag) {//文件存在
        bos = new  BufferedOutputStream(new FileOutputStream(name,true));
        }else {
         bos = new BufferedOutputStream(new FileOutputStream(name,true));
         String []title = {"图书编号","图书名称","购买数量","单价","总价","出版社"};//用来保存表头
         //把表头的内容加到sb中
         for(String first : title)
          sb.append(first).append(b);
        }
        //将书的内容添加到StringBuffer中
        sb.append(a);//首先添加换行符
        sb.append(book.getId()).append(b);//添加图书编号
        sb.append(book.getName()).append(b);
        sb.append(book.getNumber()).append(b);
        sb.append(book.getPrice()).append(b);
        sb.append(book.getNumber()*book.getPrice()).append(b);
        sb.append(book.getPublice());
        String str = sb.toString();
        byte[] bt = str.getBytes();
         bos.write(bt);
         bos.flush();//刷新,清空缓冲区
       } catch (FileNotFoundException e) {
        // TODO 自动生成的 catch 块
        e.printStackTrace();
      }
       if(bos!=null)
        bos.close();
     }
    if(book.getNumber()>=buynumber) {
        //把购买的信息存入到 storebook 中
        Book storebook = new Book(book.getId(),book.getName(),book.getPrice(),buynumber,book.getPublice());
        //把信息保存到本地文件
        FileUtil.savaName(storebook);
        //修改库存量
        book.setNumber(book.getNumber()-buynumber);
       }else
        System.out.println("对不起,库存不足");
      }else
       System.out.println("图书编号未查找到!");
      }
    File f = new File(filename);//相对路径的文件表示
      if(f.exists())//文件存在
       creatFile(filename,book,true);
      else
       creatFile(filename,book,false);

    上面的代码都是分步实现的,那么根据我的前提思路加上上面的散散碎碎的代码

    如果你可以大致的了解这些代码应该怎么放置,怎么进行拼接的话,说明你已经懂得了大体的思路过程

    如果思路不过于清晰的话,下面的完整代码中还会有部分相应的注释

    下面来看完整的代码块演示:

    完整代码块:

    package liu;
    
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.Scanner;
    
    class Book{
     private int id;
     private String name;
     private double price;
     private int number;
     private String publice;
     public Book(int id, String name, double price, int number, String publice) {
      super();
      this.id = id;
      this.name = name;
      this.price = price;
      this.number = number;
      this.publice = publice;
     }
     public int getId() {
      return id;
     }
     public void setId(int id) {
      this.id = id;
     }
     public String getName() {
      return name;
     }
     public void setName(String name) {
      this.name = name;
     }
     public double getPrice() {
      return price;
     }
     public void setPrice(double price) {
      this.price = price;
     }
     public int getNumber() {
      return number;
     }
     public void setNumber(int number) {
      this.number = number;
     }
     public String getPublice() {
      return publice;
     }
     public void setPublice(String publice) {
      this.publice = publice;
     }
     public String toString() {//------------------------重写toString方法
      String message = "图书编号:"+getId()+"\t图书名称:"+getName()+"\t图书价格:"+getPrice()+"\t图书出版社:"+getPublice()+"\t图书库存量:"+getNumber();
      return message;
     }
    }
    //======================================================================================================
    //======================================================================================================
    //======================================================================================================
    public class BuyBookRecord{
     static ArrayList<Book> booklist = new ArrayList<Book>();
     public static void main(String[] args) throws IOException {
      //FileUtil.savaName();
      //初始化书架,把书添加到集合中
      init();
      for(Book b : booklist) {
       System.out.println(b);
      }
    //  for (int i = 0; i < booksList.size(); i++) {
    //   System.out.println(booksList.get(i));
    //  }
      //查找图书,并返回查找到的图书信息
      while(true) {
      System.out.print("请输入你要查找图书的编号:");
      Scanner sc = new Scanner(System.in);
      int id = sc.nextInt();
      if(id==0) {
       System.out.println("图书查询结束,感谢您的使用");
       break;
      }
      Book book = getBookById(id);
      if(book!=null) {
       System.out.println("当前图书信息为:"+book);
       System.out.print("请输入购买数量:");
       int buynumber = sc.nextInt();
       if(book.getNumber()>=buynumber) {
        //把购买的信息存入到 storebook 中
        Book storebook = new Book(book.getId(),book.getName(),book.getPrice(),buynumber,book.getPublice());
        //把信息保存到本地文件
        FileUtil.savaName(storebook);
        //修改库存量
        book.setNumber(book.getNumber()-buynumber);
       }else
        System.out.println("对不起,库存不足");
      }else
       System.out.println("图书编号未查找到!");
      }
     }
     public static void init() {//静态方法只能引用静态成员------------------把书添加到集合中的成员方法
      Book b1 = new Book(101,"java基础",60,30,"山东大学出版社");
      Book b2 = new Book(102,"武林外传",48.8,10,"国蛮出版社");
      Book b3 = new Book(103,"那些年一起追过的女孩",38.8,53,"匡威出版社");
      Book b4 = new Book(104,"红蛇崛起之战",55.8,2,"颖彤出版社");
      booklist.add(b1);
      booklist.add(b2);
      booklist.add(b3);
      booklist.add(b4);
     }
     public static Book getBookById(int id) {//根据书的编号来查找书籍并返回查找到的书籍
      for(Book thisbook : booklist) {
       if(thisbook.getId()==id)
        return thisbook;
      }
      return null;//未查找到书籍的编号时返回空
     }
    }
    //======================================================================================================
    //======================================================================================================
    //======================================================================================================
    class FileUtil{
     static final String a = "\r\n";
     static final String b = ",";
     public static void savaName(Book book) throws IOException {
      Date date = new Date();
      SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
      String riqi =sdf.format(date);
      String filename = "销售记录"+riqi+".csv";
      //System.out.println(filename);
    
      File f = new File(filename);//相对路径的文件表示
      if(f.exists())//文件存在
       creatFile(filename,book,true);
      else
       creatFile(filename,book,false);
     }
    
     /**根据文件是否存在,来新建或者修改文件,并向文件中添加内容
      * @param name 保存到本地的文件
      * @param book 追加的购买记录
      * @param flag
      * @throws IOException
      */
     //为方法添加注释块的快捷键为  : Alt+Shift+J
     public static void creatFile(String name,Book book,boolean flag) throws IOException {//如果有文件追加内容,没有文件,创建文件再添加内容 
       BufferedOutputStream bos = null;
       StringBuffer sb = new StringBuffer();//方便追加内容 ,用来保存购买的书的记录,因为长度可变,用于追加
       try {
        if(flag) {//文件存在
        bos = new  BufferedOutputStream(new FileOutputStream(name,true));
        }else {
         bos = new BufferedOutputStream(new FileOutputStream(name,true));
         String []title = {"图书编号","图书名称","购买数量","单价","总价","出版社"};//用来保存表头
         //把表头的内容加到sb中
         for(String first : title)
          sb.append(first).append(b);
        }
        //将书的内容添加到StringBuffer中
        sb.append(a);//首先添加换行符
        sb.append(book.getId()).append(b);//添加图书编号
        sb.append(book.getName()).append(b);
        sb.append(book.getNumber()).append(b);
        sb.append(book.getPrice()).append(b);
        sb.append(book.getNumber()*book.getPrice()).append(b);
        sb.append(book.getPublice());
        String str = sb.toString();
        byte[] bt = str.getBytes();
         bos.write(bt);
         bos.flush();//刷新,清空缓冲区
       } catch (FileNotFoundException e) {
        // TODO 自动生成的 catch 块
        e.printStackTrace();
      }
       if(bos!=null)
        bos.close();
     }
    }

    在这里插入图片描述
    当我们运行完之后并输入相对应的信息后,这个时候你要购买的信息就会写入到本地文件中去,你可能会问,为什么我的电脑上什么都没有增加,什么都没有变化,什么也没有出现,这并没有出现什么问题,你只需要进行刷新即可

    怎么刷新?为什么我刷新完还是没有呢?那是你刷新的地方不对,你需要在Java项目上进行刷新

    在这里插入图片描述

    你可能电脑出现的这个表打不开,教你一招:
    选择这个表进行鼠标右击,打开方式选择为系统编译器即可打开

    最终结果:

    在这里插入图片描述
    学习是进步的阶梯

    学习是进步的阶梯
    学习是进步的阶梯
    展开全文
  • 分类,统一记录

    2019-07-15 11:30:00
    区块链 区块链是一种分布式...这是区块链颠覆性特点,不存在任何中心机构和中心服务器,所有交易都发生在每个人电脑或手机上安装的客户端应用程序中。 2、开放性 区块链可以理解为一种公共记账的技术方案,系统是...

    区块链

    区块链是一种分布式数据库,是一串使用密码学方法相关联产生的数据块,每个数据块都包含了一次网络交易信息,用于验证其信息的有效性(每个区块都含有其上一个区块的哈希值,确保区块按照时间顺序连接的同时没有被篡改)

    1、去中心化

    这是区块链颠覆性特点,不存在任何中心机构和中心服务器,所有交易都发生在每个人电脑或手机上安装的客户端应用程序中。

    2、开放性

    区块链可以理解为一种公共记账的技术方案,系统是完全开放透明的,账簿对所有人公开,实现数据共享,任何人都可以查账。

    3、不可撤销、不可篡改和加密安全性

    区块链采取单向哈希算法,每个新产生的区块严格按照时间线形顺序推进,时间的不可逆性、不可撤销导致任何试图入侵篡改区块链内数据信息的行为易被追溯,导致被其他节点的排斥,造假成本极高,从而可以限制相关不法行为。

    什么是CDN

    CDN就是采用更多的缓存服务器(CDN边缘节点),布放在用户访问相对集中的地区或网络中。当用户访问网站时,利用全局负载技术,将用户的访问指向距离最近的缓存服务器上,由缓存服务器响应用户请求。

    (CDN这个技术其实说起来并不复杂,最初的核心理念,就是将内容缓存在终端用户附近)
    (内容源不是远么?那么,我们就在靠近用户的地方,建一个缓存服务器,把远端的内容,复制一份,放在这里,不就OK了)

    如果某个用户想要访问优酷的视频点播内容,步骤如下:

    ①、当用户点击APP上的内容,APP会根据URL地址去本地DNS(域名解析系统)寻求IP地址解析。

    ②、本地DNS系统会将域名的解析权交给CDN专用DNS服务器。

    ③、CDN专用DNS服务器,将CDN的全局负载均衡设备IP地址返回用户。

    ④、用户向CDN的负载均衡设备发起内容URL访问请求。

    ⑤、CDN负载均衡设备根据用户IP地址,以及用户请求的内容URL,选择一台用户所属区域的缓存服务器。

    ⑥、负载均衡设备告诉用户这台缓存服务器的IP地址,让用户向所选择的缓存服务器发起请求。

    ⑦、用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。

    ⑧、如果这台缓存服务器上并没有用户想要的内容,那么这台缓存服务器就要网站的源服务器请求内容。

    ⑨、源服务器返回内容给缓存服务器,缓存服务器发给用户,并根据用户自定义的缓存策略,判断要不要把内容缓存到缓存服务器上。

    镜像服务器和CDN的区别

    镜像服务器是源内容服务器的完整复制。而CDN,是部分内容的缓存,智能程度更高。
    确切地说,CDN=更智能的镜像+缓存+流量导流。

    CDN可以缓存的内容

    1、小文件:html、js、css、img等
    2、大文件:apk、rar等
    3、短视频文件:MP4、等
    4、为直播提供服务

    CDN的好处

    1、采用CDN技术,最大的好处,就是加速了网站的访问——用户与内容之间的物理距离缩短,用户的等待时间也得以缩短。
    2、分发至不同线路的缓存服务器,也让跨运营商之间的访问得以加速。例如中国移动手机用户访问中国电信网络的内容源,可以通过在中国移动假设CDN服务器,进行加速。效果是非常明显的。
    3、CDN还有安全方面的好处。内容进行分发后,源服务器的IP被隐藏,受到攻击的概率会大幅下降。而且,当某个服务器故障时,系统会调用临近的健康服务器,进行服务,避免对用户造成影响。

    云计算中心
    由一个核心云计算中心,对所有终端节点提供服务。

    对于非常大的面积区域,非常多的用户数量,尤其是国家级或世界级的服务,不管你把这个中心设在哪里,也不管你这个中心的能力有多强大,都无法克服物理距离上的障碍,会导致无法忍受的延时和网络拥塞。

    于是乎,人们就开始把云计算中心进行部分“下沉”,这才有了雾计算、霾计算。甚至人们开始质疑,集中式计算是否会最终被分布式计算所取代

    设计API

    1、风格统一 /v1/product/get(版本、业务模块、操作)
    2、职责单一 /v1/product/get(只做product的信息获取,参数可以有id、name等,可加排序等)
    3、添加版本 /v1/product/get(v1即是版本,当接口需要升级时,可开发V2版,使v1、v2共存)
    4、调用方便
    5、返回数据格式统一
    6、定义返回码
    7、考虑扩展、向后兼容
    8、并发量、防攻击、跨域?
    9、定义api界限(是否需要验证)
    10、协议规范http、https?
    11、请求方式get、post、put、delete

    转载于:https://www.cnblogs.com/jis121/p/11187859.html

    展开全文
  • 在无中央控制或者协调因素存在的独立行动个体之间达成的协议称为分布式共识,是完全分布式点对点系统中成员之间达成的一种协议 最长链标准 基于包含最多区块的区块链代表付出最多计算量的设想。用最长链标准很明显...

    系统中的任一节点都在检查一个新的区块(这个区块是由另一个节点或者努力成为下一个创建新区块的节点创建的)

    在无中央控制或者协调因素存在的独立行动个体之间达成的协议称为分布式共识,是完全分布式点对点系统中成员之间达成的一种协议


    最长链标准

    基于包含最多区块的区块链代表付出最多计算量的设想。用最长链标准很明显可剔除最短的那条链,然后此标准也不会产生一个明确的结果。

    区块链并不是一条笔直的链,有分支。分支代表了交易记录中各种有冲突的版本,但是基于最长链标准,所有节点都可以最终确定相同的历史交易记录


    最重链标准

    每条链花费的计算量可以通过其添加的所有区块的难度级别来衡量,可以通过使用区块头包含的哈希难题的难易程度来计算得到。一条链积累的难度称为重量

    动态地确定哈希难题的难度的区块链不能利用最长链标准,相反应该利用最重链标准


    在冲突的链中选择一条特定的链,并且将其确定为权威会带来以下结果

    • 孤块
      被抛弃的区块被称为孤块

    • 重新收回奖励
      创建并且提交孤块的节点的奖励将会被收回

    • 澄清所有权
      仅仅属于权威链上的交易才是有效的,可以用来澄清与所有权有关的请求

    • 重新处理交易
      孤块中的交易数据会被重新放到节点的收信箱中,重新处理,然后再添加到区块链数据结构中

    • 不断增长的共同主干
      查看的区块越新,确定区块是否属于最长链就越难

    • 最终一致性
      树状区块链数据结构的增长表现出一种随机性,由解决哈希难题的速度竞赛和通过网络传递信息的随机波动所决定的。发现新区块的节点确定哪条路径被扩展,那些区块被抛弃。随时间,权威链中已添加的区块的确定性会不断增加,并且最终会添加更多的区块,被称为最终一致性

    • 健壮的抗操纵性
      想操纵一个区块,攻击者需要重新解决区块的哈希难题,然后重新解决该区块之后所有区块的哈希难题,最后还需要赶上并且超过诚实节点所维护的权威链。试图建立一个包含欺诈性交易的尝试都会失败。结果是,权威链维护的历史交易记录抵抗操纵能力越来越强。


    区块链被操纵的目标:把权威链中的一部分区块变成孤儿块,并且建立一个新的对攻击者有利的权威链

    在经济上,操纵者试图通过改变历史交易记录来改变所有权的分配。
    对于集体决策的系统,这些操纵者试图收集大多数节点的投票权利,以执行期望的结果
    从技术角度来看,任何操纵集体决策过程的企图都是在破坏系统的完整性
    对于分布式系统,试图至少建立一个隐藏的中心控制节点,从而改变系统的状态。

    51%攻击是指控制整个分布式系统的集体决策过程,旨在将现有的权威链中的区块变成孤块,并且建立一条包含对攻击发起者更有利的历史交易记录的新权威链


    哈希难题的作用

    是使区块链数据结构不可更改的一种手段
    在达成有关历史交易记录的过程中,组成区块链的个体区块可以视为一种投票,而哈希难题可以被视为是一种选票,而哈希难题使得提交选票成本昂贵,从而使不诚实的选民无法参与投票

    区块链通过哈希难题将投票权和计算能力结合在一起,故任何试图控制大多数投票权的尝试,实际上意味着要收集整个点对点系统中大部分的计算能力

    参加投票的费用是解决哈希难题所 必需付出的,一个节点将通过提交自己发现的新区块来获得奖励


    网络发送信息延迟或者两个节点几乎同时创建新区块时,会使区块链产生分支,并且其上的分支均由共同主干产生


    区块链的集体决策的特点

    • 决策问题是在所有的节点上选出相同的历史交易记录

    • 为了使得自身利益最大化,各个节点会将自己发现的新块发送给其他所有的节点,让其他节点来检查新区块


    随着时间的推移,权威链中所添加的区块的确定性会不断地增加,并且最终会添加更多的区块,称为最终一致性

    展开全文
  • 比特币-交易

    2017-07-11 11:31:32
    每一笔交易都会向整个P2P网络广播该货币的交易记录。通过投票机制,来决定该支付交易是否正常。 比特币通过“挖矿”机制保证了能任意造币。 通过分布式网络和HashCash机制解决双重支付问题。 事实上比特币系统...
  • 转账交易时,需要对方是一定在线的,因为转账只是在区块链系统数记录一下,把当前的账户的比特币转到对方账户上,对方是不是当时在区块链网络里,这个是没有关系的。 问题二:假设谋个全节点接受到了转账交易, 有...
  • 已知:oracle数据有一表...我查找上一交易日时,采取的思路是,在日历表中查找日期小于当前日期的记录且限定记录数为1, select tdate from trade_date where rownum; 大家觉得这样可行吗,或者有没有更好的思路?
  • 记录自己的bug

    2020-07-11 15:34:16
    中间存在7分钟的空没执行,后续其他方法正常执行,获取区块高度方法执行。 过程 检查日志,发现半夜突然又莫名的后台管理登录接口访问。 发现大概率爬虫,暂时不管了。 继续检查,发现了报错 以为是定时任务挂掉...
  • 比特币交易(Transaction)的输入与输出...事实上比特币系统中不存在独立的电子货币,而只存在交易单(账单),货币值是依附于交易单存在的,所以比特币中的电子货币实质上交易的账单记录的变化,确切的说是货币交易...
  • 交易经验不是太多,日志是记录下自己的思考的过程,索性也大言不惭得谈谈交易思想.  顺势交易,是所有做交易的人耳熟能详的词. 趋势真的存在吗?打开交易软件,一根根K线连起来的走势告诉了我们答案:趋势确实是存在的....
  • 以太坊JSON-RPC公链异常记录

    千次阅读 2018-03-30 10:19:36
    楼主使用的是json-rpc:eth_sendRawTransaction使用私钥,keystore和密码落地,这种...交易已经存在,解决nonce为最新的值,创建交易签名时nonce值。 2.insufficient funds for gas * price + value 发起转账用户...
  • 缺点:可能存在数据库中有记录,但是文件在服务器被删除,此种判断准确。 2、通过文件在远程服务器的地址直接判断文件在服务器是否存在。 解决方案 通过ajax直接访问来判断 $.ajax({ url:"",// 文件的URL路径 ...
  • Mysql系列第八讲排序查询(order by)单字段排序多字段排序按别名排序按函数排序where之后进行排序limit介绍获取前n行记录获取最大的一条记录获取排名第n到m的记录分页查询避免踩坑limit中能使用表达式limit后面的...
  • 事实上山寨币系统中不存在独立的电子货币,而只存在交易单(账单),货币值是依附于交易单存在的,所以山寨币中的电子货币实质上交易的账单记录的变化,确切的说是货币交易(Transactions)的 数字签名链,它的数字...
  • 以太坊:处理交易,保存交易记录,支持简单的查询 通过MetaMask调用网关( ) 特色概念 去中心化交易 版权清晰,供应方上传文件后即可自动获得版权申明,并在被购买后获得第一手授权方信息 交易透明,不存在各种...
  • UTXO Bitcoin 采用了 UTXO 模型作为其底层存储的数据结构,其全称为 ...BTC账本历史并不记录某个地址对应的BTC余额,地址的总余额是某一时刻与它关联的所有未使用输出的BTC数额之和。**所有未使用的交易输出(Unspen
  • 在全球的艺术品交易市场,2017年的艺术品拍卖总额是149亿美元,这只是有记录的拍卖交易包括非公开的私人交易。根据巴克利银行的推荐数据:机构投资者与高端人士会配置5%的资产进行艺术品投资,据此估计,潜在的...
  • 小弟在sql server上写一个存储过程,要将上海证券交易所的大盘指数记录读到sql server的表里 但是上证的数据库show2003dbf文件里大盘指数000001这条记录默认是标记删除的 我在sqlserver上的配置了...
  • 在Cointelegraph发布后,AMFEIX发布了一份新的白皮书,描述了几项以前文档记录中并不存在的新政策。其中值得注意的是,AMFEIX添加了一项包含了关于诽谤的条款,并依据该条款要求Cointelegraph删除文章并公开道歉。...
  • 公众应当时时牢记股票交易的要领。 当某个股票上涨的时候,并需要详细解释为什么它会上涨。必须存在连续的买进,才能促使某个股票保持上涨势头。 而只要该股票保持上涨,并且在这过程中只是不时发生小幅的自然...
  • 车牌号”时都有数据,但是这样做符合检索要求。请各位同仁帮忙看看 ``` SELECT DT.时间,DT.车牌号, IIF(AA.燃油费 IS NULL, 0,AA.燃油费) AS 燃油费 FROM (SELECT FORMAT(DATEADD('m',BS.NUM,begin),'yyyy年...
  • 原标题:不是吧,不会有人还知道MySQL...插入或替换如果我们想插入一条新记录(INSERT),但如果记录已经存在,就先删除原记录,再插入新记录。情景示例:这张表存的每个客户最近一次交易订单信息,要求保证单个用户...
  • 虽然涉及的金额不大,与证券交易所的资料核对上,昨晚对历史记录和当日交易记录进行了比较,发现在同一时刻往往有几个用户的交易数据出错。怀疑存在病毒或恶意用户捣乱的可能,用多套软件查杀病毒,并重新安装系统...
  • 前天晚上知道了北大学生的话被放到区块链,昨天朋友圈就被这个信息刷屏了,大家都在转发那个交易记录的链接。 为什么要放到区块链上呢?因为区块链的特性之一就是能删除,可篡改。评论数量从刚看到时的2个涨到...
  • 区块链需要迈过的几道坎

    千次阅读 2016-11-03 19:16:34
    从我的理解而言,区块链是一种“共识”实现技术,通过区块链可以记录网际间所有的交易,供区块链的用户见证实现“共识”,且链上信息内容“可篡改”。而这种“可篡改”性是通过系统内多个副本的存在增加了内容被...
  • 1.什么是比特币比特币的初衷是一种自由的货币,最初喜欢上这种货币的人,都对...比特币存在整个p2p网络里面,每一台装有bitcoin客户端的电脑都会从网络同步所有的交易记录。钱包是你的私钥。Double-spending:比如我...
  • 比特币学习笔记与理解

    千次阅读 2018-06-12 19:36:45
    之前已存在交易系统,都是中心化的,由一个中心化的机构(例如银行)来管理记录一个账本,可以说非常简单粗暴的解决了“双重支付”,其安全保证是这个中心机构自身非常强大,很难攻破。而比特币解决这个问题,不是...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 248
精华内容 99
关键字:

交易记录不存在