初探Redis

Author Avatar
GGB 8月 28, 2018

前言

redis是一种特殊类型的数据库,采用键值对形式存储数据,是一个不错的持久化缓存系统,之前写的一个SSM练习项目使用了mysql作为数据持久化方案,但是,对于一些重复的固定内容访问,每一次从查询指令到从数据库取值,这种不必要的步骤总显得有些碍眼,于是我选择使用redis作为中间的过渡方案。于是,便有了我redis的初体验之旅,之中踩坑无数,真是刚填平一个又踏入另一个。而且在网上查找了无数资源,翻阅了数不清的博客后,真的没有发现一篇全面的redis入门指南,于是便有了这篇文章的诞生,总结记录这一路的坑~

一.下载和安装

本来是在本地测试项目的,所以一开始打算就在自己电脑上装好redis进行试验,于是到了官网:
POp0gg.md.png
选择stable版本,download,下载好是个.tar.gz文件,之后在windows命令窗口搞鼓了一阵,发现别人的安装指令怎么输入都不起作用,仔细观察后,人家的指令运行的都是.exe文件,我在解压后的目录找到指令都是未知文件类型。。。 后来才发现,官网只提供linux版本的下载,,瞬间就觉得这官网不给版本选择真是巨坑。

于是,干脆直接装到服务器上,以后其他项目什么也可以用一下,直接把下载的压缩包拖到服务器。发现download页面有安装说明:
PO9CVI.md.png
基本照做便OK了,由于redis是用C语言编写的(安装需要gcc环境),所有整个过程看似十分简单。但是这里使用的是默认配置,到真正能正常使用,还有很多东西需要自己配置。

二.配置Redis

redis的基本配置都是放在根目录的redis.conf文件里面,通过src目录下的

1
# redis-server

只是按默认配置启动,在centos上这种启动是前台式的启动,即启动后你不能进行其他操作,这肯定是不行的,所以还得自己去手动配置,

1.修改后台启动模式

通过 vim redis-conf 进行配置文件的编辑,修改其中

1
2
3
4
# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.

daemonize no

daemonize 为yes,即让redis以后台进程模式启动

2.设置密码

redis默认是没有密码的,启动后可直接访问,所以需要进行密码设置找到

1
#requirepass foobared

将注释去掉,再把foobared改为自己的密码即可。

此时,在 redis目录下,在 /src 下执行

1
redis-server /redis.conf的路径

即可按redis.conf进行启动。
此时在 src目录下,以 redis-cli -a “password” 即可登录redis服务。

3.设置为开机启动

因为我发现redis的命令集中并没有方便的关闭和重启指令,于是,将其配置为后台服务。

1)在/etc目录下创建redis目录

1
[root@ggb etc]# mkdir redis

2)将原来的redis.conf拷贝到该目录下,并命名为6379.conf

1
[root@ggb etc]# cp /usr/local/redis-4.0.11/redis.conf /etc/redis/6379.conf

3)将redis的启动脚本复制一份到/etc/init.d目录下

1
[root@ggb etc]#cp /usr/local/redis-4.0.11/utils/redis_init_script /etc/init.d/redisd

4)设置开机自启,先切换到/etc/init.d目录下

1
[root@ggb init.d]# chkconfig redisd on

此时便完成了自启配置,同时也可以以服务的方式启动和关闭redis

1
2
3
4
5
[root@ggb src]# service redisd start
Starting Redis server...
24448:C 28 Aug 17:00:50.328 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
24448:C 28 Aug 17:00:50.328 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=24448, just started
24448:C 28 Aug 17:00:50.328 # Configuration loaded

然后关闭指令

1
2
3
4
5
6
7
8
9
[root@ggb src]#service redisd stop
Stopping ...
OK
(error) NOAUTH Authentication required.
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...

嗯….又是一个坑,在配置了密码后,redis服务开启可直接开启,但是关闭又需要密码,于是进入启动模板文件redisd修改启动配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$CLIEXEC -a "password" -p $REDISPORT shutdown
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
;;

$CLIEXEC -p $REDISPORT shutdown 一句中加上-a “password”,现在便可以直接通过 service redisd stop 指令关闭服务了。

三.Jedis测试连接

redis可以连接多种语言,jedis是其官方推荐的java连接api,写测试方法如下:

1
2
3
4
5
6
7
@Test
public void testConection() {
Jedis jedis = new Jedis("111.231.240.211");
System.out.println("Connection to server sucessfully");
// 查看服务是否运行
System.out.println("Server is running: " + jedis.ping());
}

结果当然没想象那么容易,返回报错如下:

1
redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out

嗯,仔细看看代码,没有输入密码,不过网上别人没输入密码报错是这样的:

1
redis.clients.jedis.exceptions.JedisDataException: NOAUTH Authentication required.

总感觉有地方配置可能还是出错的,于是又在网上到处找解决办法。

很久之后,无意间翻到一篇博客,redis还要手动开启远程访问….

#vim 6379.conf 继续修改配置文件,找到

1
bind 127.0.0.1

嗯,redis的默认配置是绑定了127.0.0.1 ip的… 注释掉这句,通过这个功能可以实现redis指定ip访问,在某些时候其实还是挺有用的。然后再找到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# When protected mode is on and if:
#
# 1) The server is not binding explicitly to a set of addresses using the
# "bind" directive.
# 2) No password is configured.
#
# The server only accepts connections from clients connecting from the
# IPv4 and IPv6 loopback addresses 127.0.0.1 and ::1, and from Unix domain
# sockets.
#
# By default protected mode is enabled. You should disable it only if
# you are sure you want clients from other hosts to connect to Redis
# even if no authentication is configured, nor a specific set of interfaces
# are explicitly listed using the "bind" directive.

protected-mode yes

上面注释已经说的很清楚了,但保护模式开启时,如果没有密码设定,也没有绑定Ip,redis也会自动锁定访问ip。所以,设置为no。

再进行一波测试:

1
2
3
4
5
6
7
8
@Test
public void testConectionWithPassword() {
Jedis jedis = new Jedis("111.231.240.211");
jedis.auth("password");
System.out.println("Connection to server sucessfully");
// 查看服务是否运行
System.out.println("Server is running: " + jedis.ping());
}

终于,测试通过了。

Connection to server sucessfully
Server is running: PONG

四.总结

开始安装好redis本来以为很快就能用,开始我的缓存优化时,一连串的问题接踵而来。以至于耗费了我小半天的功夫才把这一堆配置给调通,之后便是redis的实践测试。有兴趣的可以前往我的github,查看seckill这一项目,里面有redis的实践应用。