Redis安装、Redis基本数据类型、Jedis、Redis集群搭建

目录

本文将从以下几个方面介绍redis的使用:
1. redis 安装、启动、停止
2. redis基本数据类型
3. jedis 连接redis
4. redis 集群搭建

1.redis 安装

Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

Linux 下安装

  • 点击此处,下载redis*

  • 下载完成后将使用SSH工具将redis-x.x.x.tar.gz上传到Linux服务器上

  • 复制redis压缩包到用户目录下:
    cp redis-x.x.x.tar.gz /usr/local/redis

  • redis的压缩包是源码级的需要编译才能使用,编译redis需要安装gcc,如果没有安装,可以使用以下命令进行安装:
    yum install gcc-c++

  • 安装好编译环境后,解压redis压缩包并进入redis-x.x.x文件夹中进行编译,注意此时该文件夹中应该包含一个Makefile文件

tar -xvf  redis-x.x.x.tar.gz
cd redis-x.x.x
make

  • make完后 redis-2.8.17目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli,两个程序位于安装目录 src 目录下,或者指定安装目录:
安装到指定目录,如 /usr/local/redis
 cd /usr/local/redis-3.0.0
 make PREFIX=/usr/local/redis install

  • redis.conf
    redis.conf是redis的配置文件,redis.conf在redis源码目录。
    注意修改port作为redis进程的端口,port默认6379

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

cd /usr/local/redis
mkdir conf
cp /usr/local/redis-3.0.0/redis.conf  /usr/local/redis/bin

  • 安装目录bin下的文件列表

    image
  • redis启动

前端模式启动:
直接运行bin/redis-server将以前端模式启动,前端模式启动的缺点是ssh命令窗口关闭则redis-server程序结束。
后端模式启动:
执行如下命令启动redis:

 cd /usr/local/redis
./bin/redis-server ./redis.conf

  • redis默认使用6379端口

  • redis停止
    强行终止Redis进程可能会导致redis持久化数据丢失。正确停止Redis的方式应该是向Redis发送SHUTDOWN命令,方法为:

cd /usr/local/redis
./bin/redis-cli shutdown

  • 连接redis服务端
    执行bin/redis-cli连接redis服务端.

2. redis基本数据类型

以下redis基本数据类型摘自菜鸟教程

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),>set(集合)及zset(sorted set:有序集合)。

String(字符串)
string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。

string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。

string类型是Redis最基本的数据类型,一个键最大能存储512MB。

实例
redis 127.0.0.1:6379> SET name "runoob"
OK
redis 127.0.0.1:6379> GET name
"runoob"
在以上实例中我们使用了 Redis 的 SET 和 GET 命令。键为 name,对应的值为 runoob。

注意:一个键最大能存储512MB。

Hash(哈希)
Redis hash 是一个键值(key=>value)对集合。

Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

实例
redis> HMSET myhash field1 "Hello" field2 "World"
"OK"
redis> HGET myhash field1
"Hello"
redis> HGET myhash field2
"World"
以上实例中 hash 数据类型存储了包含用户脚本信息的用户对象。 实例中我们使用了 Redis HMSET, HGETALL 命令,user:1 为键值。

每个 hash 可以存储 232 -1 键值对(40多亿)。
List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

实例
redis 127.0.0.1:6379> lpush runoob redis
(integer) 1
redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2
redis 127.0.0.1:6379> lpush runoob rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange runoob 0 10

  1. "rabitmq"
  2. "mongodb"
  3. "redis"
    redis 127.0.0.1:6379>
    列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。

Set(集合)
Redis的Set是string类型的无序集合。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

sadd 命令
添加一个 string 元素到 key 对应的 set 集合中,成功返回1,如果元素已经在集合中返回 0,如果 key 对应的 set 不存在则返回错误。

sadd key member
实例
redis 127.0.0.1:6379> sadd runoob redis
(integer) 1
redis 127.0.0.1:6379> sadd runoob mongodb
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers runoob

  1. "redis"
  2. "rabitmq"
  3. "mongodb"
    注意:以上实例中 rabitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。

集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。
zset(sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

zset的成员是唯一的,但分数(score)却可以重复。

zadd 命令
添加元素到集合,元素在集合中存在则更新对应score

zadd key score member
实例
redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> > ZRANGEBYSCORE runoob 0 1000

  1. "mongodb"
  2. "rabitmq"
  3. "redis"

3.jedis连接redis

3.1 jedis介绍

Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js、Go等。

在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。 在企业中用的最多的就是Jedis,下面我们就重点学习下Jedis。

Jedis同样也是托管在github上,地址:jedis

3.2 通过jedis连接redis单机

3.2.1 jar包

pom坐标:

 

  redis.clients

  jedis

  2.7.0

  

jar包如下:

image

3.2.2 单实例连接

通过创建单实例jedis对象连接redis服务,如下代码:

// 单实例连接redis
    @Test
    public void testJedisSingle() {

        Jedis jedis = new Jedis("192.168.101.3", 6379);
        jedis.set("name", "bar");
        String name = jedis.get("name");
        System.out.println(name);
        jedis.close();

    }

3.2.2.1连接超时解决

由于linux防火墙默认开启,redis的服务端口6379并不在开放规则之内,所有需要将此端口开放访问或者关闭防火墙。

关闭防火墙命令:sevice iptables stop

如果是修改防火墙规则,可以修改:/etc/sysconfig/iptables文件

3.2.3 使用连接池连接

通过单实例连接redis不能对redis连接进行共享,可以使用连接池对redis连接进行共享,提高资源利用率,使用jedisPool连接redis服务,如下代码:

@Test

  public  void pool() {

 JedisPoolConfig config = new JedisPoolConfig();

  //最大连接数

 config.setMaxTotal(30);

  //最大连接空闲数

 config.setMaxIdle(2);

 JedisPool pool = new JedisPool(config, "192.168.101.3", 6379);

 Jedis jedis = null;

  try {

 jedis = pool.getResource();

 jedis.set("name", "lisi");

 String name = jedis.get("name");

 System.out.println(name);

 }catch(Exception ex){

 ex.printStackTrace();

3.2.4 jedis与spring整合

配置spring配置文件applicationContext.xml







  

  

  

  

  

  

  

测试代码:

private ApplicationContext applicationContext;

    @Before
    public void init() {
        applicationContext = new ClassPathXmlApplicationContext(
                "classpath:applicationContext.xml");
    }

    @Test
    public void testJedisPool() {
    JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool");
            try  {
            Jedis jedis = pool.getResource();

            jedis.set("name", "lisi");
            String name = jedis.get("name");
            System.out.println(name);
        }catch(Exception ex){
            ex.printStackTrace();
        }finally{
            if(jedis != null){
                //关闭连接
                jedis.close();
            }
        }
    }

4. redis 集群搭建

4.1. redis-cluster架构图

image

redis-cluster投票:容错

image

4.2架构细节:

(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点

image

4.3 Redis集群的搭建

Redis集群中至少应该有三个节点。要保证集群的高可用,需要每个节点有一个备份机。Redis集群至少需要6台服务器。搭建伪分布式。可以使用一台虚拟机运行6个redis实例。需要修改redis的端口号7001-7006

4.3.1. 集群搭建环境

(1)、使用ruby脚本搭建集群。需要ruby的运行环境。安装ruby

yum install ruby
yum install rubygems

(2)、安装ruby脚本运行使用的包。

 gem install redis-3.0.0.gem

4.3.2. 搭建步骤

需要6台redis服务器。搭建伪分布式。需要6个redis实例。需要运行在不同的端口7001-7006

  • 第一步:创建6个redis实例,每个实例运行在不同的端口。需要修改redis.conf配置文件。配置文件中还需要把cluster-enabled yes前的注释去掉。
image
  • 第二步:启动每个redis实例。

  • 第三步:使用ruby脚本搭建集群。

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

  • 创建关闭集群的脚本:
[root@localhost redis-cluster]# vim shutdow-all.sh
redis01/redis-cli -p 7001 shutdown
redis01/redis-cli -p 7002 shutdown
redis01/redis-cli -p 7003 shutdown
redis01/redis-cli -p 7004 shutdown
redis01/redis-cli -p 7005 shutdown
redis01/redis-cli -p 7006 shutdown
[root@localhost redis-cluster]# chmod 744 shutdow-all.sh

4.3.3 集群的使用方法

Redis-cli连接集群

[root@localhost redis-cluster]# redis01/redis-cli -p 7002 -c
-c:代表连接的是redis集群

4.3.4Jedis 连接redis集群

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

作者:泛空秋慕
链接:https://www.jianshu.com/p/5af1508eb575
来源:
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(Redis安装、Redis基本数据类型、Jedis、Redis集群搭建)