memcached专题三、数据导入导出.md
概述
memcached数据默认是存放到内存里的,一旦服务重启,数据全部丢失。
尽管有memcachedb等数据持久化方案,但memcached使用依然非常广泛。
导出memcached数据
我们可以使用官方提供的memcached-tool来导出数据。命令如下
[root@QYER-1-17 wetry]#memcached-tool 10.1.1.17:11211 dump > 17mem.data.txt
[root@QYER-1-17 wetry]#head -4 17mem.data.txt
add qel_1364630 0 1482557057 3
abc
add Ks3_1300915 0 1482557057 12
123456789012
也可以使用memdump导出key,然后写程序去获取key的值。
[root@QYER-1-19 wetry]#memdump --servers=10.1.1.19:11211 > 19mem.data.txt
[root@QYER-1-19 wetry]#head -4 19mem.data.txt
flKs3_1289938
ss3_1375972
Ks3_1295452
qel_1359186
[root@QYER-1-17 wetry]#
上面的两个命令,在我的环境中,每次都只能导出21万左右的key(包括key的名字和Value,一共2M数据)。我的memcached版本为1.4.4。
所以每次只能导出一部分,删除一部分,然后继续导出、删除,如此往复。
我这里写了个脚本,来实现这个功能,如下
#!/bin/bash
MEMCACHED1="10.1.1.17:11211"
MEMCACHED2="10.1.1.17 11211"
###init functions
#get memcached stats
function memstat() {
memcached-tool $MEMCACHED1 > $1
}
#dump keys
function dumpkey() {
memcached-tool $MEMCACHED1 dump > $1.data.txt
}
#delete dumped keys
function delkey() {
for j in `cat $1.data.txt | grep -E "^add" |awk '{print $2}'`
do
echo "delete $j" | nc $MEMCACHED2 > /dev/null 2>&1
echo $j >> $1.delete.txt
done
}
##record begin status
memstat mem.stats.begin.txt
#process in loop
for i in `seq 1 2`
do
echo "serial is $i"
dumpkey $i
delkey $i
done
##record end status
memstat mem.stats.end.txt
导入数据到memcached
之前我们使用memcached-tool将数据导了出来,内容如下
add flKel_1295456 0 1482557057 3
abc
其中超时时间exptime字段被设置为1482557057,超出了30天最大值,因此是无效的,我们将其改为0,永不过期,实际导入时需要根据业务规则来定超时时间。
导入数据
sed -i 's/1482557057 /0 /g' 1.data.txt
cat 1.data.txt | nc 10.1.1.17 11211
参考资料
http://kikinote.net/article/194.html
http://www.cnblogs.com/shrewdlin/archive/2013/03/27/2985167.html
http://blog.sptty.com/2016/04/29/%E4%B8%8D%E8%83%BD%E8%8E%B7%E5%8F%96memcached%E6%89%80%E6%9C%89key%E7%9A%84%E9%97%AE%E9%A2%98%E5%A4%84%E7%90%86.html
转载请注明:IPCPU-网络之路 » memcached专题三、数据导入导出