2021年11月07日 23:28
原创作品,转载时请务必以超链接形式标明文章原始出处,否则将追究法律责任。

公司一年一度的hackthon比武大赛又要开始了,去年大家还是很踊跃的报名,晚上挑灯夜战。不过公司提供了酒店住宿,伙食,零食等,让大家比的开心,吃的开心。发挥出水平,比出实力和成绩,看看大家去年的伙食

image.png

好吧,其实给我一碗葫芦头泡馍我就会参赛,白鹿仓葫芦头泡馍小炒,味道杠杠的。

image.png

光说吃了,我们还是进入正轨,今天我们来看一下spring boot访问redis集群实战过程。

首先我们还是先修改配置文件application.properties,增加redis配置项如下,在看这篇文章之前,最好看一下我的另一篇redis集群搭建的文章。如果是从开发机器访问,请使用阿里云外网IP,如果是和redis集群部署在一起,请使用docker IP:docker0 inet

spring.redis.cluster.nodes=阿里云外网IP:7001,阿里云外网IP:7002,阿里云外网IP:7003,阿里云外网IP:7004,阿里云外网IP:7005,阿里云外网IP:7006
spring.redis.cluster.password=密码
spring.redis.cluster.command-timeout= 10000
spring.redis.cluster.max-attempts=2
spring.redis.cluster.max-redirects=3
spring.redis.cluster.max-active=20
spring.redis.cluster.max-wait=-1
spring.redis.cluster.max-idle=8
spring.redis.cluster.min-idle=0

接着我们需要引入两个包,访问redis和json序列化的组件

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
</dependency>

接下来我们新建一个类叫RedisProperties

@Component
@ConfigurationProperties(prefix = "spring.redis.cluster")
public class RedisProperties {

    private String nodes;

    private String password;

    private Integer commandTimeout;

    private Integer maxAttempts;

    private Integer maxRedirects;

    private Integer maxActive;

    private Integer maxWait;

    private Integer maxIdle;

    private Integer minIdle;
    /*此处省略部分代码*/
}

我们再创建一个类叫RedisConfig,包含了JedisPoolConfig,JedisCluster

@Configuration
@ConditionalOnClass(JedisCluster.class)
public class RedisConfig {
    Logger logger = LoggerFactory.getLogger(RedisConfig.class);

    @Resource
    private RedisProperties redisProperties;

    /**
     * 配置 Redis 连接池信息
     */
    @Bean
    public JedisPoolConfig getJedisPoolConfig() {
        JedisPoolConfig jedisPoolConfig =new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(redisProperties.getMaxIdle());
        jedisPoolConfig.setMaxWaitMillis(redisProperties.getMaxWait());

        return jedisPoolConfig;
    }

    /*
     *返回单例JedisCluster
     */
    @Bean
    public JedisCluster getJedisCluster(){
        String[] serverArray = redisProperties.getNodes().split(",");
        Set<HostAndPort> nodes = new HashSet<HostAndPort>();
        for(String ipPort: serverArray){
            String[] ipPortPair = ipPort.split(":");
            nodes.add(new HostAndPort(ipPortPair[0].trim(),Integer.valueOf(ipPortPair[1].trim())));
        }

        return new JedisCluster(nodes,redisProperties.getCommandTimeout(),1000,1,redisProperties.getPassword(),getJedisPoolConfig());
    }
}

接下来再创建一个redis工具类

@Component
public class RedisUtility {
    private static final Logger LOGGER = LoggerFactory.getLogger(RedisUtility.class);

    @Autowired
    private JedisCluster jedisCluster;

    public void set(String key, String value) {
        jedisCluster.set(key, value);
        LOGGER.debug("setkey={},value={}", key, value);
    }

    public String get(String key) {
        String value = jedisCluster.get(key);
        LOGGER.debug("get cache key={},value={}",key, value);
        return value;
    }

    public void delete(String key) {
        jedisCluster.del(key);
        LOGGER.debug("delete key={}", key);
    }
}

工具类注入了JedisCluster实例,我们可以直接使用JedisCluster所提供的的操作redis的方法,ok接下来就是创建service和controller

@Service
public class RedisClusterTestService implements IRedisClusterTestService {
    @Autowired
    private RedisUtility redisUtility;

    private Logger logger= LoggerFactory.getLogger(RedisClusterTestService.class);
    public String getTechArticleByRedis(String key)
    {
        try {
            return redisUtility.get(key);
        } catch (Exception e) {
            logger.error(e.getMessage());
        }

        return "error";
    }

    public void createTechArticleByRedis(TechArticle techArticle)
    {
        Gson gson=new Gson();
        try {
            redisUtility.set("techarticle",gson.toJson(techArticle));
        } catch (Exception e) {
            logger.error(e.getMessage());
        }
    }
}

再看下controller

@RestController
@RequestMapping("redis")
@Api(tags = "Redis Test Interface")
public class redisClusterTestController {
    @Autowired
    IRedisClusterTestService redisClusterTestService;

    @GetMapping("retrieve")
    public String getTechArticle(@RequestParam("key") String key) {
        return redisClusterTestService.getTechArticleByRedis(key);
    }

    @PostMapping(value = "create", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public void createTechArticleBySolr(@RequestBody TechArticle techArticle) {
        redisClusterTestService.createTechArticleByRedis(techArticle);
    }
}

ok,至此我们的代码就全部写完了,接下来就是build docker image,把镜像跑起来,我们用端口8083把它跑起来

image.png

我们尝试创建一条数据试试

image.png

返回StatusCode =200

image.png

我们登录linux机器查看一下,用命令./redis-cli -c -h 172.26.233.95 -p 7003 先进入一个节点

image.png

看起来数据没问题,接下来我们再用api请求一下

image.png

看起来也没啥问题,ok今天到此为止,老夫要睡觉了。


发表评论
匿名  
用户评论
暂无评论