redis安装、配置

Redis是REmote DIctionary Server(远程字典服务器)的缩写,是一个Key-Value形数据库。意大利一家创业公司Merzia的创始人Salvatore Sanfilippo于2009年开发完成。从2010年3月15日起,Redis的开发工作由VMware主持。其特点:

  • 内存+磁盘持久化;
  • 具有丰富的数据结构:字符串、链表、集合、有序集合、哈希表…(尤其擅长长数组类型数据的高速写入)
  • 数据快照;
  • 自带主从复制功能;

一、安装

1、下载、解压:

[root@centOS1 src]# cd /usr/local/
wget https://github.com/antirez/redis/archive/2.8.23.tar.gz
tar -xvzf redis-2.8.23.tar.gz

2、编译、安装:

[root@centOS1 local]# cd redis-2.8.23
[root@centOS1 redis-2.8.23]# make

在编译成功后,在src目录下面会多出了6个可执行文件:

  • redis-server:Redis服务器的daemon启动程序
  • redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作
  • redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能
  • redis-check-aof:更新日志检查
  • redis-check-dump:用于本地数据库检查

注: 编译的时候可能出现下面的错误提示:
make[2]: cc: Command not found
异常原因:没有安装gcc
解决方案:yum install gcc-c++

3、配置:
redis的配置比较简单,只有一个配置文件redis.conf,存在redis的安装目录中(/usr/local/redis-2.8.23)。

1)建立目录:

  • 建立mkdir /etc/redis目录,把redis.conf拷贝到该目录;
  • 建立mkdir /var/redis/log 、mkdir /var/redis/run、mkdir /var/redis/dir目录,分别存放redis的日志、pid文件、数据文件;

2)修改配置:
vim /etc/redis/redis.conf 修改如下内容:
daemonize yes #表示后台运行
pidfile /var/redis/run/redis_6379.pid #pid存放路径
logfile /var/redis/log/redis_6379.log #修改日志存放路径
dbfilename dump_6379.rdb
dir /var/redis/dir #修改数据文件路径

4、启动、关闭:
把redis-cli和redis-server等常用redis命令拷贝到/usr/bin/ 目录中。因为,这样在任意目录上输入redis-server命令时,centos会自动到/usr/bin/下搜索。

  • 启动:
    [root@centOS1 ~]# redis-server /etc/redis/redis.conf
  • 进入redis命令行:
    [root@centOS1 ~]# redis-cli
    127.0.0.1:6379> get name
    “liuxiao”
    127.0.0.1:6379>
  • 关闭:
    [root@centOS1 ~]# redis-cli shutdown

5、单机启动多个redis实例:
redis 程序运行过程并不会消耗太多的 CPU 和 IO 资源(主要消耗memory),如是在单台机器上如果只启用一个redis实例会造成资源浪费 。同时为了增加可用性,一般也不会在单机上只运行一个redis实例。具体配置如下:

  • 安装、配置好单实例的redis服务;
  • 在/etc/redis目录下拷贝redis.conf配置文件为6380.conf;
  • 修改6380.conf配置文件中的端口号、pid文件、日志文件、数据文件;

二、配置

1、常用部分:

  • daemonize no
    默认情况下 redis 不是作为守护进程运行的,如果你想让它在后台运行,你就把它改成 yes。
  • pidfile /var/run/redis.pid
    当redis作为守护进程运行的时候,它会写一个 pid 到 /var/run/redis.pid 文件里面。
  • logfile “” 日志文件路径
  • port 6379 ,监听端口号,默认为 6379,如果你设为 0 ,redis 将不在 socket 上监听任何客户端连接。
  • timeout 0 指定在一个 client 空闲多少秒之后关闭连接(0 就是不管它)
  • databases 16 设置数据库的数目。默认数据库是 DB 0,你可以在每个连接上使用 select 命令选择一个不同的数据库,但是 dbid 必须是一个介于 0 到 databasees - 1 之间的值。

2、快照(snapshot):
Redis有两种存储方式,默认是snapshot方式,实现方法是定时将内存的快照(snapshot)持久化到硬盘,这种方法缺点是持久化之后如果出现crash则会丢失一段数据。因此在完美主义者的推动下作者增加了aof方式。aof即append only mode,在写入内存数据的同时将操作命令保存到日志文件。(snapshot和aof这两种方式在配置的时候二选一
其实aof目的主要是数据可靠性及高可用性,在Redis中有另外一种方法来达到此目的:Replication。由于Redis的高性能,复制基本没有延迟。这样达到了防止单点故障及实现了高可用。

1)保存DB到磁盘:
save 900 1
save 300 10
save 60 10000
# 格式:save <间隔时间(秒)> <写入次数> 根据给定的时间间隔和写入次数将数据保存到磁盘。
注意:你可以注释掉所有的 save 行来停用保存功能。也可以直接一个空字符串来实现停用:save “”

2)stop-writes-on-bgsave-error yes
默认情况下,如果 redis 最后一次的后台保存失败,redis 将停止接受写操作,这样以一种强硬的方式让用户知道数据不能正确的持久化到磁盘,否则就会没人注意到灾难的发生。如果后台保存进程重新启动工作了,redis 也将自动的允许写操作。然而你要是安装了靠谱的监控,你可能不希望 redis 这样做,那你就改成 no 好了。

3)rdbcompression yes
是否在 dump .rdb 数据库的时候使用 LZF 压缩字符串。默认都设为 yes。如果你希望保存子进程节省点 cpu ,你就设置它为 no ,不过这个数据集可能就会比较大。

4)dbfilename dump.rdb
设置 dump 的文件位置

5)rdbchecksum yes
是否校验rdb文件

6)dir ./
工作目录,例如上面的 dbfilename 只指定了文件名,但是它会写入到这个目录下。这个配置项一定是个目录,而不能是文件名。

3、APPEND ONLY MODE(AOF)

  • appendfsync no
  • appendfsync everysec 每秒同步
  • appendfsync always 总是同步
    是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认值为no

4、限制:

1)maxclients 10000
redis最大连接数。一旦达到最大限制,redis 将关闭所有的新连接。并发送一个‘max number of clients reached’的错误。

2)maxmemory
最大使用内存。如果你设置了这个值,当缓存的数据容量达到这个值, redis 将根据你选择的eviction 策略来移除一些 keys。如果 redis 不能根据策略移除 keys ,或者是策略被设置为 ‘noeviction’,redis 将开始响应错误给命令,如 set,lpush 等等,并继续响应只读的命令,如 get。

3)maxmemory-policy noeviction
最大内存策略,你有 5 个选择。

1
2
3
4
5
6
7
8
9
# volatile-lru -> remove the key with an expire set using an LRU algorithm
# volatile-lru -> 使用 LRU 算法移除包含过期设置的 key 。
# allkeys-lru -> remove any key accordingly to the LRU algorithm
# allkeys-lru -> 根据 LRU 算法移除所有的 key 。
# volatile-random -> remove a random key with an expire set
# allkeys-random -> remove a random key, any key
# volatile-ttl -> remove the key with the nearest expire time (minor TTL)
# noeviction -> don't expire at all, just return an error on write operations
# noeviction -> 不让任何 key 过期,只是给写入操作返回一个错误

5、主从复制(Replication)、集群…