Memcache使用K-V的形式存储数据,内存中采用HashTable的设计。通过空间换取时间的方式,让数据查询复杂度降到O(1),保证了高效的数据访问。当内存资源消耗
Memcache使用K-V的形式存储数据,内存中采用HashTable的设计。通过空间换取时间的方式,让数据查询复杂度降到O(1),保证了高效的数据访问。当内存资源消耗殆尽的时候,Memcache会采用LRU算法,将最近不常用的数据覆盖掉。
在建立云客服系统中,我们发现分布式数据库、分布式缓存都会存在数据不一致的问题。由于系统采取多冗余原则,冗余的数据在各台服务器的中可能会不一致。
2.5 分布式Session
图2.3分布式缓存实现原理图
如图2.3所示,相对于传统的tomcat等应用服务器,它们所实现的session的管理大多都是单机模式的。但是对于多台服务器来支撑业务,请求会在不同的服务器之间跳转,session也变得难以管理和获取。对于用户的同一次请求,虽然在服务器之间做了多次转发或者重定向。但是它属于同一个请求,因此浏览器的同一次会话返回的jsession_id也应该是唯一的。云客服系统在Session设计上采取了分布式Session。前端用户在发送request请求后,反向代理服务器会随机分发请求,随机命中后端服务器,获取到benzhr_session_id,然后保存在redis中,并记录key的失效时间,然后将benzhr_session_id同步到所有的服务器。在服务器每次发送response的时候,在redis中去获取这个benzhr_session_id,并且返回给前端用户。集中化管理缓存可以防止数据不一致以及数据延迟等问题。
2.6 持久化存储
持久化存储是所有应用必须的操作。持久化可能是将文件以结构化形式保存在文件中,或者非结构化形式。或则以二进制形4式保存在磁盘上。持久化操作能够避免内存中的数据丢失。在Web应用中,持久化重要的手段就是保存在数据库中。对于本次云客服系统,因为数据的多样性,查询数据形式的多样性,选取多种数据库作为持久化工具。对于传统的IOE解决方案,系统开发和扩展的成本都相对较高。在互联网发展的道路上,不得不思考一些新的解决方案来优化持久化。在开源社区,廉价的PC服务分布式架构可以既节约成本又能给系统带来较高的扩展能力。关系型数据库MySQL是将数据以B+树的形式存储在DBMS中。可以很轻松的通过SQL语句去增删改查持久化的数据,也能够保存实体与实体之间的关系。在云客服系统中,同时也采用了一些非关系型的数据库,比如Mongodb、Elasticsearch,来支持各种方面的应用。Mongodb以文档形式保存API文档,Elasticsearch以文档形式可以进行全文索引。通过关系型数据库和NoSQL的结合使用,使得客服系统能够快速提供更多服务。
2.7 垂直化搜索引擎
搜索引擎是许多大型网站必备的功能,也是一个非常重要的角色。搜索引擎需要结合数据仓库来提供服务。如果只针对数据库做搜索引擎,使得搜索功能效率不高。需要思考一个更高效的方案来解决云客服中搜索引擎的高效使用问题。首先第一个想到的是Elasticsearch提供的快速索引服务。快速索引是基于ApacheLucene底层实现的。将所要存储的文档分片,分索引,分类型,保证层级的结构清晰。那么就可以将整个系统的资源可以存储快速索引,还可以采取倒排索引来快速建立词与文档之间的关系。常用的索引可以存储在内存当中,在搜索的时候尽可能快速查询到就近的索引。这样建立的垂直化搜索引擎高效、易用。来说说搜索引擎最常用的几个概念:分词、停词、排序。分词在搜索引擎和自然语言处理都是最基本的行为。对分词器的选择可以直接决定提供搜索服务的质量。停词类似于啊、我、你、嗯、什么、怎么、为什么这一类的词,在文档中出现的过多,但是在搜索中却没有一点帮助,不能快速帮助系统搜索到需要的文档。因此需要考虑建立一个停词库,在做分词的时候能够去掉停词。这样使得搜索更加高效、准确。