我在工作中遇到的redis集群使用

写次随笔,给自己工作学习中记录一个笔记

废话不多说,直接上代码:

功能:将相关信息存到redis中,并设置过期时间,如果redis中有,从redis获取,如果没有,从mysql中获取。redis配置了三台集群环境

1:首先,是配置文件中相关配置信息,在java代码中,相关配置直接从配置文件中读取:

#redis配置
MaxActive=10
#最大空闲连接数
MaxIdle=5
#最小空闲连接数
MinIdle=3
#最大连接数
MaxTotal=8
#jedis集群地址A
JedisA.host=192.168.0.191
portA=6300
#jedis集群地址B
JedisB.host=192.168.0.192
portB=6300
#jedis集群地址C
JedisC.host=192.168.0.193
portC=6300
#是否先进先出
Lifo=true
#逐出连接的最小空闲时间,默认10分钟
TimeMillis=600000
#用户信息过期时间为1天
userPastTime=86400
#分割时间设置过期为5分钟
LoanPastTime=300
#产品过期时间
ProductPastTime=60

2:在项目启动的时候,对redis进行初始化:

 //redis初始化,JedisPoolConfig为jedis的参数对象,redis在java里封装的对象时redis,参数信息从配置文件读取
 JedisPoolConfig config = new JedisPoolConfig(); config.setMaxIdle(Integer.parseInt(BusinessService.getInstance().getParameter("MaxIdle"))); config.setMaxTotal(Integer.parseInt(BusinessService.getInstance().getParameter("MaxTotal"))); config.setMinIdle(Integer.parseInt(BusinessService.getInstance().getParameter("MinIdle"))); config.setLifo(Boolean.parseBoolean((BusinessService.getInstance().getParameter("Lifo")))); config.setMinEvictableIdleTimeMillis(Long.parseLong((BusinessService.getInstance().getParameter("TimeMillis"))));

//RedisUtils(config)为工具类,在初始化的时候调用一次,对jedis对象进行初始化
 new RedisUtils(config);

3:RedisUtils类

public RedisUtils(JedisPoolConfig config)
    {

        synchronized(this)
        {
            if(jedisCluster==null)
            {
                Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
                jedisClusterNodes.add(new HostAndPort(BusinessService.getInstance().getParameter("JedisA.host"), Integer.parseInt(BusinessService.getInstance().getParameter("portA"))));
                jedisClusterNodes.add(new HostAndPort(BusinessService.getInstance().getParameter("JedisB.host"), Integer.parseInt(BusinessService.getInstance().getParameter("portB"))));
                jedisClusterNodes.add(new HostAndPort(BusinessService.getInstance().getParameter("JedisC.host"), Integer.parseInt(BusinessService.getInstance().getParameter("portC"))));
                jedisCluster = new JedisCluster(jedisClusterNodes,2000,2000,config);
            }
        }

    }

4:jedisCluster存值

/**
     *
     * @author weishaolong
     * @date 2016-3-29 下午5:13:10 输入参数
     * @param key key
     * @param seconds 有效时间 单位秒
     * @param strValue 值
     */
    public static void setJedis(String key,int seconds,String strValue)
    {
        try
        {
            jedisCluster.setex(key,seconds,strValue);

        }
        catch(Exception e)
        {
            log.error("Redis存值异常!By:RedisUtils.setJedis"+e.toString());
        }

    }

5:jedisCluster取值

public static String getJedisValue(String key)
    {
        String strJedisVal = null;
        try
        {
            strJedisVal=jedisCluster.get(key);
            return strJedisVal;
        }
        catch(Exception e)
        {
            log.error("Redis取值异常!By:RedisUtils.getJedisValue"+e.toString());
        }
        return strJedisVal;

    }

6:这样,使用jedisCluster就可以进行使用了,java业务代码直接RedisUtils.getJedisValue("");就可以获取值了

7:其中集群还可以使用ShardJedisPool,但是ShardJedisPool我一直报

jedis.exceptions.JedisMovedDataException: MOVED 632 192.168.0.192:6301,怎么解决,暂时我还没找到解决办法,只知道把193redis服务器改成191或者192就可以解决

初始化:

        List<JedisShardInfo> jdsInfoList =new ArrayList<JedisShardInfo>(3);
         JedisShardInfo infoA = new JedisShardInfo(BusinessService.getInstance().getParameter("JedisA.host"),
                         Integer.parseInt(BusinessService.getInstance().getParameter("portA")));
         JedisShardInfo infoB = new JedisShardInfo(BusinessService.getInstance().getParameter("JedisB.host"),
                         Integer.parseInt(BusinessService.getInstance().getParameter("portB")));
         JedisShardInfo infoC = new JedisShardInfo(BusinessService.getInstance().getParameter("JedisC.host"),
                         Integer.parseInt(BusinessService.getInstance().getParameter("portC")));
         jdsInfoList.add(infoA);
         jdsInfoList.add(infoB);
         jdsInfoList.add(infoC);
         ShardJedisPool =new ShardedJedisPool(config, jdsInfoList);

存值:

public static void setJedis(String key,int seconds,String strValue)
    {
        try
        {
            ShardedJedis shardJedis=ShardJedisPool.getResource();
            shardJedis.setex(key,seconds,strValue);
            ShardJedisPool.returnResourceObject(shardJedis);

        }
        catch(Exception e)
        {
            log.error("Redis存值异常!By:RedisUtils.setJedis"+e.toString());
        }

    }

取值:

public static String getJedisValue(String key)
    {
        String strJedisVal = null;
        try
        {
            ShardedJedis shardJedis=ShardJedisPool.getResource();
            strJedisVal=shardJedis.get(key);
            ShardJedisPool.returnResourceObject(shardJedis);
            return strJedisVal;
        }
        catch(Exception e)
        {
            log.error("Redis取值异常!By:RedisUtils.getJedisValue"+e.toString());
        }
        return strJedisVal;

    }

最后,要注意一点:ShardJedisPool是一个连接池,和mysql的连接池是很类似的,每次从池子中获取值之后,要记得把这个连接返还给池子

ShardJedisPool.returnResourceObject(redis);

项目停止的时候,关闭连接池

public static void closeJedisPool()
    {
        if(ShardJedisPool!=null){
            ShardJedisPool.destroy();
        }
    }

好了,主要是代码层次的讲解,原理方面没怎么说,后期进行补充....

时间: 2024-10-22 02:59:21

我在工作中遇到的redis集群使用的相关文章

架构设计:系统存储(17)——Redis集群方案:高可用

1.概述 从本篇文章开始,我们将向读者介绍几种Redis的高可用高负载集群方案.除了介绍Redis 3.X版本中推荐的原生集群方案外,还会介绍使用第三方组件搭建Redis集群的方法.本文我们会首先介绍Redis的高可用集群方案. 2.Redis高可用方案 Redis提供的高可用方案和我们介绍过的很多软件的高可用方案类似,都是使用主从节点的思路.即是有一个Master节点在平时提供服务,另外一个或多个Slave节点在平时不提供服务(或只提供数据读取服务).当Master节点由于某些原因停止服务后,

SpringBoot系列教程之Redis集群环境配置

之前介绍的几篇redis的博文都是基于单机的redis基础上进行演示说明的,然而在实际的生产环境中,使用redis集群的可能性应该是大于单机版的redis的,那么集群的redis如何操作呢?它的配置和单机的有什么区别,又有什么需要注意的呢? 本篇将主要介绍SpringBoot项目整合redis集群,并针对这个过程中出现的问题进行说明,并给出相应的解决方案 I. 环境相关 首先需要安装redis集群环境,可以参考博文:redis-集群搭建手册 然后初始化springboot项目,对应的pom结构如

redis集群安装2

概要:本文主要介绍如何在Centos7中单机搭建redis集群三主三从,按照本文绝对可以实现该需求,至于先搭建单机版主要为了方便理解redis集群,为下一步开发或生产上redis集群做铺垫.同时本人在搭建过程中也做了点总结,希望对没有接触过redis集群或刚接触redis集群的小伙伴有些许帮助,同时也建议在查看本文前能先了解redis单节点的部署.下面进入正题. 1.使用yum安装所需要的工具 yum -y install wget vim tcl gcc make 2.下载redis并解压 c

7.redis 集群模式的工作原理能说一下么?在集群模式下,redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗?

作者:中华石杉 面试题 redis 集群模式的工作原理能说一下么?在集群模式下,redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗? 面试官心理分析 在前几年,redis 如果要搞几个节点,每个节点存储一部分的数据,得借助一些中间件来实现,比如说有 codis,或者 twemproxy,都有.有一些 redis 中间件,你读写 redis 中间件,redis 中间件负责将你的数据分布式存储在多台机器上的 redis 实例中. 这两年,redis 不断在发展

Linux中的redis集群搭建

看在多的书,若果不实践一次,我觉得效果并不好,只有自己完完整整的做一次! 所以今天打算搭建一个redis集群来练练手~! 1.Linux CentOS  , redis-3.2.4 版本 2.配置环境  linux 虚拟机2台  . 3.每个linux系统配置3个节点, 3主3从 OK,开始搭建,具体步骤我会截图,完完整整的将所有步骤写下来! 1.创建一个文件夹存放下载的redis安装包 2.进入文件进行下载 3.下载后的包进行解压 tar -zxvf redis-3.2.4 4.因为安装red

Liunx下Redis集群的安装与测试,以及项目中的应用(redis中对象和集合的储存)。

Liunx下Redis集群的安装与测试,以及项目中的应用. 首先准备ruby和redis接口: redis-3.0.0.gem和 去https://redis.io/下载 1.使用ruby脚本搭建集群.需要ruby的运行环境. 安装ruby yum install ruby yum install rubygems 1.1安装ruby脚本运行使用的包. [[email protected] ~]# gem install redis-3.0.0.gem Successfully installe

高性能网站架构设计之缓存篇(6)- Redis 集群(中)

昨天晚上钓鱼回来,大发神经,写了篇概括程序员生活现状的文章,没想到招来众多人的口诛笔伐,大有上升到政治层面的趋势. 我也许不会再发表任何冲击心灵的文章,我希望给大家带来更多的正能量,所以那篇文章已被我删除. 我的本意只是想让各位看过文章之后能冷静地思考自己的程序人生,不管是对是错,人都有选择的权力,走好自己的路. 我没有你们想象中那么悲观,我也在不懈的努力,哪怕一时的跌倒,我也要重新站起. 生活无时无刻不是压力,让我们背起行囊,迈出踏实的一步,走起! 我们继续我们的 redis 缓存之旅. 前一

在Redis集群中使用pipeline批量插入

由于项目中需要使用批量插入功能, 所以在网上查找到了Redis 批量插入可以使用pipeline来高效的插入, 示例代码如下: String key = "key"; Jedis jedis = new Jedis("xx.xx.xx.xx"); Pipeline p = jedis.pipelined(); List<String> myData = .... //要插入的数据列表 for(String data: myData){ p.hset(ke

Redis集群中,是选择奇数节点还是偶数节点?(理论)

我们来通过一组组示例进行分析: 3节点环境:1个master.2个slave 存储空间:最大等于1个节点的容量.(如果是2个master的话,那么数据会丢失一部分) 冗余性:允许1个节点故障. 4节点环境:2个master.2个slave 存储空间:2个节点的容量. 冗余性:允许1个节点故障.(集群中,半数以上节点认为故障,才会选举.) 5节点环境:2个master.3个slave 存储空间:2个节点的容量. 冗余性:允许2个节点故障. 6节点环境:3个master.3个slave 存储空间:3