资讯 小学 初中 高中 语言 会计职称 学历提升 法考 计算机考试 医护考试 建工考试 教育百科
栏目分类:
子分类:
返回
空麓网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
空麓网 > 计算机考试 > 软件开发 > 后端开发 > Java

springboot集成redis:整合单节点redis、发布订阅、哨兵-主备读写分离、集群

Java 更新时间: 发布时间: 计算机考试归档 最新发布

springboot集成redis:整合单节点redis、发布订阅、哨兵-主备读写分离、集群

目录

一、springboot整合单节点redis

1、添加依赖

2、添加配置application.yml配置

3、添加配置类

4、工具类

5、发布与订阅

5.1 添加配置对象

5.2 定义消息接收类

5.3 使用:在redisUtils工具类中添加发布消息的方法

5.4 发布消息

二、哨兵-主备读写分离

1.添加依赖

2、配置yml

3、添加配置文件

4、工具类同上

三、集群

1、添加Spring Boot和Redis依赖

2、修改配置文件

3、配置类(创建RedisTemplate实例)

4、工具类同上

5、使用postman调接口测试Redis集群


一、springboot整合单节点redis

1、添加依赖

    org.springframework.boot    spring-boot-starter-data-redis    2.7.0

2、添加配置application.yml配置

spring:  redis:    database: 0    host: 127.0.0.1    port: 6379    password:     lettuce:      pool:         # 连接池中的最大空闲连接 默认8              max-idle: 8        # 连接池中的最小空闲连接 默认0        min-idle: 0        # 连接池最大连接数 默认8 ,负数表示没有限制        max-active: 8        # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认-1        max-wait: -1    timeout: 30000

3、添加配置类

import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;import javax.annotation.Resource;@Configurationpublic class RedisConfiguration {    @Resource    private RedisConnectionFactory redisConnectionFactory;    @Bean    public RedisTemplate redisTemplate() {        RedisTemplate redisTemplate= new RedisTemplate<>();        // 可根据需要添加序列化器        // template.setDefaultSerializer(new Jackson2JsonRedisSerializer<>(Object.class));        // key采用String的序列化方式        redisTemplate.setKeySerializer(new StringRedisSerializer());        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());        redisTemplate.setHashKeySerializer(new StringRedisSerializer());        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());        redisTemplate.setConnectionFactory(redisConnectionFactory);        return redisTemplate;    }}

4、工具类

import com.fasterxml.jackson.core.type.TypeReference;import com.fasterxml.jackson.databind.ObjectMapper;import lombok.extern.log4j.Log4j2;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.ZSetOperations;import org.springframework.stereotype.Component;import org.springframework.util.CollectionUtils;import org.springframework.util.StringUtils;import java.io.IOException;import java.util.Collection;import java.util.List;import java.util.Map;import java.util.Set;import java.util.concurrent.TimeUnit;@Component@Log4j2public final class RedisUtil {    @Autowired    private RedisTemplate redisTemplate;    public Map obtainMap(String jsonString) {        ObjectMapper mapper = new ObjectMapper();        Map map = null;        try {            map = mapper.readValue(jsonString, new TypeReference>() {});        } catch (IOException e) {            e.printStackTrace();        }        return map;    }    // =============================common============================        public boolean expire(String key, long time) {        try {            if (time > 0) {                redisTemplate.expire(key, time, TimeUnit.SECONDS);            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public long getExpire(String key) {        return redisTemplate.getExpire(key, TimeUnit.SECONDS);    }        public boolean hasKey(String key) {        try {            return Boolean.TRUE.equals(redisTemplate.hasKey(key));        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        @SuppressWarnings("unchecked")    public void del(String... key) {        if (key != null && key.length > 0) {            if (key.length == 1) {                redisTemplate.delete(key[0]);            } else {                redisTemplate.delete((Collection) CollectionUtils.arrayToList(key));            }        }    }    // ============================String=============================        public Object get(String key) {        return key == null ? null : redisTemplate.opsForValue().get(key);    }        public boolean set(String key, Object value) {        try {            redisTemplate.opsForValue().set(key, value);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public boolean set(String key, Object value, long time) {        try {            if (time > 0) {                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);            } else {                set(key, value);            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public long incr(String key, long delta) {        if (delta < 0) {            throw new RuntimeException("递增因子必须大于0");        }        return redisTemplate.opsForValue().increment(key, delta);    }        public long decr(String key, long delta) {        if (delta < 0) {            throw new RuntimeException("递减因子必须大于0");        }        return redisTemplate.opsForValue().increment(key, -delta);    }    // ================================Map=================================        public Object hget(String key, String item) {        return redisTemplate.opsForHash().get(key, item);    }        public Map hmget(String key) {        return redisTemplate.opsForHash().entries(key);    }        public boolean hmset(String key, Map map) {        try {            redisTemplate.opsForHash().putAll(key, map);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public boolean hmset(String key, Map map, long time) {        try {            redisTemplate.opsForHash().putAll(key, map);            if (time > 0) {                expire(key, time);            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public boolean hset(String key, String item, Object value) {        try {            redisTemplate.opsForHash().put(key, item, value);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public boolean hset(String key, String item, Object value, long time) {        try {            redisTemplate.opsForHash().put(key, item, value);            if (time > 0) {                expire(key, time);            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public void hdel(String key, Object... item) {        redisTemplate.opsForHash().delete(key, item);    }        public boolean hHasKey(String key, String item) {        return redisTemplate.opsForHash().hasKey(key, item);    }        public double hincr(String key, String item, double by) {        return redisTemplate.opsForHash().increment(key, item, by);    }        public double hdecr(String key, String item, double by) {        return redisTemplate.opsForHash().increment(key, item, -by);    }    // ============================set=============================        public Set sGet(String key) {        try {            return redisTemplate.opsForSet().members(key);        } catch (Exception e) {            e.printStackTrace();            return null;        }    }        public boolean sHasKey(String key, Object value) {        try {            return redisTemplate.opsForSet().isMember(key, value);        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public long sSet(String key, Object... values) {        try {            return redisTemplate.opsForSet().add(key, values);        } catch (Exception e) {            e.printStackTrace();            return 0;        }    }        public long sSetAndTime(String key, long time, Object... values) {        try {            Long count = redisTemplate.opsForSet().add(key, values);            if (time > 0)                expire(key, time);            return count;        } catch (Exception e) {            e.printStackTrace();            return 0;        }    }        public long sGetSetSize(String key) {        try {            return redisTemplate.opsForSet().size(key);        } catch (Exception e) {            e.printStackTrace();            return 0;        }    }        public long setRemove(String key, Object... values) {        try {            Long count = redisTemplate.opsForSet().remove(key, values);            return count;        } catch (Exception e) {            e.printStackTrace();            return 0;        }    }    //==============================zset===================================        public Boolean zAdd(String key, Object value, double score) {        ZSetOperations zSetOperations = redisTemplate.opsForZSet();        return zSetOperations.add(key, value, score);    }        public Set zRange(String key, long start, long end) {        ZSetOperations zSetOperations = redisTemplate.opsForZSet();        return zSetOperations.range(key, start, end);    }        public Set zRangeByScore(String key, double minScore, double maxScore) {        ZSetOperations zSetOperations = redisTemplate.opsForZSet();        return zSetOperations.rangeByScore(key, minScore, maxScore);    }        public Long zSize(String key) {        ZSetOperations zSetOperations = redisTemplate.opsForZSet();        return zSetOperations.size(key);    }        public Double zScore(String key, Object value) {        ZSetOperations zSetOperations = redisTemplate.opsForZSet();        return zSetOperations.score(key, value);    }        public Long zRemove(String key, Object... values) {        ZSetOperations zSetOperations = redisTemplate.opsForZSet();        return zSetOperations.remove(key, values);    }    // ===============================list=================================        public List lGet(String key, long start, long end) {        try {            return redisTemplate.opsForList().range(key, start, end);        } catch (Exception e) {            e.printStackTrace();            return null;        }    }        public long lGetListSize(String key) {        try {            return redisTemplate.opsForList().size(key);        } catch (Exception e) {            e.printStackTrace();            return 0;        }    }        public Object lGetIndex(String key, long index) {        try {            return redisTemplate.opsForList().index(key, index);        } catch (Exception e) {            e.printStackTrace();            return null;        }    }        public boolean lSet(String key, Object value) {        try {            redisTemplate.opsForList().rightPush(key, value);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public boolean lSet(String key, Object value, long time) {        try {            redisTemplate.opsForList().rightPush(key, value);            if (time > 0)                expire(key, time);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public boolean lSet(String key, List value) {        try {            redisTemplate.opsForList().rightPushAll(key, value);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public boolean lSet(String key, List value, long time) {        try {            redisTemplate.opsForList().rightPushAll(key, value);            if (time > 0)                expire(key, time);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public boolean lUpdateIndex(String key, long index, Object value) {        try {            redisTemplate.opsForList().set(key, index, value);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }        public long lRemove(String key, long count, Object value) {        try {            Long remove = redisTemplate.opsForList().remove(key, count, value);            return remove;        } catch (Exception e) {            e.printStackTrace();            return 0;        }    }} 

5、发布与订阅

5.1 添加配置对象

    @Bean    RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory connectionFactory, MessageListenerAdapter messageListenerAdapter) {        RedisMessageListenerContainer container = new RedisMessageListenerContainer();        // 监听所有库的key过期事件        container.setConnectionFactory(connectionFactory);        // 可以添加多个 messageListener,配置不同的通道        container.addMessageListener(messageListenerAdapter, new PatternTopic("user"));        return container;    }        @Bean    MessageListenerAdapter listenerAdapter(RedisMessageListener receiver) {        return new MessageListenerAdapter(receiver, "onMessage");    }

其中的new PatternTopic("user")中的 user 就是通道名。

5.2 定义消息接收类

@Slf4j@Componentpublic class RedisMessageListener implements MessageListener {    @Override    public void onMessage(Message message, byte[] pattern) {        // 接收的topic        log.info("channel:" + new String(pattern));        // 消息的POJO        log.info("message:" + message.toString());    }}

5.3 使用:在redisUtils工具类中添加发布消息的方法

     public boolean convertAndSend(String channel, Object message) {        if (StringUtils.isEmpty(channel)) {            return false;        }        try {            redisTemplate.convertAndSend(channel, message);//            log.info("发送消息成功,channel:{},message:{}", channel, message);            return true;        } catch (Exception e) {//            log.info("发送消息失败,channel:{},message:{}", channel, message);            e.printStackTrace();        }        return false;    }

5.4 发布消息

public void get1(){   String message = "Hello World!";   // 发送消息   redisUtils.convertAndSend("user", message);}
只要发布消息到通道中,有监听器的存在,就会跑到消息接收类RedisMessageListener的onMessage方法中。

二、哨兵-主备读写分离

1.添加依赖

                    org.springframework.boot            spring-boot-starter-data-redis        

2、配置yml

spring:  redis:    client-type: LETTUCE    sentinel:      master: mymaster      nodes: 192.168.109.134:26380,192.168.109.134:26381,192.168.109.134:26382      password:

3、添加配置文件

@Configurationpublic class RedisConfig {    @Autowired    private Environment environmet;    @Bean("lettuceConnectionFactory")    public RedisConnectionFactory lettuceConnectionFactory() {        String master = environmet.getProperty("spring.redis.sentinel.master");        Set nodes = StringUtils.commaDelimitedListToSet(environmet.getProperty("spring.redis.sentinel.nodes"));        String password = environmet.getProperty("spring.redis.sentinel.password");        RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration(master, nodes);        sentinelConfig.setPassword(RedisPassword.of(password));        return new LettuceConnectionFactory(sentinelConfig);    }    @Bean    public RedisTemplate redisTemplate(@Qualifier("lettuceConnectionFactory") RedisConnectionFactory factory) {        RedisTemplate redisTemplate = new RedisTemplate();        redisTemplate.setConnectionFactory(factory);        return redisTemplate;    }    }

4、工具类同上


三、集群

1、添加Spring Boot和Redis依赖

    org.springframework.boot    spring-boot-starter-data-redis

2、修改配置文件

spring:  redis:    database: 0    cluster:      nodes: 192.168.177.128:6379,192.168.177.128:6380,192.168.177.128:6381,192.168.177.128:6382,192.168.177.128:6383,192.168.177.128:6384    password:    lettuce:      pool:        # 连接池中的最大空闲连接 默认8        max-idle: 8        # 连接池中的最小空闲连接 默认0        min-idle: 0        # 连接池最大连接数 默认8 ,负数表示没有限制        max-active: 8        # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认-1        max-wait: -1    timeout: 30000

3、配置类(创建RedisTemplate实例)

@Configurationpublic class RedisConfig {    @Autowired    private RedisConnectionFactory redisConnectionFactory;    @Bean    public RedisTemplate redisTemplate() {        RedisTemplate redisTemplate= new RedisTemplate<>();        // 可根据需要添加序列化器        // template.setDefaultSerializer(new Jackson2JsonRedisSerializer<>(Object.class));        // key采用String的序列化方式        redisTemplate.setKeySerializer(new StringRedisSerializer());        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());        redisTemplate.setHashKeySerializer(new StringRedisSerializer());        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());        redisTemplate.setConnectionFactory(redisConnectionFactory);        return template;    }}

4、工具类同上

5、使用postman调接口测试Redis集群

@Slf4j@RestControllerpublic class TestController {    @Resource    private RedisUtil redisUtil;    @GetMapping("/set")    public String set(){        redisUtil.set("key1", "value");        return "success";    }    @GetMapping("/get")    public String get(){        Object result = redisUtil.get("key1");        return result.toString();    }}
转载请注明:文章转载自 http://www.konglu.com/
免责声明:

我们致力于保护作者版权,注重分享,被刊用文章【springboot集成redis:整合单节点redis、发布订阅、哨兵-主备读写分离、集群】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2023 成都空麓科技有限公司

ICP备案号:蜀ICP备2023000828号-2