当前位置: 首页 > news >正文

Redis操作--RedisTemplate(二)StringRedisTemplate

一、介绍

1、简介

由于存储在 Redis 中的 key 和 value 通常是很常见的 String 类型,Redis模块提供了 RedisConnection 和 RedisTemplate 的扩展,分是 StringRedisConnection 和 StringRedisTemplate,作为字符串操作的解决方案。

通过源码可以看见对于Key、Value、HashKey、HashValue都是进行String类型的序列化。

因此对于一些复杂类型,如对象在StringRedisTemplate的时候往往需要自己手动序列化将对象转为JSON再存入Redis。

二、集成

使用StringRedisTemplate,不需要(写RedisConfig)额外设置序列化。不过存取对象需要自己序列化、反序列化。

三、使用

1、存取string
 @Autowiredprivate StringRedisTemplate stringRedisTemplate;@Testpublic void  testString(){String key = "string-name";//存String value = "这是value123";stringRedisTemplate.opsForValue().set(key,value);//取Object valueObj = stringRedisTemplate.opsForValue().get(key);System.out.println("value为:" + valueObj);}

输出:value为:这是value123,

查看可视化工具也没有乱码

2、存取对象
    @Autowiredprivate StringRedisTemplate stringRedisTemplate;    @Testpublic void  testUser(){String key = "user-key";//存UserDTO userDTO = new UserDTO();userDTO.setUserAccount("zhangsan");userDTO.setAge(18);userDTO.setUserName("张三");stringRedisTemplate.opsForValue().set(key, JSON.toJSONString(userDTO));//取String valueObj = stringRedisTemplate.opsForValue().get(key);UserDTO redisUser = JSON.parseObject(valueObj, UserDTO.class);System.out.println("value为:" + redisUser);}

输出:value为:UserDTO(userName=张三, age=18, userAccount=zhangsan)

查看可视化工具没有乱码:

3、广播消息 

(1)发送消息:

stringRedisTemplate.convertAndSend

(2)接收消息:

  ① implements MessageListener来实现一个监听器;

  ② 注册监听器到RedisMessageListenerContainer中。

demo:

(1)监听器:如我有两个监听器

package org.example.listen;import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.example.dto.UserDTO;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.stereotype.Component;@Slf4j
@Component
public class RedisBroadcastUserMsgHandler implements MessageListener {@Overridepublic void onMessage(Message message, byte[] pattern) {String consumerChannel = RedisSerializer.string().deserialize(message.getChannel());if(!consumerChannel.equals("user-topic")){return;}byte[] body = message.getBody();String json = RedisSerializer.string().deserialize(body);UserDTO userDTO = JSON.parseObject(json,UserDTO.class);log.info("handle接收到:"+userDTO);}
}
package org.example.listen;import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.example.dto.UserDTO;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.stereotype.Component;@Slf4j
@Component
public class RedisBroadcastUserMsgTwoHandler implements MessageListener {@Overridepublic void onMessage(Message message, byte[] pattern) {String consumerChannel = RedisSerializer.string().deserialize(message.getChannel());if(!consumerChannel.equals("user-topic-two")){return;}byte[] body = message.getBody();String json = RedisSerializer.string().deserialize(body);UserDTO userDTO = JSON.parseObject(json,UserDTO.class);log.info("handle接收到:"+userDTO);}
}

(2)注册监听器

package org.example.config;import lombok.extern.slf4j.Slf4j;
import org.example.listen.RedisBroadcastUserMsgHandler;
import org.example.listen.RedisBroadcastUserMsgTwoHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;import java.util.List;@Slf4j
@Configuration
public class RedisListenerConfig {@Autowiredprivate RedisBroadcastUserMsgHandler userMsgHandler;@Autowiredprivate RedisBroadcastUserMsgTwoHandler twoHandler;@Beanpublic RedisMessageListenerContainer redisContainer(RedisConnectionFactory connectionFactory) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);container.addMessageListener(userMsgHandler, new ChannelTopic("user-topic"));container.addMessageListener(twoHandler, new ChannelTopic("user-topic-two"));return container;}
}

(3)发送消息

    @Autowiredprivate StringRedisTemplate stringRedisTemplate;  @Testpublic void  testSendMsg(){UserDTO userDTO = new UserDTO();userDTO.setUserAccount("zhangsan");userDTO.setAge(18);userDTO.setUserName("张三");String channel = "user-topic";stringRedisTemplate.convertAndSend(channel,JSON.toJSONString(userDTO));//String channelTwo = "user-topic-two";stringRedisTemplate.convertAndSend(channelTwo,JSON.toJSONString(userDTO));}

执行控制台打印:

2024-08-13T16:04:31.630+08:00  INFO 10496 --- [edisContainer-2] o.e.l.RedisBroadcastUserMsgTwoHandler    : handle接收到:UserDTO(userName=张三, age=18, userAccount=zhangsan)
2024-08-13T16:04:31.630+08:00  INFO 10496 --- [edisContainer-1] o.e.listen.RedisBroadcastUserMsgHandler  : handle接收到:UserDTO(userName=张三, age=18, userAccount=zhangsan)
改进demo

如果有多个消费者,注册会比较麻烦,因此对上述监听器代码封装下:

(1)监听器:

package org.example.listen;import org.springframework.data.redis.connection.MessageListener;public abstract class RedisListener implements MessageListener {public abstract String getTopic();
}
package org.example.listen;import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.example.dto.UserDTO;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.stereotype.Component;@Slf4j
@Component
public class RedisBroadcastUserMsgHandler extends RedisListener {@Overridepublic String getTopic() {return "user-topic";}@Overridepublic void onMessage(Message message, byte[] pattern) {byte[] body = message.getBody();String json = RedisSerializer.string().deserialize(body);UserDTO userDTO = JSON.parseObject(json,UserDTO.class);log.info("handle接收到:"+userDTO);}
}

package org.example.listen;import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.example.dto.UserDTO;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.stereotype.Component;@Slf4j
@Component
public class RedisBroadcastUserMsgTwoHandler extends RedisListener {@Overridepublic void onMessage(Message message, byte[] pattern) {byte[] body = message.getBody();String json = RedisSerializer.string().deserialize(body);UserDTO userDTO = JSON.parseObject(json,UserDTO.class);log.info("handle接收到:"+userDTO);}@Overridepublic String getTopic() {return "user-topic-two";}
}

(2)注册监听器:

package org.example.config;import lombok.extern.slf4j.Slf4j;
import org.example.listen.RedisBroadcastUserMsgHandler;
import org.example.listen.RedisBroadcastUserMsgTwoHandler;
import org.example.listen.RedisListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;import java.util.List;@Slf4j
@Configuration
public class RedisListenerConfig {@Autowiredprivate RedisBroadcastUserMsgHandler userMsgHandler;@Autowiredprivate List<RedisListener> redisListeners;@Beanpublic RedisMessageListenerContainer redisContainer(RedisConnectionFactory connectionFactory) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);for(RedisListener listener : redisListeners) {container.addMessageListener(listener, new ChannelTopic(listener.getTopic()));}return container;}
}

执行Test:

@Testpublic void  testSendMsg(){UserDTO userDTO = new UserDTO();userDTO.setUserAccount("zhangsan");userDTO.setAge(18);userDTO.setUserName("张三");String channel = "user-topic";stringRedisTemplate.convertAndSend(channel,JSON.toJSONString(userDTO));//userDTO.setUserAccount("zhangsan-two");userDTO.setUserName("张三-two");String channelTwo = "user-topic-two";stringRedisTemplate.convertAndSend(channelTwo,JSON.toJSONString(userDTO));}

打印:

2024-08-13T16:25:10.725+08:00  INFO 88872 --- [edisContainer-1] o.e.listen.RedisBroadcastUserMsgHandler  : handle接收到:UserDTO(userName=张三, age=18, userAccount=zhangsan)
2024-08-13T16:25:10.725+08:00  INFO 88872 --- [edisContainer-2] o.e.l.RedisBroadcastUserMsgTwoHandler    : handle接收到:UserDTO(userName=张三-two, age=18, userAccount=zhangsan-two)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于PSO-BP+BP多特征分类预测对比(多输入单输出) Matlab代码
  • 智能家居已是红海,竞争惨烈,或许高品质UI能增加产品辨识度
  • python结合csv和正则实现条件筛选数据统计分数
  • [ACP云计算]易混淆知识点(考题总结)
  • Linux的awk使用方式
  • springboot,mysql多数据源-mybaits
  • idea和jdk的安装教程
  • Qt QCustomPlot 图形库详解
  • 代码随想录算法训练营第三十天|查找重叠区间、划分字母区间
  • 自动化测试必会之数据驱动测试
  • 【数据结构和算法】时间复杂度和空间复杂度
  • springBoot框架
  • 守护数字堡垒:全面掌握安全配置管理
  • 什么是令牌桶算法?工作原理是什么?使用它有哪些优点和注意事项?
  • C++ | 深入理解C++的IO流:从控制台输出流到文件输出流的应用
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • HomeBrew常规使用教程
  • JAVA SE 6 GC调优笔记
  • js对象的深浅拷贝
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Laravel5.4 Queues队列学习
  • react 代码优化(一) ——事件处理
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Vue 动态创建 component
  • Vue2.0 实现互斥
  • Windows Containers 大冒险: 容器网络
  • 闭包--闭包之tab栏切换(四)
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 讲清楚之javascript作用域
  • 马上搞懂 GeoJSON
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 思维导图—你不知道的JavaScript中卷
  • 我这样减少了26.5M Java内存!
  • 源码安装memcached和php memcache扩展
  • 【干货分享】dos命令大全
  • 阿里云服务器如何修改远程端口?
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (1)虚拟机的安装与使用,linux系统安装
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (三)模仿学习-Action数据的模仿
  • (四十一)大数据实战——spark的yarn模式生产环境部署
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET Core 项目指定SDK版本
  • .Net Winform开发笔记(一)