Redis模块

一.Redis简介

Redis属于键值数据库,支持数据持久化,能够让数据从内存中保存在磁盘里,即使重启服务器数据也依然存在;同时也支持更多 value 类型,除了 string 外,还支持 hash、lists(链表)、sets(集合)和 sorted sets(有序集合)几种数据类型。

redis 使用了两种文件格式:

(1)全量数据(RDB):是把内存中的数据写入磁盘,便于下次读取文件进行加载。

(2)增量请求(AOF):是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据。redis 存储分为内存储存、磁盘存储和log文件三部分。

二.Redis安装与配置

1.安装

[root@server11 ~]# yum install -y gcc epel-release ;yum install -y jemalloc-devel

[root@server12 ~]# cd /usr/local/src/

[root@server12 src]# ls

jemalloc-3.6.0-1.el6.x86_64.rpm

jemalloc-devel-3.6.0-1.el6.x86_64.rpm

redis-2.8.21.tar.gz

[root@server12 src]# rpm -ivh jemalloc-*

warning: jemalloc-3.6.0-1.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY

Preparing...                                          ########################################### [100%]

   1:jemalloc                                         ########################################### [ 50%]

   2:jemalloc-devel                                   ########################################### [100%]

[root@server12 src]# tar zxf redis-2.8.21.tar.gz 

[root@server12 src]# ls

jemalloc-3.6.0-1.el6.x86_64.rpm

jemalloc-devel-3.6.0-1.el6.x86_64.rpm

redis-2.8.21

redis-2.8.21.tar.gz

[root@server12 src]# cd redis-2.8.21

[root@server12 redis-2.8.21]# make 

[root@server12 redis-2.8.21]# make PREFIX=/usr/local/redis install

2.编辑配置文件

[root@server12 redis-2.8.21]# mkdir /usr/local/redis/etc

[root@server12 redis-2.8.21]# cd /usr/local/redis/etc/

[root@server12 etc]# vim redis.conf

daemonize yes        #是否以后台daemon方式运行

pidfile /usr/local/redis/var/redis.pid        #pid文件位置

port 6379        #监听的端口号

timeout 300        #请求超时时间

loglevel debug        #log信息级别

logfile /usr/local/redis/var/redis.log        #log文件位置

databases 16        #开启数据库的数量

save 900 1        #保存快照的频率,第一个*表示多长时间,第二个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件

save 300 10

save 60 10000

rdbcompression yes        #是否使用压缩

dbfilename dump.rdb        #数据快照文件名(只是文件名,不包括目录)

dir /usr/local/redis/var/        #数据快照的保存目录(这个是目录)

appendonly no        #是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率

appendfsync always        #appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步)

#requirepass 123456        #设置密码

[root@server12 etc]# vim /etc/init.d/redis

#!/bin/sh

#

# redis        init file for starting up the redis daemon

#

# chkconfig:   - 20 80

# description: Starts and stops the redis daemon.

 

# Source function library.

. /etc/rc.d/init.d/functions

 

name="redis-server"

basedir="/usr/local/redis"

exec="$basedir/bin/$name"

pidfile="$basedir/var/redis.pid"

REDIS_CONFIG="$basedir/etc/redis.conf"

 

[ -e /etc/sysconfig/redis ] && . /etc/sysconfig/redis

 

lockfile=/var/lock/subsys/redis

 

start() {

    [ -f $REDIS_CONFIG ] || exit 6

    [ -x $exec ] || exit 5

    echo -n $"Starting $name: "

    daemon --user ${REDIS_USER-redis} "$exec $REDIS_CONFIG"

    retval=$?

    echo

    [ $retval -eq 0 ] && touch $lockfile

    return $retval

}

 

stop() {

    echo -n $"Stopping $name: "

    killproc -p $pidfile $name

    retval=$?

    echo

    [ $retval -eq 0 ] && rm -f $lockfile

    return $retval

}

 

restart() {

    stop

    start

}

 

reload() {

    false

}

 

rh_status() {

    status -p $pidfile $name

}

 

rh_status_q() {

    rh_status >/dev/null 2>&1

}

 

 

case "$1" in

    start)

        rh_status_q && exit 0

        $1

        ;;

    stop)

        rh_status_q || exit 0

        $1

        ;;

    restart)

        $1

        ;;

    reload)

        rh_status_q || exit 7

        $1

        ;;

    force-reload)

        force_reload

        ;;

    status)

        rh_status

        ;;

    condrestart|try-restart)

        rh_status_q || exit 0

        restart

        ;;

    *)

        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart}"

        exit 2

esac

exit $?

[root@server12 etc]# useradd -s /sbin/nologin redis

[root@server12 etc]# mkdir /usr/local/redis/var

[root@server12 etc]# chmod 777 /usr/local/redis/var/

[root@server12 etc]# chmod 755 /etc/init.d/redis 

4.启动redis服务

[root@server12 etc]# chkconfig --add redis

[root@server12 etc]# chkconfig redis on

[root@server12 etc]# service redis start

三.Redis数据结构

操作之前先做个别名,因为进入redis的命令很长,每次输入都很麻烦

[root@server11 ]# alias redis-cli= '/usr/local/redis/bin/redis-cli' 

[root@server11 ]# vim .bashrc

alias redis-cli= '/usr/local/redis/bin/redis-cli'

1. string是简单的类型,一个key对应一个value;可以存二进制的对象。

2. List

list 是一个链表结构(相当于一个管道,随时可以从左右插入和取出值,区别于只能先进后出的站),主要功能是 push、pop、获取一个范围的所有值等等。操作中 key 理解为链表的名字。使用 List 结构,我们可以轻松地实现最新消息排行等功能(比如微博的 TimeLine)。list 的另一个应用就是消息队列,可以利用 list 的 push 操作,将任务存在 list 中,然后工作线程再用 pop 操作将任务取出进行执行。

3. Set

 set 即集合,和我们数学中的集合概念相似,对集合的操作有添加、删除元素,有对多个集合求交、并、差等操作。操作中的 key 理解为集合的名字。

4. sorted set

 sorted set 即有序集合,它比 set 多一个权重参数 score,使得集合中的元素能够按 score 进行有序排列,比如一个存储全班同学成绩的 Sorted Sets,其集合 value 可以是同学的学号,而 score 就可以是其考试成绩,这样在数据插入集合的时候,就已经进行了天然的排序。

5. Hash

 在 Redis 中,我们经常将一些结构化的信息打包成 hashmap,在客户端序列化后存储为一个字符串的值(一般是 JSON 格式)。可以把多个键值对存储到一个 hash 中去,比如用户的昵称、年龄、性别可以存储到一个 hash 中去。

四.Redis主从配置

原理:主要是通过master server持久化的rdb文件实现的。master server 先dump出内存快照文件,然后将rdb文件传给slave server,slave server 根据rdb文件重建内存表。

redis复制过程如下:
1)slave server启动连接到master server之后,salve server主动发送SYNC命令给master server
2)master server接受SYNC命令之后,判断,是否有正在进行内存快照的子进程,如果有,则等待其结束,否则,fork一个子进程,子进程把内存数据保存为文件,并发送给slave server
3)master server子进程进程做数据快照时,父进程可以继续接收client端请求写数据,此时,父进程把新写入的数据放到待发送缓存队列中
4)slave server 接收内存快照文件之后,清空内存数据,根据接收的快照文件,重建内存表数据结构
5)master server把快照文件发送完毕之后,发送缓存队列中保存的子进程快照期间改变的数据给slave server,slave server做相同处理,保存数据一致性
6)master server 后续接收的数据,都会通过步骤1建立的连接,把数据发送到slave server

1.实验前准备

Masterserver11.example.com    192.168.122.67

Slaveserver12.example.com 192.168.122.101

关闭iptablesselinux

2.安装配置

Master配置如上,slave只需在vim /usr/local/redis/etc/redis.conf 文件中添加以下两行:

slaveof 192.168.122.67 6379#指定master上的IP和端口

masterauth 123456#可选内容,指定master的密码

3.分别启动masterslave上的redis服务

4.验证主从

(1)查看日志

[root@server12 etc]# tail /usr/local/redis/var/redis.log

[4425] 30 Mar 02:13:41.527 - DB 0: 2 keys (0 volatile) in 4 slots HT.

[4425] 30 Mar 02:13:41.527 - 1 clients connected (0 slaves), 465016 bytes in use

[4425] 30 Mar 02:13:46.543 - DB 0: 2 keys (0 volatile) in 4 slots HT.

[4425] 30 Mar 02:13:46.543 - 1 clients connected (0 slaves), 465016 bytes in use

[4425] 30 Mar 02:13:51.556 - DB 0: 2 keys (0 volatile) in 4 slots HT.

....

2)示例验证

master上创建数据

[root@server11 ~]# redis-cli -a 123456

127.0.0.1:6379> set key1 123

OK

127.0.0.1:6379> set key2 456

OK

127.0.0.1:6379> keys *

1) "key1"

2) "key2"

127.0.0.1:6379> exit

slave上查看数据是否同步

[root@server12 ~]# redis-cli 

127.0.0.1:6379> keys *

1) "key2"

2) "key1"

127.0.0.1:6379> exit

如果出现上述结果表明简单的redis主从配置成功。