一、项目背景:
A地和B地各有一台服务器,B地有几万条数据要定时传过来,通过对象集合序列化和反序列化到A地的数据库太慢了,就引入了redis。因为B地的服务器IP不固定,所以也不适合使用api。流程如下:
二、Redis
1、安装
操作系统:centos 7,文件传输用Xshell 6这里不做赘述
1、下载安装包:
wgethttp://download.redis.io/releases/redis-4.0.6.tar.gz
如果提示wget command not found那么执行命令:yum -y install wget
2、解压:
tar -zxvf redis-4.0.6.tar.gz
(因为没注意到路径,文件放在了/root目录下,之后没有做修改)
3、yum安装gcc依赖
Yum install gcc
4、跳转到redis解压目录下
cd ./redis-4.0.6
5、编译安装
make MALLOC=libc
转到解压目录的src文件夹下并执行安装
cd ./src && make install
执行安装之后,会在/usr/local/bin目录下生成以下文件:
6、测试是否安装成功
在src目录下执行./redis-server
redis安装成功。但是这种启动方式需要一直打开窗口,我们把redis配置为后台启动。按ctrl+c关闭窗口。
redis.conf中
daemonize设置yes或者no区别
daemonize:yes:redis采用的是单进程多线程的模式。当redis.conf中选项daemonize设置成yes时,代表开启守护进程模式。在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项pidfile设置的文件中,此时redis将一直运行,除非手动kill该进程。
daemonize:no:当daemonize选项设置成no时,当前界面将进入redis的命令行界面,exit强制退出或者关闭连接工具(putty,xshell等)都会导致redis进程退出。
-------------------------------------------------------------------------------
7、修改redis.conf文件
在/root/redis-4.0.6目录下找到redis.conf
将daemonize no修改为daemonize yes
8、指定redis.conf文件启动
./redis-server /root/redis-4.0.6/redis.conf
9、查看redis进程
ps -aux|grep redis
杀死进程
Kill -9 2400
10、设置开机启动
1)在/etc目录下新建redis目录
将/root/redis-4.0.6/redis.conf复制一份到/etc/redis目录下,并且将文件命名为6379.conf
2)将redis的启动脚本复制一份放到/etc/init.d目录下
cp /root/redis-4.0.6/utils/redis_init_script /etc/init.d/redisd
3)切换到/etc/init.d目录下
在redisd文件中添加如下两行
# chkconfig: 2345 90 10
# description: Redis is a persistent key-value database
执行命令:chkconfig redisd on
4)启动
service redisd start
出现这种问题的话执行如下操作:
redis-server /etc/redis/6379.conf
在/var/run下面会生成如下文件
5)关闭
service redisd stop
现在可以开机启动了
2、Redis开启远程访问
防火墙开放6379端口
firewall-cmd --zone=public --add-port=6379/tcp --permanent
修改/etc/redis/6379.conf
找到bind 127.0.0.1并注释掉
将protected-mode yes改成protected-mode no
重启后,用redis desktop manager测试一下
3、卸载Redis
1、停止Redis服务
查看redis服务是否正在运行:
Ps aux|grep redis
停止服务:
redis-cli shutdown
2、删除/usr/local/bin下面的几个redis-.....文件,这是在make的时候生成的文件。
3、删除解压后的文件目录和所有文件。
三、发送数据到redis
我们使用VS 2017编辑器,.net core 2.0以上的版本,这里因为需求顺便把调度程序也一并写下,关于调度的具体介绍,可以参考https://www.cnblogs.com/miskis/p/8487634.html。
新建一个控制台程序
NuGet添加Quartz中间件
添加ServiceStack.Redis中间件
测试数据表如下:
为了以后数据库迁移方便,数据库名、表名、字段名建议使用小写
往里边插个15万条数据
declare @num int
set @num = 150000
while @num>0
begin
insert into person values('name',@num)
set @num = @num-1
End
应用程序文件结构如下
其中Config.xml文件如下:
SqlHelper读取配置文件如下:
为方便演示,直接在program.cs上定义了一个工作类,要实现IJob接口。
在Program.cs中定义了一个调度工作的方法
privatestaticasyncTask RunProgram()
{
try
{
vardirectory = System.IO.Directory.GetCurrentDirectory();
XDocument configXml = XDocument.Load(directory +"/Config.xml");
varsec = configXml.Descendants("intervalseconds")
.Select(p => p.Attribute("val").Value)
.FirstOrDefault();
stringsecStr = Convert.ToString(sec);
intsecInt = Convert.ToInt32(secStr);
NameValueCollection props =newNameValueCollection
{
};
StdSchedulerFactory factory =newStdSchedulerFactory(props);
IScheduler scheduler =awaitfactory.GetScheduler();
// 启动任务调度器
awaitscheduler.Start();
// 定义一个 Job
IJobDetail job = JobBuilder.Create()
.WithIdentity("job1","group1")
.Build();
ISimpleTrigger trigger = (ISimpleTrigger)TriggerBuilder.Create()
.WithIdentity("trigger1")// 给任务一个名字
.StartAt(DateTime.Now)// 设置任务开始时间
.ForJob("job1","group1")//给任务指定一个分组
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(secInt)// .WithIntervalInHours //.WithIntervalInMinutes
.RepeatForever())
.Build();
// 等待执行任务
awaitscheduler.ScheduleJob(job, trigger);
}
catch(SchedulerException se)
{
awaitConsole.Error.WriteLineAsync(se.ToString());
}
}
最后执行的Main函数如下:
发布成文件:
直接发布会发现自己写的配置文件Config.xml没有发布出来
右键Config.xml,点击属性
在“复制到输出目录”一栏选择“始终复制”
点击确定,再发布就ok了。
然后用cmd测试一下
程序运行ok~
按ctrl+c可退出
之后这程序可以放到Linux上用supervisor进行托管,这样就不用一直开着窗口了。
四、从Redis读取数据
程序中同样要引入中间件ServiceStack.Redis
示例代码:
varredisManger =newRedisManagerPool("127.0.0.1:6379");
varclient = redisManger.GetClient();
List
getList = client.Get
>("personList");//personList是redis存放时的键
示例代码:
链接:https://pan.baidu.com/s/1xIs5Ebm1rWBQzq_2KR6lBw 密码:4zft
领取专属 10元无门槛券
私享最新 技术干货