Redis(一):安装、常用命令、主从复制、伪集群搭建

本文介绍Redis的安装步骤及配置方法,涵盖前端启动、后端启动、基本命令使用及多数据库测试等内容。同时深入探讨了Redis的两种持久化方式:RDB与AOF,并详细讲解了主从复制和集群搭建的过程。

1.1.redis简介

Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。redis是将数据存放到内存中,由于内容存取速度快所以redis被广泛应用在互联网项目中。

1.2.redis下载

http://download.redis.io/releases/redis-3.0.0.tar.gz

1.3.安装redis

1.3.1.准备

Redis是c语言开发的。安装redis需要c语言的环境。

<span style="background-color:#f8f8f8"><span style="color:#333333">yum install gcc-c<span style="color:#981a1a">++</span></span></span>

1.3.2.安装redis

将redis-3.0.0.tar.gz拷贝到/usr/upload下解压源码

<span style="background-color:#f8f8f8"><span style="color:#333333">tar <span style="color:#0000cc">-zxvf</span> redis-3.0.0.tar.gz</span></span>

进入解压后的目录进行编译

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#3300aa">cd</span> /usr/upload/redis-3.0.0
​
<span style="color:#3300aa">make</span></span></span>

安装到指定目录

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#3300aa">make</span> install <span style="color:#0000ff">PREFIX</span><span style="color:#981a1a">=</span>/usr/local/redis</span></span>

1.4.启动和关闭redis

1.4.1.前端启动

1、启动方式:

直接运行bin/redis-server将以前端模式启动。

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#3300aa">cd</span> /usr/local/redis/bin
./redis-server</span></span>

2、启动缺点:

ssh命令窗口关闭则redis-server程序结束,不推荐使用此方法

3、启动图例:

4、前端启动的关闭:ctrl+c

1.4.2.后端启动

第一步:进入源码目录,里面有一份配置文件 redis.conf,然后将其拷贝到安装路径下

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#3300aa">cp</span> /usr/upload/redis-3.0.0/redis.conf  /usr/local/redis/bin</span></span>

第二步:修改/usr/java/redis/bin下的redis.conf,将daemonize由no改为yes

第三步:启动

<span style="background-color:#f8f8f8"><span style="color:#333333">./redis-server redis.conf</span></span>

1.4.3.关闭

到redis/bin目录下执行如下命令

<span style="background-color:#f8f8f8"><span style="color:#333333">./redis-cli <span style="color:#0000cc">-p</span> 端口号 shutdown</span></span>

1.4.4redis的基本命令

redis-cli连上redis服务后,可以在命令行发送命令:

<span style="background-color:#f8f8f8"><span style="color:#333333">./redis-cli <span style="color:#0000cc">-h</span> <span style="color:#116644">127</span>.0.0.1 <span style="color:#0000cc">-p</span> <span style="color:#116644">6379</span></span></span>

1、setget:使用set和get可以向redis设置数据、获取数据

2、keys *:查看当前库中所有的key值

3、exists:判断key值是否存在

4、expirettl:expire设置key的过期时间,ttl查看key的有效期

5、clear:可以使用clear命令对redis-cli终端屏幕清屏。

1.5.多数据库测试

一个redis实例可以包括多个数据库,客户端可以指定连接某个redis实例的哪个数据库,就好比一个mysql中创建多个数据库,客户端连接时指定连接哪个数据库。

一个redis实例最多可提供16个数据库,下标从015,客户端默认连接第0号数据库,也可以通过select选择连接哪个数据库,如下连接1号库:

select 1

在1号库中查询上节设置的数据,结果查询不到。

重新选择第0号数据库,查询数据:

select 0;
keys *;

如果选择一个不存在数据库则会报错:

注意:

  1. redis不支持修改数据库的名称,只能通过select 0、select 1...选择数据库。

  2. FLUSHALL --清空所有数据库的所有数据

  3. FLUSHDB --清空当前所在数据库的数据

1.6.redis五种数据类型

1.6.1.string

String:key-value

赋值:set key value

<span style="background-color:#f8f8f8"><span style="color:#333333">127.0.0.1:6379> set test 123
​
OK</span></span>

取值:get key

<span style="background-color:#f8f8f8"><span style="color:#333333">127.0.0.1:6379> get test
​
"123“</span></span>

删除:del key

<span style="background-color:#f8f8f8"><span style="color:#333333">127.0.0.1:6379>del test
​
(integer) 1</span></span>

自增自减:incr key decr key

<span style="background-color:#f8f8f8"><span style="color:#333333">127.0.0.1:6379> incr num
(integer) 1
​
127.0.0.1:6379> incr num
(integer) 2
​
127.0.0.1:6379> incr num
(integer) 3</span></span>

1.6.2.hash

Hash:key-field-value

key:map

赋值:HSET key field value

<span style="background-color:#f8f8f8"><span style="color:#333333">127.0.0.1:6379> hset user name zhangsan
(integer) 1</span></span>

取值:HGET key field

<span style="background-color:#f8f8f8"><span style="color:#333333">127.0.0.1:6379> hget user name
"zhangsan“</span></span>

删除:HDEL key field

<span style="background-color:#f8f8f8"><span style="color:#333333">127.0.0.1:6379> hdel user name
(integer) 1</span></span>

1.6.3.list

List:有顺序可重复,内部是使用双向链表实现的

<span style="background-color:#f8f8f8"><span style="color:#333333">192.168.25.153:6379> lpush list a b c d
​
(integer) 4
​
192.168.25.153:6379> lrange list 0 -1
​
1) "d"
​
2) "c"
​
3) "b"
​
4) "a"
​
192.168.25.153:6379> rpush list 1 2 3 4
​
(integer) 8
​
192.168.25.153:6379> lrange list 0 -1
​
1) "d"
​
2) "c"
​
3) "b"
​
4) "a"
​
5) "1"
​
6) "2"
​
7) "3"
​
8) "4"
​
192.168.25.153:6379> lrem list 0 d 
​
(integer) 1
​
192.168.25.153:6379> lrange list1 0 -1
​
1) "c"
​
2) "b"
​
3) "a"
​
4) "1"
​
5) "2"
​
6) "3"
​
7) "4"</span></span>

1.6.4.set

Set:元素无顺序,不能重复

<span style="background-color:#f8f8f8"><span style="color:#333333">192.168.25.153:6379> sadd set1 a b c c c d
​
(integer) 4
​
192.168.25.153:6379> smembers set1
​
1) "b"
​
2) "c"
​
3) "d"
​
4) "a"
​
192.168.25.153:6379> srem set1 a
​
(integer) 1
​
192.168.25.153:6379> smembers set1
​
1) "b"
​
2) "c"
​
3) "d"</span></span>

1.6.5.zset

SortedSet(zset):有顺序,不能重复

<span style="background-color:#f8f8f8"><span style="color:#333333">192.168.25.153:6379> zadd zset1 2 a 5 b 1 c 6 d
​
(integer) 4
​
192.168.25.153:6379> zrange zset1 0 -1
​
1) "c"
​
2) "a"
​
3) "b"
​
4) "d"
​
192.168.25.153:6379> zrem zset1 a
​
(integer) 1
​
192.168.25.153:6379> zrange zset1 0 -1
​
1) "c"
​
2) "b"
​
3) "d"
​
192.168.25.153:6379> zrevrange zset1 0 -1
​
1) "d"
​
2) "b"
​
3) "c"
​
192.168.25.153:6379> zrange zset1 0 -1 withscores
​
1) "c"
​
2) "1"
​
3) "b"
​
4) "5"
​
5) "d"
​
6) "6"
​
192.168.25.153:6379> zrevrange zset1 0 -1 withscores
​
1) "d"
​
2) "6"
​
3) "b"
​
4) "5"
​
5) "c"
​
6) "1"</span></span>

1.6.6.总结

数据类型赋值取值删除特点
stringset k vget kdel k
hashhset k k-vhget k khdel k k
listlpush/rpush k vlrange k 0 -1lrem k 2 v
setsadd k v...smembers ksrem k v
zsetzadd k 1 v...zrange k 0 -1 withscoreszrem k v

1.7.持久化

Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。

Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式。可以单独使用其中一种或将二者结合用。

1.7.1.RDB持久化

RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘。

RDB是Redis默认采用的持久化方式,在redis.conf配置文件中默认有此下配置:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#117700">save 900</span> <span style="color:#117700">1 </span> <span style="color:#aa5500">#900秒内容如果超过1个key被修改,则发起快照保存</span>
<span style="color:#117700">save 300</span> <span style="color:#117700">10 </span><span style="color:#aa5500">#300秒内容如超过10个key被修改,则发起快照保存</span>
<span style="color:#117700">save 60</span> <span style="color:#117700">10000 </span><span style="color:#aa5500">#表示60秒内如果超过10000个key被修改,则发起快照保存</span></span></span>

在redis.conf中:

配置dir指定rdb快照文件的位置

配置dbfilenam指定rdb快照文件的名称

Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存。

1.7.1.1.实验

1、删除dump.rdb

2、set test abc

3、关闭服务端并观察bin目录的变化

总结:

优点:让redis的数据存取速度变快

缺点:服务器断电时会丢失部分数据(数据的完整性得不到保证)

1.7.2.AOF持久化

默认情况下Redis没有开启AOF(append onlyfile)方式的持久化,可以通过appendonly参数开启:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#117700">appendonly yes</span></span></span>

AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#117700">appendfilename appendonly</span>.<span style="color:#117700">aof</span></span></span>

AOF持久化策略如下:

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">#appendfsync always   #每次有数据修改发生时都会写入AOF文件。</span>
<span style="color:#117700">appendfsync everysec</span>  <span style="color:#aa5500">#每秒钟同步一次,该策略为AOF的缺省策略。</span>
<span style="color:#aa5500">#appendfsync no        #从不同步。高效但是数据不会被持久化。</span></span></span>

1.7.2.1.实验

1、设置appendonly为yes

2、设置一个key

3、观察appendonly.aof

总结:

优点:持久化良好,能包证数据的完整性

缺点:大大降低了redis系统的存取速度

1.8.主从复制(了解)

1.8.1.什么是主从复制

持久化保证了即使redis服务重启也会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的主从复制机制就可以避免这种单点故障,如下图:

说明:

  • 主redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服务器宕机其它两台redis服务也可以继续提供服务。

  • 主redis中的数据和从redis上的数据保持实时同步,当主redis写入数据时通过主从复制机制会复制到两个从redis服务上。

  • 只有一个主redis,可以有多个从redis。

  • 主从复制不会阻塞master,在同步数据时,master可以继续处理client 请求

  • 一个redis可以即是主又是从,如下图:

1.8.2.主从配置

1.8.2.1.主redis配置

无需特殊配置。

1.8.2.2.从redis配置

修改从redis服务器上的redis.conf文件,添加slaveof 主redis ip 主redis端口

上边的配置说明当前该从redis服务器所对应的主redis是192.168.101.3,端口是6379

1.8.3.主从复制过程

主从复制过程如下图:

复制过程说明:

1、 slave 服务启动,slave 会建立和master 的连接,发送sync 命令。

2、master启动一个后台进程将数据库快照保存到RDB文件中

3、master 就发送RDB文件给slave

4、slave 将文件保存到磁盘上,然后加载到内存恢复

5、master把缓存的命令转发给slave

注意:主死了,从只能读

1.8.4.配置主从赋值

1、拷贝redis

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#3300aa">cd</span> /usr/local
<span style="color:#3300aa">cp</span> <span style="color:#0000cc">-r</span> redis redis-6380</span></span>

2、修改redis-6380的redis.conf

  

3、分别开启主从redis,并在主redis存入数据,测试效果

效果:主从数据库数据一致

4、关闭主redis,使用从redis存入数据

2.redis集群的搭建

2.1.redis-cluster架构图

架构细节:

(1)所有的redis节点彼此互联(PING-PONG机制),节点的fail是通过集群中超过半数的节点检测失效时才生效.

(2)存取数据时连接任一节点都可以,但集群中有一个节点fail整个集群都会fail

<span style="background-color:#f8f8f8"><span style="color:#333333">Redis 集群中内置了 16384 个哈希槽,当需要在Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
crc16(key)%16384=[0~16383]</span></span>

2.2.redis集群的搭建

Redis集群中至少应该有三个节点。要保证集群的高可用,需要每个节点有一个备份机。

Redis集群至少需要6台服务器。

搭建伪分布式。可以使用一台虚拟机运行6个redis实例。需要修改redis的端口号7001-7006

2.2.1.集群搭建环境

使用ruby脚本搭建集群,需要安装ruby。

<span style="background-color:#f8f8f8"><span style="color:#333333">[root@upload ~]<span style="color:#aa5500"># yum install ruby</span>
[root@upload ~]<span style="color:#aa5500"># yum install rubygems</span>
[root@upload ~]<span style="color:#aa5500"># gem install redis-3.0.0.gem </span>
​
Successfully installed redis-3.0.0
​
<span style="color:#116644">1</span> gem installed
​
Installing ri documentation <span style="color:#770088">for</span> redis-3.0.0...
​
Installing RDoc documentation <span style="color:#770088">for</span> redis-3.0.0...
​
[root@localhost ~]<span style="color:#aa5500"># cd redis-3.0.0/src</span>
[root@localhost src]<span style="color:#aa5500"># ll *.rb</span>
<span style="color:#0000cc">-rwxrwxr-x</span>. <span style="color:#116644">1</span> root root <span style="color:#116644">48141</span> Apr  <span style="color:#116644">1</span>  <span style="color:#116644">2015</span> redis-trib.rb</span></span>

2.2.2.搭建步骤

注意:必须删除dump.rdb和appendonly.aof文件

搭建伪分布式,需要6个redis实例放到/usr/local/redis-cluster目录下,并且运行在不同的端口7001-7006

<span style="background-color:#f8f8f8"><span style="color:#3300aa">cp</span> <span style="color:#0000cc">-r</span>  /usr/local/redis  /usr/local/redis-cluster/redis-7001</span>

2.2.2.1.创建6个redis实例

每个实例运行在不同的端口。还需要修改redis.conf配置文件。配置文件中还需要把cluster-enabled yes前的注释去掉。

2.2.2.2.启动每个redis实例

创建启动集群的脚本:start-all.sh 放在/usr/java/redis-cluster目录下。

<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#0000ff">tauch start-all.sh</span>
<span style="color:#0000ff">v视图 y复制 p粘贴</span></span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#3300aa">cd</span> redis-7001
./bin/redis-server bin/redis.conf
<span style="color:#3300aa">cd</span> ..
<span style="color:#3300aa">cd</span> redis-7002
./bin/redis-server bin/redis.conf
<span style="color:#3300aa">cd</span> ..
<span style="color:#3300aa">cd</span> redis-7003
./bin/redis-server bin/redis.conf
<span style="color:#3300aa">cd</span> ..
<span style="color:#3300aa">cd</span> redis-7004
./bin/redis-server bin/redis.conf
<span style="color:#3300aa">cd</span> ..
<span style="color:#3300aa">cd</span> redis-7005
./bin/redis-server bin/redis.conf
<span style="color:#3300aa">cd</span> ..
<span style="color:#3300aa">cd</span> redis-7006
./bin/redis-server bin/redis.conf
<span style="color:#3300aa">cd</span> .. 
[root@localhost redis-cluster]<span style="color:#aa5500"># chmod 777 start-all.sh</span></span></span>

创建关闭集群的脚本:shutdown-all.sh,放在/usr/local/redis-cluster目录下。

<span style="background-color:#f8f8f8"><span style="color:#333333">cd redis-7001
./redis7001/ bin/redis-cli -p 7001 shutdown
./redis7001/ bin/redis-cli -p 7002 shutdown
./redis7001/ bin/redis-cli -p 7003 shutdown
./redis7001/ bin/redis-cli -p 7004 shutdown
./redis7001/ bin/redis-cli -p 7005 shutdown
./redis7001/ bin/redis-cli -p 7006 shutdown
[root@localhost redis-cluster]# chmod 777shutdown-all.sh</span></span>

2.2.2.3.使用ruby搭建集群

切换到*.rb目录

<span style="background-color:#f8f8f8"><span style="color:#333333">[root@localhost src]<span style="color:#aa5500"># ./redis-trib.rb create --replicas 1 192.168.219.133:7001 192.168.219.133:7002 192.168.219.133:7003 192.168.219.133:7004 192.168.219.133:7005  192.168.219.133:7006</span>
>>> Creating cluster
Connecting to <span style="color:#3300aa">node</span> <span style="color:#116644">192</span>.168.25.153:7001: OK
Connecting to <span style="color:#3300aa">node</span> <span style="color:#116644">192</span>.168.25.153:7002: OK
Connecting to <span style="color:#3300aa">node</span> <span style="color:#116644">192</span>.168.25.153:7003: OK
Connecting to <span style="color:#3300aa">node</span> <span style="color:#116644">192</span>.168.25.153:7004: OK
Connecting to <span style="color:#3300aa">node</span> <span style="color:#116644">192</span>.168.25.153:7005: OK
Connecting to <span style="color:#3300aa">node</span> <span style="color:#116644">192</span>.168.25.153:7006: OK
>>> Performing hash slots allocation on <span style="color:#116644">6</span> nodes...
Using <span style="color:#116644">3</span> masters:
<span style="color:#116644">192</span>.168.25.153:7001
<span style="color:#116644">192</span>.168.25.153:7002
<span style="color:#116644">192</span>.168.25.153:7003
Adding replica <span style="color:#116644">192</span>.168.25.153:7004 to <span style="color:#116644">192</span>.168.25.153:7001
Adding replica <span style="color:#116644">192</span>.168.25.153:7005 to <span style="color:#116644">192</span>.168.25.153:7002
Adding replica <span style="color:#116644">192</span>.168.25.153:7006 to <span style="color:#116644">192</span>.168.25.153:7003
M: 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3 <span style="color:#116644">192</span>.168.25.153:7001
   slots:0-5460 (5461 slots) master
M: 8cd93a9a943b4ef851af6a03edd699a6061ace01 <span style="color:#116644">192</span>.168.25.153:7002
   slots:5461-10922 (5462 slots) master
M: 2935007902d83f20b1253d7f43dae32aab9744e6 <span style="color:#116644">192</span>.168.25.153:7003
   slots:10923-16383 (5461 slots) master
S: 74f9d9706f848471583929fc8bbde3c8e99e211b <span style="color:#116644">192</span>.168.25.153:7004
   replicates 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3
S: 42cc9e25ebb19dda92591364c1df4b3a518b795b <span style="color:#116644">192</span>.168.25.153:7005
   replicates 8cd93a9a943b4ef851af6a03edd699a6061ace01
S: 8b1b11d509d29659c2831e7a9f6469c060dfcd39 <span style="color:#116644">192</span>.168.25.153:7006
   replicates 2935007902d83f20b1253d7f43dae32aab9744e6
Can I <span style="color:#770088">set</span> the above configuration? (type <span style="color:#aa1111">'yes'</span> to accept): <span style="color:#3300aa">yes</span>
>>> Nodes configuration updated
>>> Assign a different config epoch to each <span style="color:#3300aa">node</span>
>>> Sending CLUSTER MEET messages to join the cluster
Waiting <span style="color:#770088">for</span> the cluster to join.....
>>> Performing Cluster Check (using <span style="color:#3300aa">node</span> <span style="color:#116644">192</span>.168.25.153:7001)
M: 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3 <span style="color:#116644">192</span>.168.25.153:7001
   slots:0-5460 (5461 slots) master
M: 8cd93a9a943b4ef851af6a03edd699a6061ace01 <span style="color:#116644">192</span>.168.25.153:7002
   slots:5461-10922 (5462 slots) master
M: 2935007902d83f20b1253d7f43dae32aab9744e6 <span style="color:#116644">192</span>.168.25.153:7003
   slots:10923-16383 (5461 slots) master
M: 74f9d9706f848471583929fc8bbde3c8e99e211b <span style="color:#116644">192</span>.168.25.153:7004
   slots: (0 slots) master
   replicates 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3
M: 42cc9e25ebb19dda92591364c1df4b3a518b795b <span style="color:#116644">192</span>.168.25.153:7005
   slots: (0 slots) master
   replicates 8cd93a9a943b4ef851af6a03edd699a6061ace01
M: 8b1b11d509d29659c2831e7a9f6469c060dfcd39 <span style="color:#116644">192</span>.168.25.153:7006
   slots: (0 slots) master
   replicates 2935007902d83f20b1253d7f43dae32aab9744e6
[OK] All nodes agree about slots configuration.
>>> Check <span style="color:#770088">for</span> open slots...
>>> Check slots coverage...
[OK] All <span style="color:#116644">16384</span> slots covered.
[root@localhost redis-cluster]<span style="color:#aa5500"># </span></span></span>

2.2.2.4.测试

启动时使用-c参数来启动集群模式,命令如下:

<span style="background-color:#f8f8f8"><span style="color:#333333">./redis-cli <span style="color:#0000cc">-c</span> <span style="color:#0000cc">-p</span> <span style="color:#116644">7001</span></span></span>

2.2.2.5. redis cluster命令

<span style="background-color:#f8f8f8"><span style="color:#333333">cluster info   <span style="color:#aa5500">#打印集群的信息</span>
​
cluster nodes  <span style="color:#aa5500">#列出集群当前已知的所有节点(node),以及这些节点的相关信息  </span></span></span>

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值