代码改变世界

一、redis简单配置

2019-02-19 15:32 by QQ~sunshine, ... 阅读, ... 评论, 收藏, 编辑

1.安装

  下载安装后解压即可执行make命令完成编译,完整命令如下:

  wget http://download.redis.io/redis-stable.tar.gz
  tar xzf redis-stable.tar.gz
  cd redis-stable
  make

  编译完成后直接执行make install命令来将这些可执行程序复制到/usr/local/bin目录中以便以后执行程序可以不用输入完整的路径。

2.启动和停止

  最常用的两个程序是redis-server和redis-cli,其中redis-server是redis的服务器,启动redis即运行redis-server;而redis-cli是redis自带的redis命令行客户端。

  启动有直接启动和通过初始化脚本启动两种方式,分别适用于开发环境和生产环境。

直接启动

  直接运行redis-server即可启动redis。

  redis服务器默认会使用6379端口,通过--port参数可以自定义端口号:

  redis-server --port 6380

通过初始化脚本启动redis

  在linux系统中可以通过初始化脚本启动redis,使得redis能跟随系统自动启动,在生产环境中推荐使用此方法运行redis。在redis源码目录的utils文件夹中有一个名为redis_init_script的初始化脚本文件。

  我们需要配置redis的运行方式和持久化文件、日志文件的存储位置等,具体步骤如下:

(1)配置初始化脚本。首先将初始化脚本复制到/etc/init.d目录中,文件名为redis_端口号,其中端口号表示要让redis监听的端口号,客户端通过该端口号链接redis。然后修改脚本REDISPORT变量的值为同样的端口号。

(2)建立需要的文件夹。

  /etc/redis 存放redis的配置文件

  /var/redis/端口号 存放redis的持久化文件

(3)修改配置文件。首先将文件模板(在redis根目录中redis.conf)复制到/etc/redis目录中,以端口号命名(如6379.conf),然后按照以下样例对部分参数进行编辑。

  参数           值                 说明
  daemonize          yes              使redis以守护进程模式运行

  pidfile          /var/run/redis_端口号.pid      设置redis的pid文件位置

  port            端口号            设置redis监听的端口号

  dir          /var/redis/端口号          设置持久化文件存放位置

  现在就可以使用/etc/init.d/redis_端口号start来启动redis了,而后需要执行下面的命令使redis随系统自动启动:

  update-rc.d redis_端口号 defaults

停止redis

  考虑到redis有可能正在将内存中的数据同步到硬盘中,强行终止redis进程可能会导致数据丢失。正确停止redis的方式应该是向redis发送shutdown命令,方法为:

  redis-cli shutdown

  当redis收到shutdown命令,会先断开所有的客户端连接,然后根据配置执行持久化,最后完成退出。

  redis可以妥善处理sigterm信号,所以使用"kill redis进程的PID"也可以正常结束redis,效果同上。

3.redis命令行客户端

发送命令

  通过redis-cli向redis发送命令的方式有两种:

  第一种后面直接加参数,比如redis-cli第一种后面直接加参数,比如redis-cli shutdown。执行时会自动按照默认的配置(服务器地址为127.0.0.1,端口号为6379)链接redis,通过-h和-p参数可以自定义地址和端口号:

  redis-cli -h 127.0.0.1 -p 6379

  redis提供了ping命令来测试客户端与redis的链接是否正常,如果连接正常会收到PONG。

  第二种只输入redis-cli不添加任何参数会进入交互模式,可以执行任何命令。

命令返回值

命令返回有5种类型

(1)状态恢复

  比如向redis发送set命令设置某个键的值,会返回OK表示设置成功,另外发送PING返回PONG也是状态回复。

(2)错误回复

  当出现命令不存在或命令格式有错误等情况redis会返回错误回复,以(error)开头,后面跟错误信息。

(3)整数回复

  redis没有整数类型,但是提供了一些用于整数操作的命令,整数回复以(integer)开头,并在后面跟上整数数据。

(4)字符串回复

  当请求一个字符串类型键的键值或一个其他类型键中的某个元素时就会得到一个字符串回复,字符串回复以双引号包裹。

(5)多行字符串回复

  当请求一个非字符串类型键的元素列表时就会收到多行字符串回复,多行字符串回复中的每行字符串都是以一个序号开头。

4.配置

  由于redis配置选项比较多,通过启动参数设置这些选项不方便,所以redis支持通过配置文件来设置这些选项。启用配置文件的方法是启动时将配置文件的路径作为启动参数传递给redis-server,如:

  redis-server /path/to/redis.conf

  通过启动参数传递同名的配置选项会覆盖配置文件中相应的参数。

  除此之外redis可以在运行时通过"config set"命令在不重新启动redis的情况下动态修改部分redis配置(不是所有的配置都可以这样修改),如:

  redis>config set loglevel warning

  OK

  运行时也可以使用"config get"命令获得redis当前的配置情况,如:

  redis>config get loglevel

  1)"loglevel"

  2)"warning"

  第一行字符串回复表示的是选项名,第二行是选项值。

5.多数据库

  redis是一个字典结构的存储服务器,而实际上一个redis实例提供了多个用来存储数据的字典,客户端可以指定将数据存储的哪个字典中。这与我们熟知的在一个关系数据库实例中可以创建多个数据库类似,所以可以将其中的每个字典都理解成一个独立的数据库。

  每个数据库对外都是以一个从0开始的递增数字命名,redis默认支持16个数据库,可以通过配置参数database来修改这一数字。客户端与redis建立连接后会自动选择0号数据库,不过可以随时使用select命令更换数据库,如要选择1号数据库:

  redis>select 1

  OK

  然而这些以数字命名的数据库又与我们理解的数据库有所区别。首先redis不支持自定义数据库名字,每个数据库都是以编号命名,开发者必须自己记录哪些数据库存储了哪些数据。另外也不支持为每个数据库设置不同的访问密码,所以一个客户端要么可以访问全部数据库,要么连一个数据库也没有访问权限。最重要的是多个数据库之间并不是完全隔离的,比如flushall命令可以清空一个redis实例中所有数据库的数据。综上所述,这些数据库更像是一种命名空间,而不适宜存储不同应用程序的数据。比如可以使用0号数据库存储某个应用生产环境中的数据,使用1号数据库存储测试环境中的数据,但不适宜使用0号数据库存储A应用的数据,使用1号数据库存储B应用的数据,不同的应用数据使用不同的redis实例存储数据。由于redis非常轻量级,一个空的redis实例占用内存只有1MB左右,所以不用担心多个redis实例会额外占用很多内存。

6.访问远程redis

  这里先说配置文件中的两个配置中的参数:

  bind:这个参数值代表这个地址可以接收到请求。

  protect-mode:是否开启保护模式,参数值只有"yes"和"no"。

  默认情况下redis是只能被本机访问的,如果要被远程访问需要更改一点配置,在.conf配置文件中有一个"bind"的配置,默认是"bind 127.0.0.1",表示只能被本机访问,如果将这个配置注释掉则会允许所有访问,但是注释掉以后还是不能访问,因为redis默认是被保护起来的,所以找到配置文件中"protect-mode"的配置,默认是"yes",可以改为"no",这时候所有的远程服务器也都可以成功访问,但是这样是及其不安全的,生产环境不会这样做,所以protect-mode还是要改为yes,在bind这个参数后面加上允许接收请求的网卡ip地址即可。下面对bind做更详细的解释:

  假如现在有两个远程服务器ip分别是xxx.A和xxx.B,很多地方对于bind的解释或者翻译都是说只接收bind后面的ip的请求,所以容易配置成"bind xxx.A xxx.B",但是这样其实还是无法访问的。

  这里要说bind其实是网络接口也就是网卡,一台服务器可能有多个网卡,假如一个用来接收局域网请求的ip为"xxx.C"和接收外网请求的ip为"xxx.D",如果上面的"xxx.A""xxx.B"都在同一个局域网内,即需要使用"xxx.C"这块网卡接收请求,那么bind参数只需要配置上"bind xxx.C"两台服务器都可以成功访问redis。

  总结:bind绑定的ip不是请求来源的ip,而是你redis服务器本身接受请求的ip。