Redis在外勤通系统高速缓存中的应用研究

2014-07-02 18:04李彬朱亚兴
无线互联科技 2014年1期

李彬 朱亚兴

摘 要:本文基于Redis的高速緩存机制在外勤通系统中的应用进行了研究,详细说明了Redis这个高速缓存数据库的支持持久化,丰富的数据结构,主从复制以及Virtual Memory功能等特性。

关键词:Redis;Memcached;高速缓存

1 引言

在低碳经济的时代背景下,全球各大行业都在寻求节能、环保、高效的管理模式。这既是保证企业正常生产经营,实现公司健康可持续发展的长久之计,也是企业适应市场需要,降低成本,增加效益,改善环境,提高企业竞争力的必要选择。我们开发的外勤通系统就是遵循绿色办公的宗旨,为所有具有外巡,外服的户外工作业务的中小企业降低成本,企业初期零投入,不需服务器、系统研发等软硬件投入;将定位技术与智能手机客户端相结合,利用运营商的GSM/WCDMA等无线网络,为企业提供对外勤人员实时、精准的管理手段。企业能随时掌握在外工作人员的具体位置和行走轨迹,同时实现考勤签到、快速审批、位置标注、语音群聊,数据上报,区域预警,更好地进行地理化分析、业绩审视,改变传统的办公模式,实现无纸化和移动化办公,快速响应客户需求和有效管理员工,管理更加方便和人性化,深度巩固企业在市场中主体地位和增强企业核心竞争力。

外勤通系统在给所有客户带来方便的同时,也需要面对网站访问量渐增大、内容不断丰富和用户期望值不断提高,用户应用需要提供更快的访问速度和承受更大的负荷量,所有这些都依赖于网站服务器的基础设施,扩展服务器或者镜像服务器是一个基本的解决方案,但扩展服务器会增加大量的运行维护工作,同时增加了运营成本,为了解决这个问题高速缓存服务器Cache不失为一个较好的解决方案,本文主要介绍开源内存数据库Redis在高速缓存方面的的特性及其应用。

2 Redis

2.1 Redis简介

Redis是一个基于内存的高性能key/value数据库[1],全名为远程字典服务(Remote Dictionary Server),与Memcached一样,为了保证效率,数据都是缓存在内存中,也可以这样说Redis就是用空间来换取时间,从而达到提高响应速度的目的。Memcached是一个免费开源的、高性能的、具有分布式内存对象的缓存系统,它通过减轻数据库负载加速动态Web应用。目前全球很多用户都在使用它来构建自己的大负载网站或提高访问量超大网站的响应速度[1]。相对于Redis来说,Memcached具有协议简单,便捷的libenent事件处理,内存管理方式的高效性,以及互不通信的分布式等特性。

Redis与Memcached的最大区别是Redis会周期性把更新的数据备份到磁盘上或者把修改操作写入记录文件,并在此基础上实现了主从同步。Redis很大程度补偿了Memcached键值存储的不足,在部分场合对关系数据库起到很好的补充作用。Redis提供了更丰富的数据类型,如字符串(String),链表(List)、集合(Set)、有序集合(Zset)、哈希(Hash)等。

2.2 Redis的特性

Redis和Memached都是C/S结构的远程Cache实现,它们都可以作为缓存,但是Redis又有自己独特的地方。这里重点讲解Redis区别于Memcached的特征。

2.2.1 支持持久化

Redis和Memeache一样都是把数据全部存在内存中,但是Redis会根据数据的更新量和更新间隔时间定期进行异步更新,将数据保存在磁盘上,实现数据的持久化操作。另外也可以通过配置redis.conf文档配置持久化操作的时间间隔和临界数据量,这样Redis就自动在一定的时间间隔和数据超过临界值时进行持久化操作。如果在Redis 宕机或者突然断电的情况下,保存在Redis中的数据还是会丢失,所以Redis还提供了一种附加档案功能AOF[2]。

通过把redis.cong中的appendonly属性设置为“yes”来使用AOF功能,配置好AOF之后Redis每次接受到持久化命令时,就会将命令添加在配置文档中,重新启动Redis时,配置文档中的指令会重新执行,从而达到恢复Redis数据库的状态。

2.2.2 丰富的数据结构

Redis的数据结构非常丰富,Redis支持简单的key/value类型数据,其中Key是String类型,而value除了常规的String之外,还包括list,set,zset,hash等。这些新的属性都是在Redis2.0中才有。Redis对所有的数据类型都提供 push/pop、add/remove、执行服务端的并集、交集等功能,这些操作都是具有原子性的,它还支持各种不同的排序能力[1]。

2.2.3 支持主从复制

Redis的主从复制可以通过配置redis.conf文件中的Replication字段来实现,Redis的主从复制具有如下特点:

(1)支持多级主从(master/slave),即一个主服务器可以连接多个从服务器

(2)从服务器可以再连接其他的从服务器

(3)主服务器和从服务器同步的数据复制是非阻塞的

其中利用Redis的主从复制特性,可以实现以下功能:

(1)实现读写分离,如用主服务实现读操作,从服务实现写操作。

(2)备份数据,利用主从服务器的方便性来备份,专门做台从服务器用于备份功能。

2.2.4 Virtual Memory功能

由于Redis受到了物理内存的限制,数据库的容量有限,对于海量数据的高性能读写并不适合。Virtual Memory的功能就是为了解决这个问题而生,Virtual Memory功能也是Redis 2.0新增的功能,目的就是为了提高Redis对海量数据的高性能读写能力,它把很少使用的value保存再磁盘中,而只把key存在内存中,从而达到提高系统性能的目的。

3 Redis的应用

随着外勤通系统客户量不断增加,每天客户上传和请求的数据量也是呈几百,几千倍的增加,面对不断增加的庞大信息量数据库的负担越来越重,单纯的靠增加服务器的数量所产生的运营和维护费用又特别大,而在速度就是市场的互联网时代,快速相应是一个不变的需求。Redis由于其丰富数据结构,良好的性能,优良的数据持久化能力占领了越来越大市场。我们的外勤通系统也引入了对Redis的应用。

Redis在外勤通系统中的应用主要表现在一下几个方面:

⑴在应用集群中,作为中央会话,保存web中会话,保存终端鉴权后的token,通过鉴权之后不同的用户登录就展示不同的功能模块。

save(String key, String value, Integer seconds){

Jedis jedis = null;

try {

jedis=(Jedis) pool.getResource();

jedis.set(key, value);

jedis.expire(key, seconds);

} catch (Exception e) {

e.printStackTrace();

}finally{

pool.returnResource(jedis);

}

}

⑵在通信中,作為发布订阅队列使用,web 发布消息,进入Redis 发布订阅频道,通信中心消费此频道消息,所有的信息发布都在Redis中进行,从而提高了响应的速度。

public boolean sendMsg(String msg){

boolean rebool = true;

Jedis jedis = null;

try {

jedis=(Jedis) pool.getResource();

jedis.publish("kingfisher.*", msg);

} catch (Exception e) {

e.printStackTrace();

rebool = false;

}finally{

pool.returnResource(jedis);

}

return rebool;

}

⑶在重发消息以及离线消息的集合索引和队列,保证在终端关机或者不在服务区范围内没有接受到的信息有一个重发机制,Redis中会保存近100小时之内的用户信息,从而实现快速转发,超过100小时会自动清空Redis。

def sended(mobile,msgstr,msg):

row = MysqlDao().findClient(mobile)

if row is not None:

pool = MyRedis.getPool()

r = redis.Redis(connection_pool=pool)

r.sadd('sended_%s' % mobile,msg.bid)

r.set('s_msg_%s' % msg.bid,msgstr)

r.expire('s_msg_%s' % msg.bid,36000) #超过100小时不再为客户端保留信息

⑷应用MONGODB附近位置的检索

⑸应用mongodb gridFS=对文件中转(PC ANDROID IOS)

⑹应用mongodb mapreduce并行计算,用户从redis中调度生成当天用户访问行为,调度生成当天服务运行行为以及调度生成当天小时行为。

4 展望

外勤通系统由于其通用,高效,低碳等特点自推出以来就备受关注,现在外勤通的客户群已经达到了2000多人,随着客户的不断增加,服务器的压力也越来越大,引入了Redis之后系统的响应速度大大提高。但是随着外勤通系统版本的不断升级,客户群的持续增加数据库的压力还是一个潜在的问题,为了更好的满足客户的需求,对服务器的优化将是一个长期的工作。

[参考文献]

[1]王心妍.emcached和Redis在高速缓存方面的应用[J].无线互联科技,2012(9).

[2]杨艳,李炜,王纯.内存数据库在高速缓存方面的应用[J].现代电信科技,2011(12).