freeswitch的不同版本使用redis的区别,1.4版本只有mod_redis模块,只能对呼叫做limit的限制功能,1.6以上版本增加了mod_hiredis模块对redis进行操作,此方案中可以直接在拨号计划使用mod_hiredis,(用法如下:)。但是这个模块在freeswitch 1.6版本中mod_hiredis不支持password参数,即mod_hiredis只能连接没有密码的redis,1.6以上版本可以使用该模块来调用redis。
相对于简单的业务模型,memcache是不错的选择,需要注意的是它不是持久存储。
下面将两种不同的key value的使用介绍如下:
安装lua5.2, luarocks
freeswitch1.4 默认集成的lua的版本5.2。不要使用yum安装,因为yum intall luarocks 这个默认安装出来的lua版本是5.1。所以我们源码安装lua5.2, luarocks。为了保证安装正确,我们最好在进行如下操作前,将系统自带的lua和luarocks删除。
下载安装包:wget http://www.lua.org/ftp/lua-5.2.4.tar.gz
进入解压目录 ,执行如下命令:
make linux //设置安装平台
make install //执行安装
下载安装包:wget http://luarocks.github.io/luarocks/releases/luarocks-2.4.4.tar.gz
进入解压目录 ,执行如下命令:
./configure
make bootstrap
执行命令luarocks,如果提示”Lua version: 5.2”,则表示安装成功。如果这里提示是lua5.1,可以先卸载lua5.1,再安装lua5.2,重新执行以上安装步骤
yum -y install redis
配置autoload_configs/lua.conf.xm,配置so和lua文件的目录(这里路径是luarocks控件的.lua和.so的保存位置)。
<param name="module-directory" value="/usr/local/lib/lua/5.2/?.so"/>
<param name="script-directory" value="/usr/local/share/lua/5.2/?.lua"/>
redis-lua插件封装了对redis操作,redis-lua用法详细见官网
luarocks install redis-lua
在fs_cli执行如下两条命令,刷新新的配置(如果在测试过程出现执行如下命令时,不能刷新配置,请重启freeswitch):
reloadxml
reload mod_lua
test-pwd.lua
此脚本功能访问redis,并获取一个值,并打印
local redis = require("redis")
local client, err = redis.connect('127.0.0.1',6379)
freeswitch.consoleLog("ERR", "-- redis connected")
local r = client:set("test",1234)
freeswitch.consoleLog("ERR", tostring(r))
local value = client:get("test")
freeswitch.consoleLog("ERR", value)
在fs_cli执行lua脚本,执行成功
freeswitch@internal> lua test-lua.lua
-ERR no reply
2022-04-18 17:15:26.560699 [ERR] switch_cpp.cpp:1358 -- redis connected
2022-04-18 17:15:26.560699 [ERR] switch_cpp.cpp:1358 true
2022-04-18 17:15:26.560699 [ERR] switch_cpp.cpp:1358 1234
yum search memcached
yum -y install memcached memcached-devel
#安装完成后执行:
memcached -h
systemctl restart memcached
systemctl enable memcached
查看配置文件:
cat /etc/sysconfig/memcached
# 内容:
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS=""
https://freeswitch.org/confluence/display/FREESWITCH/mod_memcache
# 打开freeswitch默认加载mod_memcache模块
<load module="mod_memcache"/>
# cli下手动加载
load mod_memcache
# +OK Reloading XML
查看freeswitch连接memcache状态:
freeswitch@internal> memcache status verbose
Lib version: 1.0.16
Servers: 1
localhost (11211)
pid: 5967
uptime: 639
time: 1650341171
version: 1.4.15
libevent: 2.0.21-stable
pointer_size: 64
rusage_user: 0.008816
rusage_system: 0.009919
curr_connections: 10
total_connections: 11
connection_structures: 11
reserved_fds: 20
....
在拨号方案应用:
<action application="set" data="foo=${memcache(get key)}"/>
<action application="set" data="ignore=${memcache(set key value)}"/>
<action application="set" data="ignore=${memcache(set key ${channel_var})}"/>
在控制台上操作memcache:
freeswitch@internal> memcache set 123456 1 expiration 60
+OK
freeswitch@internal> memcache get 123456
1
以下是控制台可操作命令等同于api的调用:
memcache <set|replace|add> <key> <value> [expiration [flags]]
# expiration is in seconds
# flags is a 64bit (preferably hex) value
memcache <get|getflags> <key>
# gets values or flags
memcache <delete> <key>
memcache <increment|decrement> <key> [offset [expires [flags]]]
# offset = how much to increase/decrease by
# expires = expiration in seconds -- subsequent inc/dec operations DO NOT extend lifetime of object
# flags = 64bit (preferably hex) value
memcache <flush>
# remove all keys (careful if this is a shared memcache server)
memcache <status> [verbose]
# retrieve server information
dialplang例子:
同一个号码每天只能呼叫1次
<include>
<context name="call_out">
<extension name="debug" continue="true">
<condition field="${destination_number}" expression="^.*?([0-9]{0,11})$"> <!-- 获取11位手机号 -->
<action application="set" data="foo=${memcache(get ${destination_number})}"/>
<condition field="${foo}" expression="^1">
<action application="hangup" data="USER_BUSY"/>
</condition>
<action application="set" data="ignore=${memcache(set ${destination_number} 1 expiration 1)}"/>
<action application="bridge" data="sofia/gateway/out/${destination_number}"/>
</condition>
</extension>
</context>
</include>