redis

  1. 安装
    Redis是c语言开发的。
    安装redis需要c语言的编译环境。如果没有gcc需要在线安装。yum install gcc-c++
    安装步骤:
    第一步:redis的源码包上传到linux系统。
    第二步:解压缩redis。
    第三步:编译。进入redis源码目录。make
    第四步:安装。make install PREFIX=/usr/local/redis
    PREFIX参数指定redis的安装目录。一般软件安装到/usr目录下
    Nosql数据库
  2. 启动
    前端启动(占用终端):在redis的安装目录下直接启动redis-server
    [[email protected] bin]# ./redis-server
    dump.rdb数据文件
    后台启动:
    把/root/redis-3.0.0/redis.conf复制到/usr/local/redis/bin目录下
    redis
    redis
    启动并查看redis进程:
    redis
    关闭进程
    redis
    或关闭服务
    redis
  3. 使用
    连接redis客户端:
    redis
    默认连接localhost运行在6379端口的redis服务。
    改连上虚拟机端口:
    ctrl+c退出
    [[email protected] bin]#./redis-cli -h 10.6.12.144 -p 6379
    -h:连接的服务器的地址
    -p:服务的端口号
    redis
    关闭redis:[[email protected] bin]# ./redis-cli shutdown
    常用命令:
    判断服务健康状态:
    redis
    pong则正常

Redis五种数据类型(所有数据保存到内存)
(1)String:key-value(做缓存)
Redis中所有的数据都是字符串。命令不区分大小写,key是区分大小写的。Redis是单线程的。Redis中不适合保存内容大的数据。
get、set、(根据key查找hash值,不用遍历
redis
incr:加一(生成id)、Decr:减一
redis
显示所有key
redis
(2)Hash:key-fields-values(做缓存)
相当于一个key对于一个map,map中还有key-value
使用hash对key进行归类。
Hset:向hash中添加内容(创建hash1类型,里面有field1,值为1)
Hget:从hash中取内容
redis
hash1也为一个key
redis
获取key、value、key&value
redis
删除
redis
(3)List:有顺序可重复
向左边添加(最左边为6)lpush、向右边添加(最右边为e)rpush
redis
查看所有元素(起始、结束)lrange
redis
从左边取出元素lpop(取出后元素不在list中)、rpop从右边取元素

(4)Set:元素无顺序,不能重复
添加元素sadd
redis
删除srem
redis
还有集合运算命令,自学。
取差集sdiff
redis
取交集sinter
redis
取笛卡尔积sunion
redis
(5)SortedSet(zset):有顺序,不能重复(性能消耗高)
添加元素指定顺序(升序排列):zadd zset1 2 a 5 b 1 c 6 d
查看所有元素zrange zset1 0 -1
redis
删除zrem zset1 a
反序zrevrange zset1 0 -1
反序且取出分数 zrevrange zset1 0 -1 withscores

Key命令
设置key的过期时间。
Expire key second:设置key的过期时间 100s后过期
redis
Ttl key:查看key的有效期(正数为时间,-1为持久化,-2不存在)
Persist key:清除key的过期时间。Key持久化。

  1. Redis的持久化方案
    Redis的所有数据都是保存到内存中的。
    Rdb:快照形式,定期把内存中当前时刻的数据保存到磁盘。Redis默认支持的持久化方案。
    aof形式:append only file。把所有对redis数据库操作的命令,增删改操作的命令。保存到文件中。数据库恢复时把所有的命令执行一遍即可。
    在redis.conf配置文件中配置。
    Rdb:
    如果900秒内有一个key发生变化则保存一次快照文件
    redis
    Aof的配置:(默认不开启:会频繁访问磁盘,每秒保存一次)
    redis

5.redis集群
redis数据放内存,放满后放到虚拟内存(硬盘)
搭集群redis-cluster,节点相互连接,通过pingpong命令可以检查健康状态
只要连接到任意一个节点,就可以连接到集群(每个结点有备份机)
机制:投票容错
redis
架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.(集群至少三个节点)
(然后看有没有备份节点,没有则整个集群down)
(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 会根据节点数量大致均等的将哈希槽映射到不同的节点(集群中最多16384个节点)

集群搭建:
Redis集群中至少应该有三个节点。要保证集群的高可用,需要每个节点有一个备份机。
Redis集群至少需要6台服务器。
搭建伪分布式。可以使用一台虚拟机运行6个redis实例。需要修改redis的端口号7001-7006
集群搭建环境
1、复制6个redis实例
redis
删除节点中数据:
redis
更改配置文件中端口号
redis
把cluster-enabled yes前的注释去掉
redis
复制更改6个端口
redis
创建批处理,启动所有redis
redis
redis
更改权限(rw-当前用户权限,r–当前用户所属组权限,r–其他用户组权限)
redis
为当前用户加上可执行权限
redis
开启服务
redis
查看进程
redis
2、使用ruby脚本搭建集群。需要ruby的运行环境。
找到ruby脚本
redis
复制到集群目录下
redis
安装ruby脚本解释器
yum install ruby
yum install rubygems(包管理器)
3、安装ruby脚本运行使用的包。(类似jar包)
redis
使用ruby脚本搭建集群。
脚本文件名称 create --replicas有多少备份机 1每个结点一个 节点列表(6个则有三个节点三个备份机)
./redis-trib.rb create --replicas 1 10.6.12.144:7001 10.6.12.144:7002 10.6.12.144:7003 10.6.12.144:7004 10.6.12.144:7005 10.6.12.144:7006
redis
若为6台服务器上,只要在一台服务器上执行就行,每台服务器防火墙必须关闭
客户端连接到集群的某个节点:(-c:代表连接的是redis集群)
redis
每次添加均匀分不到不同的槽(即不同的节点)
redis
创建关闭集群的脚本:
[[email protected] 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
[[email protected] redis-cluster]# chmod u+x shutdow-all.sh

  1. Jedis连接
    redis
    (1)连接单机版:

    public void testJedis() throws Exception{
    //创建Jedis对象,参数:host、port
    Jedis jedis = new Jedis(“10.6.12.144”,6379);
    //直接使用jedis操作redis,所有jedis命令对应一个方法
    jedis.set(“test123”,“my first jedis test”);
    String string = jedis.get(“test123”);
    System.out.println(string);
    //关闭连接
    jedis.close();
    }

(2)连接单机版使用连接池:(每次操作完毕后关闭jedis对象,连接池回收资源)

public void testJedisPool() throws Exception {
        // 第一步:创建一个JedisPool对象。需要指定服务端的ip及端口。
        JedisPool jedisPool = new JedisPool("10.6.12.144", 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)连接集群版
第一步:使用JedisCluster对象。需要一个为Set类型的nodes参数。Redis节点的列表。
第二步:直接使用JedisCluster对象操作redis。在系统中单例存在。
第三步:打印结果
第四步:系统关闭前,关闭JedisCluster对象。

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

问题:Cannot resolve property ‘jedisPool’
解决: