java學習

          java學習

           

          分布式鎖應該具備的條件

          1、在分布上系統環境下,一個方法在同一時間只能被一個機器上的一個線程訪問
          2、高可用的獲取鎖和釋放鎖
          3、高效的獲取鎖和釋放鎖
          4、具備可重入特性(重新進入,由多個任務并發使用,不比擔心數據錯誤)
          5、具備鎖的失效機制,防止死鎖
          6、具備非阻塞鎖的特性,沒有獲取到鎖,直接返回獲取鎖失敗

          posted @ 2020-03-24 12:47 楊軍威 閱讀(558) | 評論 (0)編輯 收藏

          docker 安裝 registry

          1。新建/usr/local/docker/registry  文件夾
          2、在registry中新建docker-compose.yml文件,編輯此文件
          version: '3.1'
          services:
           registry:
            image: registry:2.7.1
            restart: always
            container_name: registry
            ports:
             - 5000:5000
            volumes:
             - /usr/local/docker/registry/data:/var/lib/registry
           frontend:
              image: konradkleine/docker-registry-frontend:v2
              ports:
                - 8080:80
              volumes:
                - ./certs/frontend.crt:/etc/apache2/server.crt:ro
                - ./certs/frontend.key:/etc/apache2/server.key:ro
              environment:
                - ENV_DOCKER_REGISTRY_HOST=192.168.1.8
                - ENV_DOCKER_REGISTRY_PORT=5000
          3.運行 docker-compose up
          4.上傳鏡像
          docker tag tomcat 192.168.1.8:5000/tomcat:8.1
           docker push 192.168.1.8:5000/tomcat:8.1

          posted @ 2020-03-19 18:17 楊軍威 閱讀(140) | 評論 (0)編輯 收藏

          docker 安裝MySQL

          version: '3.1' services: mysql: restart: always image: mysql:5.7.22 container_name: mysql ports: - 3306:3306 environment: TZ: Asia/Shanghai MYSQL_ROOT_PASSWORD: 123456 command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --explicit_defaults_for_timestamp=true --lower_case_table_names=1 --max_allowed_packet=128M --sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO" volumes: - mysql-data:/var/lib/mysql volumes: mysql-data:

          version: '3.1' services: db: image: mysql restart: always environment: MYSQL_ROOT_PASSWORD: 123456 command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --explicit_defaults_for_timestamp=true --lower_case_table_names=1 ports: - 3306:3306 volumes: - ./data:/var/lib/mysql adminer: image: adminer restart: always ports: - 8080:8080

          posted @ 2020-03-19 13:29 楊軍威 閱讀(125) | 評論 (0)編輯 收藏

          docker離線安裝

          批量安裝依賴包:rpm -Uvh *.rpm --nodeps --force

          安裝 container-selinux-2.9-4.el7.noarch.rpm : rpm -Uvh container-selinux-2.9-4.el7.noarch.rpm

          pasting

          安裝 dockerrpm -Uvh docker-ce-18.03.1.ce-1.el7.centos.x86_64.rpm

          pasting
          • 啟動docker:systemctl start docker
          • 查看docker啟動容器列表: docker ps

          posted @ 2020-03-17 13:50 楊軍威 閱讀(235) | 評論 (0)編輯 收藏

          oracle 表空間修改

          select d.file_name,d.tablespace_name,d.autoextensible from dba_temp_files d;
          select d.file_name,d.tablespace_name,d.autoextensible from DBA_DATA_FILES d;
          drop tablespace tablespace_name including contents and datafiles;
          ALTER TABLESPACE users ADD DATAFILE
          '/app/oradata/orclnew/orclnew/users02.dbf' 
          size 7167M autoextend on ;


          SELECT sid, serial#, username, osuser FROM v$session where sid in (select session_id from v$locked_object);
          刪除連接的session
          ALTER SYSTEM KILL SESSION '9,4335';
          導出oracle數據
          exp xxx/xxx@orclnew file=/app/backup.dmp owner=xxx rows=n 
          當導出報錯信息是 EXP-00091: Exporting questionable statistics時,執行下面的語句
          select userenv('language') from dual;
          export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

          posted @ 2019-11-28 17:13 楊軍威 閱讀(94) | 評論 (0)編輯 收藏

          反編譯jar重新打包jar

          1、使用反編譯工具找到需要修改的class文件,保存成Java文件。
          2、新建Java項目,導入所有需要的jar,在src中放入需要修改的Java文件。
          3、修改完畢后,在bin中找到新生成的class文件,解壓原來的jar,替換class文件。
          4.有三種方式重新打包,a 把解壓替換過的jar文件導入到eclipse中,導出jar
          b 使用zip壓縮格式,修改后綴名jar
          c  進入文件目錄,使用執行jar -cvf aa.jar

          posted @ 2019-06-06 12:32 楊軍威 閱讀(1622) | 評論 (0)編輯 收藏

          java future 線程模式

          public interface Data {
          String getResult();
          }
          public class FutureData implements Data{
          protected Data data=null;
          protected boolean f=false;
          public synchronized void setData(Data data) {
          if(f) {
          return;
          }
          f=true;
          this.data=data;
          notifyAll();
          }
          @Override
          public synchronized String getResult() {
          while (!f) {
          try {
          wait();
          } catch (InterruptedException e) {
          e.printStackTrace();
          }
          }
          return data.getResult();
          }
          }
          public class RealData implements Data{
          protected  String s;
          public RealData(String name) {
          StringBuffer sb=new StringBuffer("");
          for (int i = 0; i < 10; i++) {
          sb.append(name);
          try {
          Thread.sleep(1000);
          } catch (InterruptedException e) {
          e.printStackTrace();
          }
          }
          s=sb.toString();
          }
          @Override
          public String getResult() {
          // TODO Auto-generated method stub
          return s;
          }
          }
          public class Client {
          public Data request(final String ss) {
          final FutureData f=new FutureData();
          new Thread() {
          public void run() {
          RealData r=new RealData(ss);//模擬復雜的數據封裝和處理
          f.setData(r);
          };
          }.start();
          return f;
          public static void main(String[] args) {
          Client client=new Client();
          Data d = client.request("123");
          System.out.println(d.getResult());
          }
          }
          public class FutureTest {
          public static void main(String[] args) throws InterruptedException, ExecutionException {
          ExecutorService e=Executors.newFixedThreadPool(11);
          FutureTask<String> f=new FutureTask<>(new Callable<String>() {
          @Override
          public String call() throws Exception {
          Thread.sleep(5000);
          return "aa";
          }
          }); 
          e.submit(f);
          System.out.println(f.get());
          }
          }

          posted @ 2019-02-18 10:08 楊軍威 閱讀(124) | 評論 (0)編輯 收藏

          定期清理tomcat日志


          vi clean.sh


          logs_path="/appqqq/tomcat/logs"

          find $logs_path -mtime +3 -name "localhost.*.log" -exec rm -rf {} \;
          find $logs_path -mtime +3 -name "localhost_access_log.*.txt" -exec rm -rf {} \;
          find $logs_path -mtime +3 -name "catalina.*.log" -exec rm -rf {} \;
          find $logs_path -mtime +3 -name "manager.*.log" -exec rm -rf {} \;
          find $logs_path -mtime +3 -name "host-manager.*.log" -exec rm -rf {} \;
          find $logs_path -mtime +3 -name "fileservice.log.*" -exec rm -rf {} \;
          >$logs_path/catalina.out;




          chmod 777 clean.sh

          crontab -e

          0 2 * * * sh /appqqq/tomcat/logs/clean.sh

          posted @ 2018-11-29 18:09 楊軍威 閱讀(384) | 評論 (0)編輯 收藏

          elasticsearch 商品搜索信息的crud簡單操作

          課程大綱
          1、document數據格式
          2、電商網站商品管理案例:背景介紹
          3、簡單的集群管理
          4、商品的CRUD操作(document CRUD操作)
          ----------------------------------------------------------------------------------------------------------------------------
          1、document數據格式
          面向文檔的搜索分析引擎
          (1)應用系統的數據結構都是面向對象的,復雜的
          (2)對象數據存儲到數據庫中,只能拆解開來,變為扁平的多張表,每次查詢的時候還得還原回對象格式,相當麻煩
          (3)ES是面向文檔的,文檔中存儲的數據結構,與面向對象的數據結構是一樣的,基于這種文檔數據結構,es可以提供復雜的索引,全文檢索,分析聚合等功能
          (4)es的document用json數據格式來表達
          2、電商網站商品管理案例背景介紹
          有一個電商網站,需要為其基于ES構建一個后臺系統,提供以下功能:
          (1)對商品信息進行CRUD(增刪改查)操作
          (2)執行簡單的結構化查詢
          (3)可以執行簡單的全文檢索,以及復雜的phrase(短語)檢索
          (4)對于全文檢索的結果,可以進行高亮顯示
          (5)對數據進行簡單的聚合分析
          ----------------------------------------------------------------------------------------------------------------------------
          3、簡單的集群管理
          (1)快速檢查集群的健康狀況
          es提供了一套api,叫做cat api,可以查看es中各種各樣的數據
          GET /_cat/health?v
          epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
          1488006741 15:12:21  elasticsearch yellow          1         1      1   1    0    0        1             0                  -                 50.0%
          epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
          1488007113 15:18:33  elasticsearch green           2         2      2   1    0    0        0             0                  -                100.0%
          epoch      timestamp cluster       status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
          1488007216 15:20:16  elasticsearch yellow          1         1      1   1    0    0        1             0                  -                 50.0%
          如何快速了解集群的健康狀況?green、yellow、red?
          green:每個索引的primary shard和replica shard都是active狀態的
          yellow:每個索引的primary shard都是active狀態的,但是部分replica shard不是active狀態,處于不可用的狀態
          red:不是所有索引的primary shard都是active狀態的,部分索引有數據丟失了
          為什么現在會處于一個yellow狀態?
          我們現在就一個筆記本電腦,就啟動了一個es進程,相當于就只有一個node?,F在es中有一個index,就是kibana自己內置建立的index。由于默認的配置是給每個index分配5個primary shard和5個replica shard,而且primary shard和replica shard不能在同一臺機器上(為了容錯)?,F在kibana自己建立的index是1個primary shard和1個replica shard。當前就一個node,所以只有1個primary shard被分配了和啟動了,但是一個replica shard沒有第二臺機器去啟動。
          做一個小實驗:此時只要啟動第二個es進程,就會在es集群中有2個node,然后那1個replica shard就會自動分配過去,然后cluster status就會變成green狀態。
          (2)快速查看集群中有哪些索引
          GET /_cat/indices?v
          health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size
          yellow open   .kibana rUm9n9wMRQCCrRDEhqneBg   1   1          1            0      3.1kb          3.1kb
          (3)簡單的索引操作
          創建索引:PUT /test_index?pretty
          health status index      uuid                   pri rep docs.count docs.deleted store.size pri.store.size
          yellow open   test_index XmS9DTAtSkSZSwWhhGEKkQ   5   1          0            0       650b           650b
          yellow open   .kibana    rUm9n9wMRQCCrRDEhqneBg   1   1          1            0      3.1kb          3.1kb
          刪除索引:DELETE /test_index?pretty
          health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size
          yellow open   .kibana rUm9n9wMRQCCrRDEhqneBg   1   1          1            0      3.1kb          3.1kb
          ----------------------------------------------------------------------------------------------------------------------------
          4、商品的CRUD操作
          (1)新增商品:新增文檔,建立索引
          PUT /index/type/id
          {
            "json數據"
          }
          PUT /ecommerce/product/1
          {
              "name" : "gaolujie yagao",
              "desc" :  "gaoxiao meibai",
              "price" :  30,
              "producer" :      "gaolujie producer",
              "tags": [ "meibai", "fangzhu" ]
          }
          {
            "_index": "ecommerce",
            "_type": "product",
            "_id": "1",
            "_version": 1,
            "result": "created",
            "_shards": {
              "total": 2,
              "successful": 1,
              "failed": 0
            },
            "created": true
          }
          PUT /ecommerce/product/2
          {
              "name" : "jiajieshi yagao",
              "desc" :  "youxiao fangzhu",
              "price" :  25,
              "producer" :      "jiajieshi producer",
              "tags": [ "fangzhu" ]
          }
          PUT /ecommerce/product/3
          {
              "name" : "zhonghua yagao",
              "desc" :  "caoben zhiwu",
              "price" :  40,
              "producer" :      "zhonghua producer",
              "tags": [ "qingxin" ]
          }
          es會自動建立index和type,不需要提前創建,而且es默認會對document每個field都建立倒排索引,讓其可以被搜索
          (2)查詢商品:檢索文檔
          GET /index/type/id
          GET /ecommerce/product/1
          {
            "_index": "ecommerce",
            "_type": "product",
            "_id": "1",
            "_version": 1,
            "found": true,
            "_source": {
              "name": "gaolujie yagao",
              "desc": "gaoxiao meibai",
              "price": 30,
              "producer": "gaolujie producer",
              "tags": [
                "meibai",
                "fangzhu"
              ]
            }
          }
          (3)修改商品:替換文檔
          PUT /ecommerce/product/1
          {
              "name" : "jiaqiangban gaolujie yagao",
              "desc" :  "gaoxiao meibai",
              "price" :  30,
              "producer" :      "gaolujie producer",
              "tags": [ "meibai", "fangzhu" ]
          }
          {
            "_index": "ecommerce",
            "_type": "product",
            "_id": "1",
            "_version": 1,
            "result": "created",
            "_shards": {
              "total": 2,
              "successful": 1,
              "failed": 0
            },
            "created": true
          }
          {
            "_index": "ecommerce",
            "_type": "product",
            "_id": "1",
            "_version": 2,
            "result": "updated",
            "_shards": {
              "total": 2,
              "successful": 1,
              "failed": 0
            },
            "created": false
          }
          PUT /ecommerce/product/1
          {
              "name" : "jiaqiangban gaolujie yagao"
          }
          替換方式有一個不好,即使必須帶上所有的field,才能去進行信息的修改
          (4)修改商品:更新文檔
          POST /ecommerce/product/1/_update
          {
            "doc": {
              "name": "jiaqiangban gaolujie yagao"
            }
          }
          {
            "_index": "ecommerce",
            "_type": "product",
            "_id": "1",
            "_version": 8,
            "result": "updated",
            "_shards": {
              "total": 2,
              "successful": 1,
              "failed": 0
            }
          }
          我的風格,其實有選擇的情況下,不太喜歡念ppt,或者照著文檔做,或者直接粘貼寫好的代碼,盡量是純手敲代碼
          (5)刪除商品:刪除文檔
          DELETE /ecommerce/product/1
          {
            "found": true,
            "_index": "ecommerce",
            "_type": "product",
            "_id": "1",
            "_version": 9,
            "result": "deleted",
            "_shards": {
              "total": 2,
              "successful": 1,
              "failed": 0
            }
          }
          {
            "_index": "ecommerce",
            "_type": "product",
            "_id": "1",
            "found": false
          }

          posted @ 2018-11-10 18:31 楊軍威 閱讀(144) | 評論 (0)編輯 收藏

          每個班的前10名的MySQL 查詢方法

          1. select a.class,a.score
          2. from student a
          3. where (select count(*) from student where class=a.class and a.score<score)<3
          4. order by a.class,a.score desc;

          posted @ 2018-08-09 14:32 楊軍威 閱讀(527) | 評論 (0)編輯 收藏

          僅列出標題
          共43頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 

          導航

          統計

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 什邡市| 太谷县| 洛南县| 澜沧| 宾川县| 丰城市| 蕲春县| 曲靖市| 唐山市| 星子县| 封丘县| 冷水江市| 象州县| 泸定县| 确山县| 二连浩特市| 姜堰市| 山西省| 凤庆县| 云霄县| 新巴尔虎右旗| 余江县| 鸡西市| 文山县| 平潭县| 营山县| 辽中县| 封开县| 新宾| 宁德市| 钟山县| 河曲县| 广德县| 沐川县| 金沙县| 图木舒克市| 义马市| 邵阳县| 宿州市| 郯城县| 益阳市|