maven依赖复制到pom.xm
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot</artifactId> <version>2.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <version>2.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> <optional>true</optional> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.75</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>1.4.1.RELEASE</version> </dependency> </dependencies>
配置application.yml
spring: redis: pubChannel: pub_channel database: 1 host: 127.0.0.1 port: 6379 timeout: 6000 lettuce: pool: max-active: 8 max-idle: 8 min-idle: 1 max-wait: -1ms server: port: 8025
RedisConfig
@Configuration public class RedisConfig extends MessageListenerAdapter { @Value("${spring.redis.pubChannel}") private String PUB_CHANNEL; @Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) { RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); // 可以添加多个 messageListener,配置不同的交换机 container.addMessageListener(listenerAdapter, new PatternTopic(PUB_CHANNEL)); return container; } @Bean MessageListenerAdapter listenerAdapter(RedisReceiver receiver) { return new MessageListenerAdapter(receiver, "onMessage"); } }
CacheService
@Slf4j @Component @Service public class CacheService implements RedisService{ @Resource private StringRedisTemplate stringRedisTemplate; @Value("${spring.redis.pubChannel}") private String SUB_CHANNEL; private final String DEFAULT_KEY_PREFIX = ""; private final int EXPIRE_TIME = 1; private final TimeUnit EXPIRE_TIME_TYPE = TimeUnit.DAYS; /** * 数据缓存至redis * * @param key * @param value * @return */ public <K, V> void add(K key, V value) { try { if (value != null) { stringRedisTemplate .opsForValue() .set(DEFAULT_KEY_PREFIX + key, JSON.toJSONString(value)); } } catch (Exception e) { log.error(e.getMessage(), e); throw new RuntimeException("数据缓存至redis失败"); } } /** * 数据缓存至redis并设置过期时间 * * @param key * @param value * @return */ public <K, V> void add(K key, V value, long timeout, TimeUnit unit) { try { if (value != null) { stringRedisTemplate .opsForValue() .set(DEFAULT_KEY_PREFIX + key, JSON.toJSONString(value), timeout, unit); } } catch (Exception e) { log.error(e.getMessage(), e); throw new RuntimeException("数据缓存至redis失败"); } } /** * 写入 hash-set,已经是key-value的键值,不能再写入为hash-set * * @param key must not be {@literal null}. * @param subKey must not be {@literal null}. * @param value 写入的值 */ public <K, SK, V> void addHashCache(K key, SK subKey, V value) { stringRedisTemplate.opsForHash().put(DEFAULT_KEY_PREFIX + key, subKey, value); } /** * 写入 hash-set,并设置过期时间 * * @param key must not be {@literal null}. * @param subKey must not be {@literal null}. * @param value 写入的值 */ public <K, SK, V> void addHashCache(K key, SK subKey, V value, long timeout, TimeUnit unit) { stringRedisTemplate.opsForHash().put(DEFAULT_KEY_PREFIX + key, subKey, value); stringRedisTemplate.expire(DEFAULT_KEY_PREFIX + key, timeout, unit); } /** * 获取 hash-setvalue * * @param key must not be {@literal null}. * @param subKey must not be {@literal null}. */ public <K, SK> Object getHashCache(K key, SK subKey) { return stringRedisTemplate.opsForHash().get(DEFAULT_KEY_PREFIX + key, subKey); } /** * 从redis中获取缓存数据,转成对象 * * @param key must not be {@literal null}. * @param clazz 对象类型 * @return */ public <K, V> V getObject(K key, Class<V> clazz) { String value = this.get(key); V result = null; if (!StringUtils.isEmpty(value)) { result = JSONObject.parseObject(value, clazz); } return result; } /** * 从redis中获取缓存数据,转成list * * @param key must not be {@literal null}. * @param clazz 对象类型 * @return */ public <K, V> List<V> getList(K key, Class<V> clazz) { String value = this.get(key); List<V> result = Collections.emptyList(); if (!StringUtils.isEmpty(value)) { result = JSONArray.parseArray(value, clazz); } return result; } /** * 功能描述:Get the value of {@code key}. * * @param key must not be {@literal null}. * @return java.lang.String * @date 2021/9/19 **/ public <K> String get(K key) { String value; try { value = stringRedisTemplate.opsForValue().get(DEFAULT_KEY_PREFIX + key); } catch (Exception e) { log.error(e.getMessage(), e); throw new RuntimeException("从redis缓存中获取缓存数据失败"); } return value; } /** * 删除key */ public void delete(String key) { stringRedisTemplate.delete(key); } /** * 批量删除key */ public void delete(Collection<String> keys) { stringRedisTemplate.delete(keys); } /** * 序列化key */ public byte[] dump(String key) { return stringRedisTemplate.dump(key); } /** * 是否存在key */ public Boolean hasKey(String key) { return stringRedisTemplate.hasKey(key); } /** * 设置过期时间 */ public Boolean expire(String key, long timeout, TimeUnit unit) { return stringRedisTemplate.expire(key, timeout, unit); } /** * 设置过期时间 */ public Boolean expireAt(String key, Date date) { return stringRedisTemplate.expireAt(key, date); } /** * 移除 key 的过期时间,key 将持久保持 */ public Boolean persist(String key) { return stringRedisTemplate.persist(key); } /** * 返回 key 的剩余的过期时间 */ public Long getExpire(String key, TimeUnit unit) { return stringRedisTemplate.getExpire(key, unit); } /** * 返回 key 的剩余的过期时间 */ public Long getExpire(String key) { return stringRedisTemplate.getExpire(key); } /** * 发布信息 */ public boolean sendMessage(String message) { try{ stringRedisTemplate.convertAndSend(SUB_CHANNEL,message); return true; }catch (Exception e){ log.error(e.getMessage()); return false; } } }
redis监听
@Component public class RedisReceiver implements MessageListener { /** * redis监听 */ @Override public void onMessage(Message message, byte[] bytes) { try { byte[] body = message.getBody(); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); String msg = stringRedisSerializer.deserialize(body); System.out.println("redis监听message:" + msg); } catch (Exception e) { e.printStackTrace(); } } }