ToB企服应用市场:ToB评测及商务社交产业平台

标题: Java扩展Nginx之七:共享内存 [打印本页]

作者: 惊落一身雪    时间: 2023-7-17 06:09
标题: Java扩展Nginx之七:共享内存
欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览


用堆内存保存计数

  1. package com.bolingcavalry.sharedmap;
  2. import nginx.clojure.java.ArrayMap;
  3. import nginx.clojure.java.NginxJavaRingHandler;
  4. import java.io.IOException;
  5. import java.util.Map;
  6. import java.util.UUID;
  7. import static nginx.clojure.MiniConstants.CONTENT_TYPE;
  8. import static nginx.clojure.MiniConstants.NGX_HTTP_OK;
  9. public class HeapSaveCounter implements NginxJavaRingHandler {
  10.     /**
  11.      * 通过UUID来表明当前jvm进程的身份
  12.      */
  13.     private String tag = UUID.randomUUID().toString();
  14.     private int requestCount = 1;
  15.     @Override
  16.     public Object[] invoke(Map<String, Object> map) throws IOException {
  17.         String body = "From "
  18.                     + tag
  19.                     + ", total request count [ "
  20.                     + requestCount++
  21.                     + "]";
  22.         return new Object[] {
  23.                 NGX_HTTP_OK, //http status 200
  24.                 ArrayMap.create(CONTENT_TYPE, "text/plain"), //headers map
  25.                 body
  26.         };
  27.     }
  28. }
复制代码
  1. worker_processes  auto;
复制代码
  1. location /heapbasedcounter {
  2.         content_handler_type 'java';
  3.     content_handler_name 'com.bolingcavalry.sharedmap.HeapSaveCounter';
  4. }
复制代码
  1. (base) willdeMBP:~ will$ jps
  2. 4944
  3. 4945
  4. 4946
  5. 4947
  6. 4948
  7. 4949
  8. 4950
  9. 4968 Jps
  10. 4943
复制代码
关于共享内存

特性Tiny MapHash Map键数量2^31=2.14Billions64位系统:2^63
32位系统:2^31使用内存上限64位系统:4G
32位系统:2G受限于操作系统单个键的大小16M受限于操作系统单个值的大小64位系统:4G
32位系统:2G受限于操作系统entry对象自身所用内存24 byte64位系统:40 byte
32位系统:28 byte
使用共享内存

  1. # 增加一个共享内存的初始化分配,类型tiny,空间1M,键数量8K
  2. shared_map uri_access_counters  tinymap?space=1m&entries=8096;
复制代码
  1. package com.bolingcavalry.sharedmap;
  2. import nginx.clojure.java.ArrayMap;
  3. import nginx.clojure.java.NginxJavaRingHandler;
  4. import nginx.clojure.util.NginxSharedHashMap;
  5. import java.io.IOException;
  6. import java.util.Map;
  7. import java.util.UUID;
  8. import static nginx.clojure.MiniConstants.CONTENT_TYPE;
  9. import static nginx.clojure.MiniConstants.NGX_HTTP_OK;
  10. public class SharedMapSaveCounter implements NginxJavaRingHandler {
  11.     /**
  12.      * 通过UUID来表明当前jvm进程的身份
  13.      */
  14.     private String tag = UUID.randomUUID().toString();
  15.     private NginxSharedHashMap smap = NginxSharedHashMap.build("uri_access_counters");
  16.     @Override
  17.     public Object[] invoke(Map<String, Object> map) throws IOException {
  18.         String uri = (String)map.get("uri");
  19.         // 尝试在共享内存中新建key,并将其值初始化为1,
  20.         // 如果初始化成功,返回值就是0,
  21.         // 如果返回值不是0,表示共享内存中该key已经存在
  22.         int rlt = smap.putIntIfAbsent(uri, 1);
  23.         // 如果rlt不等于0,表示这个key在调用putIntIfAbsent之前已经在共享内存中存在了,
  24.         // 此时要做的就是加一,
  25.         // 如果relt等于0,就把rlt改成1,表示访问总数已经等于1了
  26.         if (0==rlt) {
  27.             rlt++;
  28.         } else {
  29.             // 原子性加一,这样并发的时候也会顺序执行
  30.             rlt = smap.atomicAddInt(uri, 1);
  31.             rlt++;
  32.         }
  33.         // 返回的body内容,要体现出JVM的身份,以及share map中的计数
  34.         String body = "From "
  35.                 + tag
  36.                 + ", total request count [ "
  37.                 + rlt
  38.                 + "]";
  39.         return new Object[] {
  40.                 NGX_HTTP_OK, //http status 200
  41.                 ArrayMap.create(CONTENT_TYPE, "text/plain"), //headers map
  42.                 body
  43.         };
  44.     }
  45. }
复制代码

  1. location /sharedmapbasedcounter {
  2.     content_handler_type 'java';
  3.         content_handler_name 'com.bolingcavalry.sharedmap.SharedMapSaveCounter';
  4. }
复制代码
一点延伸

源码下载

名称链接备注项目主页https://github.com/zq2599/blog_demos该项目在GitHub上的主页git仓库地址(https)https://github.com/zq2599/blog_demos.git该项目源码的仓库地址,https协议git仓库地址(ssh)git@github.com:zq2599/blog_demos.git该项目源码的仓库地址,ssh协议
欢迎关注博客园:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4