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

redis_logo

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


一、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的安装目录。

二、Redis的启动与基本操作

1.运行redis
在redis的安装目录下直接运行./redis-server就可以启动redis,但这是前端启动。如果我们想后台启动就需要:
①进入redis-3.0.0.tar.gz解压出来的文件夹,复制里面的redis.conf文件到安装目录下。然后将daemonize改为yes

redis_1

②执行./redis-server redis.conf运行redis。这样redis就后台运行了,我们可以使用ps aux|grep redis来查看redis的运行状态
redis_2

我们可以使用以下命令来进入操作redis:

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

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

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)。而在这五种类型中,我们最常用的是字符串类型,散列类型。这里简单介绍一下字符串类型和散列类型:
字符串类型string

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 ...]

散列类型hash

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

其他的数据类型就不详细介绍了,相关资料可以点击传送门

三、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_aof

四、Redis集群的搭建

1.Redis集群特点

Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis3.0之后版本支持redis-cluster集群,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。其redis-cluster架构图如下:


redis_cluster

其架构细节:
1、所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
2、节点的fail是通过集群中超过半数的节点检测失效时才生效。
3、客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
4、redis-cluster把所有的物理节点映射到[0-16383]slot上(不一定是平均分配),cluster 负责维护node<->slot<->value。
5、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集群
因为每一个节点都是互联互通的,所以我们不论连哪个节点都是可以的。

五、使用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/buildredis/
版权声明: 原创文章,有问题请评论中留言。非商业转载请注明作者及出处。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • 1 Redis介绍1.1 什么是NoSql为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方...
    克鲁德李阅读 5,268评论 0 36
  • 前言 Redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用。单节点的Red...
    Kevin_ZGJ阅读 11,667评论 19 133
  • RedisRedis命令参考网址:http://doc.redisfans.com/ Redis 简介Redis ...
    野柳阅读 1,115评论 0 9
  • 本文档翻译自 http://redis.io/topics/cluster-tutorial 。 本文档是 Red...
    会跳舞的机器人阅读 66,919评论 2 21
  • 一种生在土地里,一种生在田野里 地里的耳环花,是开在枝杈上的。它并非因为形似耳环而被我叫做这个名字,实际上,它的模...
    xixihahalelehe阅读 4,369评论 1 1