Java堆外缓存OHC在马蜂窝推荐引擎的应用

在推荐系统中,通常由推荐引擎提供线上推荐服务。推荐引擎的工作流程主要包括召回、排序等阶段,每个阶段都需要大量的数据支撑,快速读取这些数据对提升推荐引擎的性能起着重要的作用。

缓存在企业级Web系统中使用非常广泛,举例来说,业务程序和数据库通常运行在不同的物理服务器上,并通过网络访问数据库。网络传输的耗时,自然会增加系统的响应时间。为了降低响应时间,业务程序可以将从数据库中读取到的部分数据,缓存在本地服务器以供后续使用。

缓存框架OHC基于Java语言实现,并以类库的形式供其他Java程序调用,是一种以单机模式运行的堆外缓存。在马蜂窝推荐引擎中,使用了OHC作为主要的本地缓存工具,节省了获取召回、排序数据的时间成本,从而提升了系统性能。本文将从OHC的基本技术引入马蜂窝推荐引擎中的实践。

Part.1 OHC简介

缓存的分类与实现机制多种多样,包括单机缓存与分布式缓存等等。具体到JVM应用,又可以分为堆内缓存和堆外缓存。OHC全称为off-heap-cache,即堆外缓存,是一款基于Java的key-value堆外缓存框架。OHC是2015年针对Apache Cassandra开发的缓存框架,后来从Cassandra项目中独立出来,成为单独的类库,其项目地址为 https://github.com/snazy/ohc

1.堆内与堆外

Java程序运行时,由Java虚拟机(JVM)管理的内存区域称为堆(heap)。垃圾收集器会扫描堆内空间,识别应用程序已经不再使用的对象,并释放其空间,这个过程称为GC。堆内缓存,顾名思义,是指将数据缓存在堆内的机制,比如HashMap就可以用作简单的堆内缓存。由于垃圾收集器需要扫描堆,并且在扫描时需要暂停应用线程(stop-the-world,STW),因此,缓存数据过多会导致GC开销增大,从而影响应用程序性能。

与堆内空间不同,堆外空间不影响GC,由应用程序自身负责分配与释放内存。因此,当缓存数据量较大(达到G以上级别)时,可以使用堆外缓存来提升性能。

2.OHC的特性

相对于持久化数据库,可用的内存空间更少、速度也更快,因此通常将访问频繁的数据放入堆外内存进行缓存,并保证缓存的时效性。OHC主要具有以下特性来满足需求:
1、数据存储在堆外,不影响GC
2、支持为每个缓存项设置过期时间
3、支持配置LRU、W-TinyLFU逐出策略
4、能够维护大量的缓存条目(百万量级以上)
5、支持异步加载缓存
6、读写速度在微秒级别
如上文所说,推荐引擎需要大量数据支撑,并且要求在短时间内完成处理。OHC具有低延迟、容量大、不影响GC的特性,并且支持使用方根据自身业务需求进行灵活配置,因此我们选用OHC作为推荐引擎的主要缓存框架。

3.使用示例

在Java项目中使用OHC,主要包括以下步骤:

1、在项目中引入OHC。如果使用Maven来管理依赖,可以将OHC的坐标添加到到项目的POM文件中。

2、OHC是将Java对象序列化后存储在堆外,因此用户需要实现org.caffinitas.ohc.CacheSerializer类,OHC会运用其实现类来序列化和反序列化对象。

3、将CacheSerializer的实现类作为参数,传递给OHCache的构造函数来创建OHCache。

4、使用OHCache的相关方法(get、put)来读写缓存。

为了便于读者快速了解OHC,我们在GitHub上提

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值