shmget(key, size, flags):創建/獲取共享內存段,返回標識符 shmid。shmat(shmid, NULL, 0):將共享內存映射到進程地址空間,返回指針。shmdt(ptr):解除映射。shmctl(shmid, IPC_RMID, NULL):刪除共享內存段(引用計數歸零後真正釋放)。#define SHM_KEY 0x12321
int shmid = shmget(SHM_KEY, BUFSIZ+1, 0764 | IPC_CREAT);
char *shm = shmat(shmid, NULL, 0);
// 寫入數據...
shmdt(shm);
// shmctl(shmid, IPC_RMID, NULL); // 可選:讀端負責刪除
system("ipcs -m"); // 查看狀態
int shmid = shmget(SHM_KEY, BUFSIZ+1, IPC_CREAT);
char *shm = shmat(shmid, NULL, 0);
puts(shm);
shmdt(shm);
shmctl(shmid, IPC_RMID); // 讀完刪除
system("ipcs -m");
sudo apt-get install memcached ps -ef | grep memcached # 確認服務運行
telnet localhost 11211 set id 0 0 5 nihao STORED get id VALUE id 0 5 nihao END
set key flags exptime bytes:存儲。flags 自定義,exptime 過期秒數(0=永不過期),bytes 值長度。get key:獲取。add:僅 key 不存在時存儲(原子性)。#includememcached_st *memc = memcached_create(NULL); memcached_server_st *servers = memcached_server_list_append(NULL, "127.0.0.1", 11211, &rc); memcached_server_push(memc, servers); memcached_server_list_free(servers); // 存儲 memcached_set(memc, "hello", 5, "world", 5, 0, 0); // 獲取 size_t vlen; uint32_t flags; memcached_return rc; char *val = memcached_get(memc, "hello", 5, &vlen, &flags, &rc); // 刪除 memcached_delete(memc, "hello", 5, 0); memcached_free(memc);
gcc -o demo demo.c -lmemcached # 需配置 LD_LIBRARY_PATH 包含 /usr/local/lib
利用 add 原子性:只有 key 不存在時才存儲成功。設置過期時間 expir,自動釋放鎖,避免死鎖。
#include#include int main() { memcached_st *memc = memcached_create(NULL); memcached_server_st *servers = memcached_server_list_append(NULL, "127.0.0.1", 11211, &rc); memcached_server_push(memc, servers); memcached_server_list_free(servers); const char *lock_key = "__mem_key_lock"; time_t expir = 10; // 10 秒自動過期 // 嘗試獲取鎖 memcached_return rc = memcached_add(memc, lock_key, strlen(lock_key), "0", 1, expir, 0); if (rc != MEMCACHED_SUCCESS) { fprintf(stderr, "Lock contention: %s\n", memcached_strerror(memc, rc)); memcached_free(memc); return 1; } printf("Lock acquired, holding for %ld seconds...\n", expir); sleep(expir); // 模擬業務處理 memcached_free(memc); return 0; }
Lock acquired...,休眠 10s。Lock contention: MEMCACHED_NOTSTORED,獲取失敗。| 特性 | System V 共享內存 | Memcached |
|---|---|---|
| 部署範圍 | 單機 | 分布式集群 |
| 數據持久性 | 內存級,掉電丟失 | 內存級,可配置持久化 |
| 並發控制 | 需自行加鎖 | 原子操作 |
| 語言中立 | C/C++ 為主 | 多語言客戶端 |
| 適用場景 | 高性能本地 IPC | 分布式緩存、會話、鎖、限流 |
ftok 生成 key 避免衝突;shmctl(IPC_RMID) 及時清理;注意結構體對齊導致的大小差異。libmemcached 版本兼容性;設置 LD_LIBRARY_PATH;key 設計加項目前綴防衝突;大值對象序列化開銷;監控 evictions 指標防內存淘汰。從單機共享內存到分布式 Memcached,體現了「本地高性能」到「分布式擴展」的架構演進。根據業務規模、一致性要求、運維能力選擇合適方案:**單機高頻 IPC 用共享內存,分布式緩存/鎖/會話用 Memcached/Redis**。