update_redis_from_2.2_to_2.8.15

项目在启用sidekiq的时候,提示由于redis版本太低而无法启用,需要将redis2.2升级到2.8,记录下升级过程。
卸载旧版redis

1
2
ps aux|grep redis #如果正在运行中,kill掉,然后执行
apt-get remove redis-server

下载官方redis,并编译安装

1
2
3
4
5
wget http://download.redis.io/redis-stable.tar.gz
tar xvzf redis-stable.tar.gz
cd redis-stable
make
sudo make install

把配置文件复制到/etc/redis 下,并修改配置

1
2
cp /redis-stable/redis.conf /etc/redis/redis.conf
vim redis.conf

修改的具体参数为

1
2
3
4
requirepass 123456 #设置密码
daemonize yes #设置为后台运行
maxmemory 2gb #设置最大占用内存
maxmemory-policy allkeys-lru #内存清除策略

配置完成后,启动redis即可

1
redis-server /etc/redis/redis.conf

查看redis版本

1
2
redis-cli --version
redis-cli 2.8.15

使用squid、nginx实现代理服务器内网转发

这周要上线一个项目,有台服务器是内网的所以弄起来比较复杂,搞了好几天才搞好,讲下需求以及解决方案。

客户的其它机器都是在内网环境下的,不可访问外网,a(58.212.225.181)为内网服务器,可通过网闸请求到一台外网服务器c(192.168.158.211),因为网站有很多的外链图片,以及接口请求,把所有的图片都抓回来当然也是可以的,但是我觉得用代理的方式解决更好一些,况且很多接口也是必须要请求外网的,这个时候就要想办法通过代理来出去了。

1
a(58.212.225.181) --> 通过网闸 192.168.1.100 访问--> c(192.168.158.211)的80 3128端口

首先,我们要解决图片的问题,我们项目会有很多诸如 http://img11.360buyimg.com/n1/g14/M04/0E/0F/rBEhVVInCfkIAAAAAADYUmG1fPoAAC07QGslDkAANhq075.jpg 此类的外链图片,因为客户本地的电脑是内网环境,不能直接访问外网,这个时候我们就要对所有的图片链接进行处理了,代码为:

1
product.image_url = product.image_url.gsub(/(http:.*\.jpg)/){|m| "/emall_image?url=#{$1}" }

在所有图片url之前加上/emall_image?url= 这样所有的图片请求就都会请求内网服务器a,这个时候看一下内网服务器a(58.212.225.181)的nginx配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
##为所有图片请求添加cache,加快响应速度##
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_temp_path /home/temp_dir;
proxy_cache_path /home/cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
##end##
resolver 8.8.8.8;
server {
listen 80;
server_name localhost 58.212.225.181;
location /emall_image {
proxy_pass http://192.168.1.100/emall_image?url=$arg_url; #如果没有缓存,获取到url,转发到外网服务器c
proxy_cache cache_one;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 301 1d;
proxy_cache_valid any 1m;
expires 30d;
}
}

sql datetime whether two date range overlap

碰到一个需求,一个时间段内只允许有一个计划,也就是说数据库中的时间区间不能有重复或交叉,记录下从复杂到简单的简化过程。

1.刚开始想的时候感觉这个有很多种情况,然后把每一次情况都用sql标识出来,写的语句如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#情况如下:
# a: |------|
# b: |------|
# a.start_time >= start_at and a.start_time <= end_at
# a: |------|
# b: |------|
# a.end_time >= start_at and a.end_time <= end_at
# a: |------|
# b: |----------|
# a.start_time >= start_at and a.end_time <= end_at
# a: |----------|
# b: |------|
# a.start_time <= start_at and a.end_time >= end_at
#代码如下:
plan = Plan.where('((start_time >= ? and start_time <= ?) or (end_time >= ? and end_time <= ?) or (start_time >= ? and end_time <= ?) or (start_time <= ? and end_time >= ?) )',start_at, end_at, start_at, end_at, start_at, end_at, start_at, end_at)