当前位置: 首页 > 工具软件 > Mod_redis > 使用案例 >

freeswitch 使用redis的方法及操作memcache

朱越
2023-12-01

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的使用介绍如下:

一、freeswitch在拨号计划中通过lua实现对redis进行操作

安装lua5.2, luarocks
freeswitch1.4 默认集成的lua的版本5.2。不要使用yum安装,因为yum intall luarocks 这个默认安装出来的lua版本是5.1。所以我们源码安装lua5.2, luarocks。为了保证安装正确,我们最好在进行如下操作前,将系统自带的lua和luarocks删除。

安装lua5.2

下载安装包:wget http://www.lua.org/ftp/lua-5.2.4.tar.gz
进入解压目录 ,执行如下命令:

make linux 		//设置安装平台
make install 	//执行安装
安装luarocks

下载安装包: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,重新执行以上安装步骤

安装redis
yum -y install redis
配置freeswitch的lua

配置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-lua插件封装了对redis操作,redis-lua用法详细见官网

luarocks install redis-lua
刷新配置

在fs_cli执行如下两条命令,刷新新的配置(如果在测试过程出现执行如下命令时,不能刷新配置,请重启freeswitch):

reloadxml 
reload mod_lua
写个lua测试脚本,配置到freewitch的拨号计划

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

二、在freeswitch安装使用memcache

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=""
freeswitch下调用memcache的模块为mod_memcache

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>
 类似资料: