1、在配置此示例前,用户实现保证数据库安装配置成功,加载了必须的Memcache 模块。Memcache 目前可以支持三中操作方式,包括
store - cache_store() // 保存数据
fetch - cache_fetch() // 获取数据
remove - cache_remove() // 删除数据
在此讲座中,我们仅使用了前面2种方式。
2、在进行测试之前,我们需要修改cfg 配置文件,几个需要注意的地方是:
## 加载缓存模块
loadmodule "cachedb_local.so"
##调用功能
modparam("auth","username_spec","$avp(userspec)")
modparam("auth","password_spec","$avp(passwd)")
modparam("auth","calculate_ha1",1)
modparam("auth_db", "load_credentials", "$avp(passwd)=password")
##保存缓存数据,注册密码
# 判断是否有已保存在缓存中的密码 ?
if(cache_fetch("local","passwd_$tu",$avp(passwd))) {
$avp(userspec) = $tU;
xlog("SCRIPT: stored password is $avp(passwd)\n"); // 打印日志
# $avp(userspec) 包含用户名
# $avp(passwd) 包含用户密码
if (!pv_www_authorize("")) {
# authentication failed -> do challenge
www_challenge("", "0");
exit;
};
} else {
# 通过数据库查询认证查询
# 此数据库获取密码
if (!www_authorize("", "subscriber")) {
# authentication failed -> do challenge
www_challenge("", "0");
exit;
};
# 数据库查询后,保存密码
xlog("SCRIPT: storing password <$avp(passwd)>\n");
# 设置密码生命周期为20 分钟;
cache_store("local","passwd_$tu","$avp(passwd)",1200);
}
3、配置成功以后,用户可以通过软电话来进行测试注册流程。测试方法如下:
首先注册软电话,打印mysql 日志,观察是否是通过数据库进行查询?使用命令:tail /var/log/mysql/mysql.log 和 ngrep –p –q –W byline port 5060
注册以后,互相呼叫,然后退出注册。
然后再重新注册,考察,SIP账号是否是通过内存查询来获得密码?
如果测试成功的话,可以看到第一次注册使用的是数据库查询方式,第二次是使用的内存查询方式。注意,这里没有对密码错误的操作。
4、在文章开始时,我们就简单说明了数据库查询和内存查询的一些区别。内存查询方式比数据库查询相对比较快,如果注册用户在1000人以上,或者更多的用户,我们就可以看到实际的测试效果。根据官方说明,通过数据库查询结合内存查询可以大幅降低查询次数(可以降低大约83%),从而增加了系统的稳定性,降低了系统的负载。
不使用 Memory Caching
1000 users, per day : 1000 * 3 * 24 = 72000 queries per day for auth
使用Memory Caching
1000 * 0.5 * 24 = 12000 queries per day for auth
需要读者注意的是对密码错误的管理,如果用户输入错误的密码,数据库需要重新更新,可能需要同时删除内存中密码数据,保证用户可以及时成功登录系统。
5、在本章节中,我们简单介绍了如何通过数据库结合内存查询方式来实现注册请求的流程。通过以上cfg配置,在大型系统的应用中,读者可以进一步优化数据库查询的负载,降低查询次数,从而来实现系统的稳定性。
参考资料:
http://www.opensips.org/Documentation/Tutorials-MemoryCaching
关注微信公众号:asterisk-cn,获得有价值的行业分享
freepbx 技术论坛:www.ippbx.org.cn
Asterisk, freepbx技术文档: www.freepbx.org.cn
融合通信商业解决方案,协同解决方案首选产品:www.hiastar.com