这个方法的优势是多进程,劣势也很明显,只允许操作key为uint32 value为uint32的数据。
 
https://www.cnblogs.com/dearplain/p/11578588.html
 
1.初始化,在共享内存上生成40个1000数组,数组每个项8个字节,4字节是key,4字节是value。
40个数组有不同的少于1000的hash(即模,为998, 997, 991, 983, 982, 977, 976, 974, 971, 967, 964, 958, 956, 953, 947, 9
44, 941, 937, 934, 932, 929, 926, 922, 919, 916, 914, 911, 908, 907, 904, 898, 892, 887, 886, 883, 881, 878, 877, 872, 866)。
 
2.循环查找,从40个数组找到节点,index=key%hash,如果存在(原子读),则更新,如果不存在,增加节点后更新。
 
3.compare and swap 支持set操作。(如果失败就重新走流程)
 
4.atomic add支持原子增减。
 
5.compare and swap 支持增加节点操作。(如果失败就重新走流程)
 
6.如果40个数组都找不到,也没有空闲节点,则失败。
 
7.收集,agent会几秒内收集所有的数据,并将key和value全部置零。根据下面的计算,可以允许在同一机器上,几秒内同时使用37000个key,能满足大部分需求。
a = [0] * 40000
for i in range(1, 1000000):
done = 0
j = 0
for h in [998, 997, 991, 983, 982, 977, 976, 974, 971, 967, 964, 958, 956, 953, 947, 944, 941, 937, 934, 932, 929, 926, 922, 919, 916, 914, 911, 908, 907, 904, 898, 892, 887, 886, 883, 881, 878, 877, 872, 866]:
j = j+1
if a[i%h+(j-1)*1000] == 0:
a[i%h+(j-1)*1000] = 1
done = 1
break
if done == 0:
print('error in:', i)
break

共享内存多进程key value操作的更多相关文章

  1. 删除共享内存后key为0x00000000的问题

    一开始是 ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status root dest gyf ...

  2. python 多进程锁Lock和共享内存

    多进程锁 lock = multiprocessing.Lock() 创建一个锁 lock.acquire() 获取锁 lock.release() 释放锁 with lock: 自动获取.释放锁 类 ...

  3. php 共享内存

    共享内存主要用于进程间通信 php中的共享内存有两套扩展可以实现 1.shmop  编译时需要开启 --enable-shmop 参数 实例: $shm_key = ftok(__FILE__, 't ...

  4. Linux 程序设计1:深入浅出 Linux 共享内存

    笔者最近在阅读Aerospike 论文时,发现了Aerospike是利用了Linux 共享内存机制来实现的存储索引快速重建的.这种方式比传统利用索引文件进行快速重启的方式大大提高了效率.(减少了磁盘 ...

  5. Linux IPC System V 共享内存

    模型 #include<sys/types.h> #include<sys/ipc.h> #include<sys/shm.h> ftok() //获取key值 s ...

  6. linux第11天 共享内存和信号量

    今天主要学习了共享内存和信号量 在此之前,有个管道问题 ls | grep a 整句话的意思是将ls输出到管道的写端,而流通到另一端的读端,grep a则是从管道的读端读取相关数据,再做筛选 共享内存 ...

  7. Linux共享内存(一)

    inux系统编程我一直看 <GNU/LINUX编程指南>,只是讲的太简单了,通常是书和网络上的资料结合着来掌握才比较全面 .在掌握了书上的内容后,再来都其他资料 . 原文链接 http:/ ...

  8. UNIX环境高级编程——System V 共享内存区

    共享内存区域是被多个进程共享的一部分物理内存.如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信.共享内存是进程间共享数据的一种最 ...

  9. Linux IPC实践(9) --System V共享内存

    共享内存API #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int ...

随机推荐

  1. Django框架admin后台管理和用户端静态文件

    目录 一.admin后台管理 1. 如何使用 2. 路由分发的本质 二.用户上传的静态文件的展示 1. media配置 2. 手动开设media接口 三.图片防盗链 一.admin后台管理 djang ...

  2. 学习了解使用docker

    学习了解使用docker docker是项目开发部署相关工具容器,本文通过官网等资料阅读学习,简单介绍一些基本使用操作: docker是什么 2.docker安装使用 连接进入docker容器 doc ...

  3. Java多态练习题

    需求: 宠物饿了,需要铲屎官给宠物喂食. 不同宠物吃的东西不一样. 不同宠物恢复后体力值不一样. 铲屎官和狗狗玩接飞盘游戏,狗狗健康值减少10,与铲屎官亲密度增加5 铲屎官和 企鹅玩游泳游戏,企鹅健康 ...

  4. java 基础语法学习

    kuangstudy 注释 单行注释 多行注释 文档注释 public class HelloWorld { public static void main(String[] args) { //单行 ...

  5. JAVA-标识符、变量、数据类型

    标识符和关键字 ​ 所有的标识符否应该以字母a ~ z和 A ~Z ,美元符($).下划线(_)开始. ​ 首字符之后可以是字母a ~ z和 A ~Z ,美元符($).下划线(_)的任意字符组合. 注 ...

  6. JS获取时间日期常用方法

    1 当前时间: new Date() 2 当前周: function getCurrentWeek() { var date = new Date() var beginDate = new Date ...

  7. android 调用js,js调用android

    Java调用JavaScript   1.main.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <?xml v ...

  8. 安装RPM包或者源码包

    RPM工具 RPM他是以一种数据库记录的方式将我们所需要的套件安装到linux主机的一套管理程序关于RPM各个选项的含义如下-i:表示安装-v:表示可视化-h:表示安装进度在安装RPM包时,常用的附带 ...

  9. python网络编程TCP服务多客户端的服务端开发

    #服务多客户端TCP服务端开发 2 #方法说明 3 """ 4 bind(host,port)表示绑定端口号,host是ip地址,ip地址一般不进 行绑定,表示本机的任何 ...

  10. 安装anaconda和第三方库tushare

    安装anaconda和第三方库tushare 血泪教训 下载32位的anaconda(同你Python版本,不然会碰到第三方库无法import的问题) 安装anaconda 安装到C盘会比较快,安装到 ...