当前位置: 首页 > 软件库 > 程序开发 > 缓存系统 >

libshmcache

本地缓存库
授权协议 BSD
开发语言 C/C++
所属分类 程序开发、 缓存系统
软件类型 开源软件
地区 国产
投 递 者 茅曾琪
操作系统 Linux
开源组织
适用人群 未知
 软件概览

libshmcache是基于共享内存的本地缓存库,可以在多个非亲缘关系的进程间共享缓存。libshmcache写有锁,读无锁,性能非常高。libshmcache直接访问本地共享内存,速度比远程接口如redis快100倍以上。

libshmcache包含C库和PHP扩展(支持PHP 5和PHP 7)。在众多开源缓存软件的今天,libshmcache作为后起之秀,凭借诸多特性,有望成为本地缓存开源软件的一颗明星。

1. 高性能特性
  1)写采用pthread互斥锁,读无锁;
  2)使用hash table进行快速set、get和delete;
  3)使用对象池(FIFO队列)对hash table键值对进行分配;
  4)value buffer分配使用striping(条带化)分配机制,在striping内按顺序分配buffer。当释放value buffer时,只需要减少striping已使用空间(used size)。释放value buffer后,若striping已使用空间变为0,回收整个striping;
   5)淘汰算法使用简单高效的FIFO而不是LRU。

2. 稳定性特性
   1)死锁检测和自动解锁机制。死锁发生场景:正在修改数据的进程挂掉,会导致死锁;
   2)初始化时检查一些关键字段的一致性,当内存相关的参数发生变化时,系统会自动提示共享内存需要清理和重新初始化;
   3)当回收了有效的(未过期)键值对时,休眠一定时长以避免其他进程读到脏数据。

3. 其他特性
   1)除了支持有亲缘关系的进程(如父进程和子进程),还支持无亲缘关系的进程(如PHP FPM进程和PHP CLI进程,多个PHP CLI进程等等);
   2)按需增量分配value buffer,有效减少初始内存大小,避免内存浪费(通过配置参数segment_size来设置);
   3)提供丰富的统计信息:get,set和delete次数统计、缓存命中率、内存回收统计、锁使用统计等;
   4)支持原子增加(减少);
   5)PHP扩展支持多种序列化方式:igbinary、msgpack、PHP序列化,以及无需序列化。因为键值对中存储了所用的序列化方式,这几种序列化方式可以并存;
  * 友情提示:key长度不能超过64字节。

libshmcache使用场景
    如果需要缓存的数据量不是太大,比如不超过100w个key,对缓存读写性能要求又比较高的情况下,可以考虑使用libshmcache。总结为一句话:追求极致性能,以空间换时间。

  • libshmcache是基于共享内存的本地缓存库。libshmcache写有锁,读无锁,性能非常高。libshmcache直接访问本地共享内存,速度比远程接口如redis快100倍以上。 libshmcache包含C库和PHP扩展(支持PHP 5和PHP 7)。在众多开源缓存软件的今天,libshmcache作为后起之秀,凭借诸多特性,有望成为本地缓存开源软件的一颗明星。 1. 高性能特性   1

 相关资料
  • Serenity 提供一些缓存抽象和实用功能让你更容易地使用本地缓存。 术语 本地(local) 的意思是指在本地内存中缓存项目(因此没有涉及到序列化)。 当你的应用程序在网站群(web farm) 中部署时,本地缓存可能还不够或者有时合适。我们将在 分布式缓存 章节中讨论该场景。

  • [命名空间: Serenity.Abstrations] - [程序集: Serenity.Core] 定义一个基本的本地缓存接口。 public interface ILocalCache { void Add(string key, object value, TimeSpan expiration); TItem Get<TItem>(string key); obj

  • 我已经将Hazelcast缓存配置为Spring Boot应用程序中的分布式缓存。 我想要为同一实例提供本地缓存,其中很少缓存不应共享。 如何在应用中一起做本地和分布式缓存?

  • [命名空间: Serenity] - [程序集: Serenity.Core] 一个包含快捷访问注册 ILocalCache 提供者的静态类。 public static class LocalCache { public static void Add(string key, object value, TimeSpan expiration); public static TI

  • 我们可以通过下面的简单算法实现该目的: 检查本地缓存的键(key); 如果本地缓存存在该键,则返回它的值; 如果本地缓存不存在该键,则尝试在分布式缓存中找; 如果分布式缓存存在该键,则返回它的值并把它添加到本地缓存; 如果分布式缓存不存在该键,则从数据库中获取,并添加到本地和分布式缓存,最后返回该值。 当在本地缓存服务器中缓存一些信息时,使用这种方式,它还将信息缓存到分布式缓存,但这一次,如果其他