有乙個需求,作為客戶端需要從redis集群中獲取資料。出於效能的考慮,再客戶端初始化階段,初始化了乙個redis連線,後續在連線redis時,可以直接使用該連線,不用再去重新連線redis了。(這裡指的連線其實就是初始化乙個類物件,然後根據ip+prot連線redis集群)
但是這樣的操作有乙個問題就是,當有多個客戶端連線redis集群時,由於連線數過多,達到redis節點連線數的限制(預設是4096個連線),這裡雖然可以修改redis節點連線數的限制,但是還是沒有從源頭解決問題,當併發達到一定程度,仍然可以達到連線的上限。
看到這裡想著是否可以使用連線池,但是我這種情況不適用。
在真正需要從redis中獲取資料時,建立連線->執行操作->釋放連線,這樣確實可以控制住連線數,但是對效能影響較大。
是否可以將redis連線(乙個類物件)放在共享記憶體中,多個程序共用乙個連線,這樣就可以將連線數控制住,而且對效能也沒有影響。
在網上找了linux中共享記憶體的例子,改寫了下
共享記憶體使用,參考:linux程序間通訊——使用共享記憶體
我想在共享記憶體中放一些基本型別和複雜的型別(string vector 只要有申請空間的操作就行),看下通過共享記憶體訪問這些複雜的變數是否可以行的通。
#ifndef _shmdata_h_header
#define _shmdata_h_header
#include
#define text_sz 2048
class
aconst
char
*printlog()
void setsss (
const
char
*s)int
getnum()
const
char
*getstr()
int num;
const
char
* str;
std::string str_string;};
struct shared_use_st ;
#endif
從共享記憶體中讀取a類中的變數,檢視多程序下是否是基本型別可以獲取,而複雜型別不能獲取
資料操作檔案 shmwrite.cpp
簡單描述下,該檔案中有
int initconnect()
int get()
pid_t fork_children(int num)
這幾個函式,其中initconnect用來初始化共享記憶體。get從共享記憶體中獲取資料。fork_children建立多個程序
程式是由主程序呼叫initconnect來初始化共享記憶體,然後建立3個子程序從共享記憶體中獲取資料(這裡沒有考慮同步的問題,先看是否可以正常訪問)。程式流程是這樣的,可以看下下文中的執行結果和程式中最長的那句注釋。
#include
#include
#include
#include
#include
#include
"shmdata.h"
#include
using
namespace std;
a *p=
null
;int
initconnect()
//將共享記憶體連線到當前程序的位址空間
shm =
shmat
(shmid,
(void*)
0,0)
;if(shm ==
(void*)
-1)printf
("memory attached at %x\n"
, shm)
;//設定共享記憶體
shared =
(struct shared_use_st*
)shm;
printf
("shared->written = %d\n"
,shared-
>written)
;//向共享記憶體中寫入資料
strncpy
(shared-
>text, buffer, text_sz)
; shared-
>written =1;
p =new(shared)a(
"cx");
printf
("if share memery is %s\n"
,shared-
>text)
; cout<<
"init success"
"p->num = "
<>num<<
" p->str = "
<>str
>str_string=
"changxin";}
return-1
;}intget()
//將共享記憶體連線到當前程序的位址空間
shm =
shmat
(shmid,
(void*)
0,0)
;if(shm ==
(void*)
-1)printf
("\n\nmemory attached at %x\n"
, shm)
;//設定共享記憶體
shared =
(struct shared_use_st*
)shm;
p =&(shared-
>a)
; cout<<
"get shared->text = "
<>text
("p = %x\n"
,p);
printf
("p_num = %d\n"
,p->
getnum()
);printf
("p_str= %s\n"
,p->
getstr()
);cout<<
"get p->num = "
<>num<<
" p->str = "
<>str
"get shared->writtten = "
<>written/主要是這一句,用來列印類中的string型別,這個最後只在主程序中列印出來,在子程序中是獲取不到這個變數的
//因為string的內部實現是自己建立的空間,而建立的這個空間只對當前程序有效,對其他程序不是不可用的。
cout<<
"get p->str_string = "
<>str_string
shmdt
(shm)==-
1)}//建立num個程序
pid_t fork_children
(int num)
return1;
}int
main()
//子程序操作
else
if(pid ==0)
return1;
}
編譯
g++ shmwrite.cpp -o shmwrite -lm
執行結果
C 函式中,兩個自動釋放記憶體的動態記憶體申請類
最近做乙個事情,實現乙個流程互動,其中主互動流程函式中,涉及較多的記憶體申請,而健康的函式,都是在函式退出前將手動申請不再需要的記憶體釋放掉,使用很多方法,都避免不了較多的出錯分支時,一堆的if free delete,長而且不好管理 因此,利用c 物件離開作用域會自動呼叫析構函式的特點,在這兒實現...
物件和類在jvm記憶體中的儲存機制
物件和類在jvm記憶體中的儲存機制 引言 為什麼要有物件導向?a.可以用類組織一批不同型別的資料 b.把現實世界的物和事轉換到計算中 現實世界的物件 計算機中的類 計算機記憶體中的物件 要實現物件導向的手段和途徑,關鍵是類 類 就是乙個名字 就是乙個模型 就是乙個資料結構 就是一種資料型別 用類可以...
C 中類和結構體在記憶體中的儲存問題
簡單點,非靜態成員變數占用空間,成員函式 無論是否是靜態的 則不占用空間 class myclass myclass類的例項中 占用2 4 8個位元組 即a b這兩個成員 涉及虛函式表那些你在另外研究。c 中struct和class在計算物件大小時你就不用區別了,計算方法一樣。就拿你的例子來說 一,...