走进Redis:Redis的安装、使用以及集群的搭建

redis_logo

今天学习了淘淘商城中的redis的使用,在这里把它记录下来。html


1、Redis的安装

Redis的安装是很简单的,安装以前咱们须要c语言的编译环境。若是没有gcc须要在线安装。yum install gcc-c++前端

安装步骤:

第一步:redis的源码包上传到linux系统。
第二步:解压缩redis。tar -zxvf redis-3.0.0.tar.gz
第三步:编译。进入redis源码目录。make
第四步:安装。make install PREFIX=/usr/local/redis,PREFIX参数指定redis的安装目录。java

2、Redis的启动与基本操做

1.运行redis
在redis的安装目录下直接运行./redis-server就能够启动redis,但这是前端启动。若是咱们想后台启动就须要:
①进入redis-3.0.0.tar.gz解压出来的文件夹,复制里面的redis.conf文件到安装目录下。而后将daemonize改成yesredis_1
②执行./redis-server redis.conf运行redis。这样redis就后台运行了,咱们可使用ps aux|grep redis来查看redis的运行状态
redis_2
咱们可使用如下命令来进入操做redis:node

./redis-cli ##进入redis客户端
./redis-cli -h 192.168.72.121 -p 6379 ##链接指定ip和端口的redis服务器
./redis-cli shutdown ##关闭redis客户端

2.redis中的五种类型
先来看几个操做数据库的基本命令:linux

KEYS *                   ##得到当前数据库的全部键
EXISTS key [key ...]     ##判断键是否存在,返回个数,若是key有同样的也是叠加数
DEL key [key ...]        ##删除键,返回删除的个数
TYPE key                 ##获取减值的数据类型(string,hash,list,set,zset)
FLUSHALL                 ##清空全部数据库
Expire key second        ##设置key的过时时间
Ttl key                  ##查看key的有效期
Persist key              ##清除key的过时时间。Key持久化。

redis中全部的数据都是Key-value类型的,其中有五种主要数据类型:字符串类型(string),散列类型(hash),列表类型(list),集合类型(set),有序集合类型(zset)。而在这五种类型中,咱们最经常使用的是字符串类型,散列类型。这里简单介绍一下字符串类型和散列类型:
字符串类型stringc++

SET         ##赋值,用法: SET key value
GET         ##取值,用法: GET key
INCR        ##递增数字,仅仅对数字类型的键有用,至关于Java的i++运算,用法: INCR key
INCRBY      ##增长指定的数字,仅仅对数字类型的键有用,至关于Java的i+=3,用法:INCRBY key increment,意思是key自增increment,increment能够为负数,表示减小。
DECR        ##递减数字,仅仅对数字类型的键有用,至关于Java的i–,用法:DECR key
DECRBY      ##减小指定的数字,仅仅对数字类型的键有用,至关于Java的i-=3,用法:DECRBY key decrement,意思是key自减decrement,decrement能够为正数,表示增长。
INCRBYFLOAT ##增长指定浮点数,仅仅对数字类型的键有用,用法:INCRBYFLOAT key increment
APPEND      ##向尾部追加值,至关于Java中的”hello”.append(“ world”),用法:APPEND key value
STRLEN      ##获取字符串长度,用法:STRLEN key
MSET        ##同时设置多个key的值,用法:MSET key1 value1 [key2 value2 ...]
MGET        ##同时获取多个key的值,用法:MGET key1 [key2 ...]

散列类型hashredis

HSET        ##赋值,用法:HSET key field value
HMSET       ##一次赋值多个字段,用法:HMSET key field1 value1 [field2 values]
HGET        ##取值,用法:HSET key field
HMGET       ##一次取多个字段的值,用法:HMSET key field1 [field2]
HGETALL     ##一次取全部字段的值,用法:HGETALL key
HEXISTS     ##判断字段是否存在,用法:HEXISTS key field
HSETNX      ##当字段不存在时赋值,用法:HSETNX key field value
HINCRBY     ##增长数字,仅对数字类型的值有用,用法:HINCRBY key field increment
HDEL        ##删除字段,用法:HDEL key field
HKEYS       ##获取全部字段名,用法:HKEYS key
HVALS       ##获取全部字段值,用法:HVALS key
HLEN        ##获取字段数量,用法:HLEN key

其余的数据类型就不详细介绍了,相关资料能够点击传送门shell

3、Redis的持久化方案

Redis的全部数据都是保存到内存中的。
Rdb:快照形式,按期把内存中当前时刻的数据保存到磁盘。Redis默认支持的持久化方案,一直开启,不会被关闭。
redis_Rdb
经过上图咱们能够看到,dump.rdb会在如下状况保存一次。数据库

  • 900秒(15分钟)以内至少有1个KEY进行了改变
  • 300秒(5分钟)以内至少有10个KEY进行了改变
  • 60秒(1分钟)以内至少有10000个KEY进行了改变

aof形式:append only file。把全部对redis数据库操做的命令,增删改操做的命令。保存到文件中。数据库恢复时把全部的命令执行一遍便可。要想开启aof模式须要在redis.conf配置文件中将appendonly改成yes
redis_aofruby

4、Redis集群的搭建

1.Redis集群特色

Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis3.0以后版本支持redis-cluster集群,Redis-Cluster采用无中心结构,每一个节点保存数据和整个集群状态,每一个节点都和其余全部节点链接。其redis-cluster架构图以下:
redis_cluster
其架构细节:
一、全部的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
二、节点的fail是经过集群中超过半数的节点检测失效时才生效。
三、客户端与redis节点直连,不须要中间proxy层.客户端不须要链接集群全部节点,链接集群中任何一个可用节点便可。
四、redis-cluster把全部的物理节点映射到[0-16383]slot上(不必定是平均分配),cluster 负责维护node<->slot<->value。
五、Redis集群预分好16384个哈希槽,当须要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪一个槽中。

2.Redis集群环境搭建

Redis集群中至少应该有三个节点。要保证集群的高可用,须要每一个节点有一个备份机。
Redis集群至少须要6台服务器。因为条件限制,这里采用与淘淘商城相同的方式搭建伪分布式。在一台虚拟机运行6个redis实例。须要修改redis的端口号7001-7006。
第一步:建立6个redis实例,每一个实例运行在不一样的端口。须要修改redis.conf配置文件,将端口号修改为7001-7006。除此以外,还须要把cluster-enabled yes前的注释去掉。
第二步:启动每一个redis实例。这里咱们能够本身写一个shell脚本,这里给出个人也就是淘淘商城中所使用的脚本:

cd redis01
./redis-server redis.conf
cd ..
cd redis02
./redis-server redis.conf
cd ..
cd redis03
./redis-server redis.conf
cd ..
cd redis04
./redis-server redis.conf
cd ..
cd redis05
./redis-server redis.conf
cd ..
cd redis06
./redis-server redis.conf
cd ..

关闭集群的脚本也相似:

./redis-cli -p 7001 shutdown
./redis-cli -p 7002 shutdown
./redis-cli -p 7003 shutdown
./redis-cli -p 7004 shutdown
./redis-cli -p 7005 shutdown
./redis-cli -p 7006 shutdown

记得在运行脚本前要添加可执行(x)的权限:chmod u+x fileName.sh
第三步:使用ruby脚本搭建集群。
首先咱们须要安装ruby运行环境

yum install ruby
yum install rubygems

而后咱们须要安装ruby脚本运行使用的包,将这个文件放在集群文件根目录下,而后运行

gem install redis-3.0.0.gem

文件我上传在了CSDN
这时咱们就能够启动集群环境了,运行下面这条命令:

./redis-trib.rb create --replicas 1 192.168.72.121:7001 192.168.72.121:7002 192.168.72.121:7003 192.168.72.121:7004 192.168.72.121:7005  192.168.72.121:7006

从这条命令咱们能够看出使用6个节点来建立一个集群,集群中每一个主节点有1个从节点。运行过程当中输入一个yes就成功了。须要注意的是在真正搭建的时候必定要关闭防火墙。这时候咱们查看进程
第四步:链接Redis集群
由于每个节点都是互联互通的,因此咱们不论连哪一个节点都是能够的。

5、使用Java操做Redis

redis的客户端有不少,从官网中咱们能够看出来,不只支持的语言众多,并且不少语言有不止一种链接方式。
redis_client
这里咱们采用在JAVA中使用最普遍的Jedis做为实例。

1.链接单机版

@Test
    public void testJedis() throws Exception {
        // 第一步:建立一个Jedis对象。须要指定服务端的ip及端口。
        Jedis jedis = new Jedis("192.168.25.153", 6379);
        // 第二步:使用Jedis对象操做数据库,每一个redis命令对应一个方法。
        String result = jedis.get("hello");
        // 第三步:打印结果。
        System.out.println(result);
        // 第四步:关闭Jedis
        jedis.close();
    }

使用起来很简单,不过一般在链接单机版的时候咱们采用的是链接池的方式。

2.链接单机版使用链接池

@Test
    public void testJedisPool() throws Exception {
        // 第一步:建立一个JedisPool对象。须要指定服务端的ip及端口。
        JedisPool jedisPool = new JedisPool("192.168.25.153", 6379);
        // 第二步:从JedisPool中得到Jedis对象。
        Jedis jedis = jedisPool.getResource();
        // 第三步:使用Jedis操做redis服务器。
        jedis.set("jedis", "test");
        String result = jedis.get("jedis");
        System.out.println(result);
        // 第四步:操做完毕后关闭jedis对象,链接池回收资源。
        jedis.close();
        // 第五步:关闭JedisPool对象。
        jedisPool.close();
    }

链接集群的方式就又稍微不同了。

3.链接集群版

@Testjava
    public void testJedisCluster() throws Exception {
        // 第一步:使用JedisCluster对象。须要一个Set<HostAndPort>参数。Redis节点的列表。
        Set<HostAndPort> nodes = new HashSet<>();
        nodes.add(new HostAndPort("192.168.72.121", 7001));
        nodes.add(new HostAndPort("192.168.72.121", 7002));
        nodes.add(new HostAndPort("192.168.72.121", 7003));
        nodes.add(new HostAndPort("192.168.72.121", 7004));
        nodes.add(new HostAndPort("192.168.72.121", 7005));
        nodes.add(new HostAndPort("192.168.72.121", 7006));
        JedisCluster jedisCluster = new JedisCluster(nodes);
        // 第二步:直接使用JedisCluster对象操做redis。在系统中单例存在。
        jedisCluster.set("hello", "100");
        String result = jedisCluster.get("hello");
        // 第三步:打印结果
        System.out.println(result);
        // 第四步:系统关闭前,关闭JedisCluster对象。
        jedisCluster.close();
    }

本文做者: catalinaLi
本文连接: http://catalinali.top/2017/bu...版权声明: 原创文章,有问题请评论中留言。非商业转载请注明做者及出处。

相关文章
相关标签/搜索