springboot RedisTemplate支持多个序列化方式

前提纪要:因为业务变动,需要在原先只支持protobuf的前提序列化的前提下,新增正常的序列化读取数据所以在原先的基础上进行优化。文章用于记忆。
话不多说直接上代码

@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
@Import({
   
   RedisAutoConfiguration.class})
@Slf4j
public class ProtobufRedisTemplateConfig  {
   
   

    private final LettuceConnectionFactory lettuceConnectionFactory;

    public ProtobufRedisTemplateConfig (LettuceConnectionFactory lettuceConnectionFactory) {
   
   
        this.lettuceConnectionFactory = lettuceConnectionFactory;
    }

    @Bean
    public RedisTemplate<Object, Object> protobufRedisTemplate() {
   
   
        RedisTemplate<Object, Object> template = new RedisTemplate<>(
### Spring Boot WebSocket 连接状态序列化解决方案 在分布式环境中,`javax.websocket.Session` 对象本身不可序列化,这使得跨多个WebSocket节点共享会话信息变得复杂[^3]。为了实现WebSocket连接状态的持久性和可移植性,建议采用以下几种方法: #### 方法一:外部存储机制保存Session元数据 不尝试直接序列化 `Session` 对象而是将其关联的信息(如用户ID、角色等)存入数据库或其他形式的缓存服务中。当客户端重新建立连接时,可以通过唯一标识符恢复之前的上下文。 ```java // 将session ID作为键,把必要的metadata存储起来 String sessionId = session.getId(); cacheService.put(sessionId, metadata); ``` 这种方法允许不同实例间的透明切换而不依赖于具体的Web容器实例。 #### 方法二:利用Redis Pub/Sub模式同步在线用户列表 借助像 Redis 这样的内存数据结构存储系统来管理用户的在线状态以及广播消息给所有订阅者。每当有新的WebSocket连接建立或断开时更新相应的记录并通知其他服务器节点。 ```java @Autowired private StringRedisTemplate redisTemplate; @OnOpen public void onOpen(Session session){ // 向频道发布加入事件 redisTemplate.convertAndSend("ws:online", "join:" + userId); } @OnClose public void onClose(){ // 发送离开事件 redisTemplate.convertAndSend("ws:online", "leave:" + userId); } ``` 这种方式不仅解决了序列化难题还增强了系统的扩展能力。 #### 方法三:自定义对象封装重要属性 创建一个新的POJO类用来承载那些需要被记住的关键字段而不是整个 `Session` 实体。这些简化后的实体更容易处理也更易于在网络间传输。 ```java class WsConnectionInfo { private String id; private Map<String,Object> attributes; public WsConnectionInfo(String id, Session session){ this.id=id; setAttributesFromSession(session); } private void setAttributesFromSession(Session s){ attributes=new HashMap<>(); for(Entry<Object, Object> entry : s.getUserProperties().entrySet()){ attributes.put(entry.getKey().toString(), entry.getValue()); } } } ``` 以上三种方案都可以有效应对由于 `Session` 不可序列化带来的挑战,在实际项目开发过程中可以根据具体需求选择最合适的一种或者组合使用它们。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT_Octopus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值