redis & redis-cluster

redis是一款高速缓存非关系型数据库,为什么说他是”高速“的,应为其读写都在内存中,这也是非关系行数据库的一大特点,Redis是以key-value的形式存储的。下面将从以下几点来介绍redis。(redis的安装及启动请自行解决...)

  1. redis数据结构
  2. redis数据持久化
  3. redis cluster集群的实现方案

8.最后可以安装redis可视化工具--brew install rdm


一:redis支持的数据结构

  1. 字符串(Strings)
    设置:set key value 获取:get key
  2. 列表(List)
    设置:lpush key value1 / lpush key value2 获取:lrange 0 1
  3. 集合(Sets)
    设置:sadd key value1 / sadd key value2 获取:sismember key
  4. 集合(Sorted Sets)
    设置:zadd key value1 / zadd key value2 获取:sismember key
  5. 哈希(Hashes)
    hmset key:001 cou1 value1 cou2 value2 获取:hgetall key:001

具体大家可以按照上面的格式去尝试新建各类数据类型。

二:redis数据持久化
Redis虽然是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题Redis提供了两种持久化的方案,将内存中的数据保存到磁盘中,避免数据的丢失。

  1. RDB持久化
    RDB是默认持久化方式,其规定以下几种时间段内去触发持久化操作

    # 以下配置表示的条件:
    # 服务器在900秒之内被修改了1次
    save 900 1
    # 服务器在300秒之内被修改了10次
    save 300 10
    # 服务器在60秒之内被修改了10000次
    save 60 10000

    该方式有个致命的缺点——RDB持久化相当于备份数据库状态,那么如果数据文件很大的化就会导致服务崩溃等一系列问题。

  2. AOF持久化
    AOF持久化(Append-Only-File),与RDB持久化不同,AOF持久化是通过保存Redis服务器锁执行的写状态来记录数据库的。具体来说,RDB持久化相当于备份数据库状态,而AOF持久化是备份数据库接收到的命令,所有被写入AOF的命令都是以redis的协议格式来保存的。以下为开启AOF持久化的配置方式:

    #AOF 和 RDB 持久化方式可以同时启动并且无冲突。  
    #如果AOF开启,启动redis时会加载aof文件,这些文件能够提供更好的保证。 
    appendonly yes
    
    # 只增文件的文件名称。(默认是appendonly.aof)  
    # appendfilename appendonly.aof 
    #redis支持三种不同的写入方式:  
    #  
    # no:不调用,之等待操作系统来清空缓冲区当操作系统要输出数据时。很快。  
    # always: 每次更新数据都写入仅增日志文件。慢,但是最安全。
    # everysec: 每秒调用一次。折中。
    appendfsync everysec  
    
    # 设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入.官方文档建议如果你有特殊的情况可以配置为'yes'。但是配置为'no'是最为安全的选择。
    no-appendfsync-on-rewrite no  
    
    # 自动重写只增文件。  
    # redis可以自动盲从的调用‘BGREWRITEAOF’来重写日志文件,如果日志文件增长了指定的百分比。  
    # 当前AOF文件大小是上次日志重写得到AOF文件大小的二倍时,自动启动新的日志重写过程。
    auto-aof-rewrite-percentage 100  
    # 当前AOF文件启动新的日志重写过程的最小值,避免刚刚启动Reids时由于文件尺寸较小导致频繁的重写。
    auto-aof-rewrite-min-size 64mb

    其实我么可以查看dump.rdb文件和appendonly.aof文件就会很明显发现他们各自的存储数据的方式。还有一点就是所有的配置都是在redis.conf文件中。服务每次重启的时候都会首先从持久化文件中去拉取数据。两个持久化文件路径大家可查看redis.conf中的dir配置项获得,我本地的如下:

    redis & redis-cluster_第1张图片

自行尝试:先利用RDB的方式添加一些key-value,在开启aof方式,观察dump.rdb文件和appendonly.aof文件大小的变化。

三:redis cluster集群的实现方案
redis在年初发布了3.0.0,官方支持了redis cluster,也就是集群。redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。

Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。必须要3个以后的主节点,否则在创建集群时会失败。

1.开启集群配置

[root@web3 redis-3.0.5]# vi redis.conf
#修改以下地方
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

2.我们这边模拟6台服务(3M+3S)

[root@web3 redis-3.0.5]# mkdir -p /usr/local/cluster-test
[root@web3 redis-3.0.5]# cd /usr/local/cluster-test/
[root@web3 cluster-test]# mkdir 7000
[root@web3 cluster-test]# mkdir 7001
[root@web3 cluster-test]# mkdir 7002
[root@web3 cluster-test]# mkdir 7003
[root@web3 cluster-test]# mkdir 7004
[root@web3 cluster-test]# mkdir 7005

3.把redis.conf文件拷贝6份并修改相应的端口号最后CP到7000-7005文件夹下去,再将对行的服务文件redis-serverCP到7000-7005文件夹下去

4.启动这这6个服务

[root@web3 cluster-test]# cd /usr/local/cluster-test/7000/
[root@web3 7000]# redis-server redis.conf
[root@web3 7000]# cd ../7001
[root@web3 7001]# redis-server redis.conf
[root@web3 7001]# cd ../7002
[root@web3 7002]# redis-server redis.conf
[root@web3 7002]# cd ../7003
[root@web3 7003]# redis-server redis.conf
[root@web3 7003]# cd ../7004
[root@web3 7004]# redis-server redis.conf
[root@web3 7004]# cd ../7005
[root@web3 7005]# redis-server redis.conf
[root@web3 7005]#

5.查看6个服务的启动进程情况

[root@web3 7005]# ps -ef|grep redis
root     11380     1  0 07:37 ?        00:00:00 redis-server *:7000 [cluster]
root     11384     1  0 07:37 ?        00:00:00 redis-server *:7001 [cluster]
root     11388     1  0 07:37 ?        00:00:00 redis-server *:7002 [cluster]
root     11392     1  0 07:37 ?        00:00:00 redis-server *:7003 [cluster]
root     11396     1  0 07:37 ?        00:00:00 redis-server *:7004 [cluster]
root     11400     1  0 07:37 ?        00:00:00 redis-server *:7005 [cluster]
root     11404  8259  0 07:38 pts/0    00:00:00 grep redis

6.将6个服务连在一起构招成集群

redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

7.如果输出以下信息恭喜你集群搭建成功了

[root@web3 7000]# redis-trib.rb check 127.0.0.1:7000
Connecting to node 127.0.0.1:7000: OK
Connecting to node 127.0.0.1:7002: OK
Connecting to node 127.0.0.1:7003: OK
Connecting to node 127.0.0.1:7005: OK
Connecting to node 127.0.0.1:7001: OK
Connecting to node 127.0.0.1:7004: OK
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: dfa0754c7854a874a6ebd2613b86140ad97701fc 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: d2237fdcfbba672de766b913d1186cebcb6e1761 127.0.0.1:7003
   slots: (0 slots) slave
   replicates 3707debcbe7be66d4a1968eaf3a5ffaf4308efa4
S: 30858dbf483b61b9838d5c1f853a60beaa4e7afd 127.0.0.1:7005
   slots: (0 slots) slave
   replicates dfa0754c7854a874a6ebd2613b86140ad97701fc
M: cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: 4b4aef8b48c427a3c903518339d53b6447c58b93 127.0.0.1:7004
   slots: (0 slots) slave
   replicates cb5c04b6160c3b7e18cad5d49d8e2987b27e0d6c
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

8.最后可以安装redis可视化工具--brew install rdm

redis & redis-cluster_第2张图片

你可能感兴趣的:(redis,nosql)