文档章节

实现一个RedisSerializer<T>用在spring-boot-starter-data-redis中

Kxvz
 Kxvz
发布于 2018/01/09 11:27
字数 495
阅读 305
收藏 4

需求: 因为会使用到Spring-redis作为缓存框架缓存数据,不让程序每次查询都进到数据库中,因此正对不同的数据格式需要进行序列化和反序列化,于是就自己实现了一个简单的序列化类

首先 配置 Springboot 的 redis 配置

# REDIS (RedisProperties)
# Redis数据库索引(默认为0)
spring.redis.database=0  
# Redis服务器地址
spring.redis.host=192.168.0.11
# Redis服务器连接端口
spring.redis.port=6379  
# Redis服务器连接密码(默认为空)
spring.redis.password=ThisIsPass
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=-1  
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1  
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8  
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=2  
# 连接超时时间(毫秒)
spring.redis.timeout=50

接下来实现 序列化类 (这里使用到了GSON):

import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;


public class RedisValueSerializer<T> implements RedisSerializer<T> {

    private static final byte[] EMPTY_ARRAY = new byte[0];

    @Override
    public byte[] serialize(T t) throws SerializationException {
        if (t == null) {
            return EMPTY_ARRAY;
        }
        String tmp = String.format("%s_%s", t.getClass().getName(), JsonUtils.obj2Json(t));
        return tmp.getBytes(Encode.UTF8);
    }

    @Override
    public T deserialize(byte[] bytes) throws SerializationException {
        try {
            if (bytes == null || bytes.length <= 0) {
                return null;
            }
            String tmp = new String(bytes, Encode.UTF8);
            String className = tmp.substring(0, tmp.indexOf("_{"));
            String json = tmp.substring(tmp.indexOf("_{") + 1);
            return (T) JsonUtils.json2Obj(json, Class.forName(className));
        } catch (ClassNotFoundException ex) {
            LogUtils.error(TAG.DEF, this.getClass(), "deserialize", ex);
        }
        return null;
    }
}

 

然后RedisConfig:

import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;


@Primary
@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    @Primary
    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate) {
        RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
        return rcm;
    }

    @Primary
    @Bean
    public StringRedisTemplate redisTemplate(RedisConnectionFactory factory) {
        StringRedisTemplate template = new StringRedisTemplate(factory);
        template.setValueSerializer(new RedisValueSerializer<Object>());
        template.afterPropertiesSet();
        return template;
    }
}

然后就可以使用缓存注解了:

@Cacheable(key ="#p0") 

@CachePut(key = "#p0")

@CacheEvict(key ="#p0",allEntries=true)

...

 

注解使用参考:http://blog.csdn.net/sanjay_f/article/details/47372967

 

© 著作权归作者所有

Kxvz
粉丝 12
博文 106
码字总数 29791
作品 0
成都
程序员
私信 提问
Spring Boot使用Spring Data Redis操作Redis(单机/集群)

说明:Spring Boot简化了Spring Data Redis的引入,只要引入spring-boot-starter-data-redis之后会自动下载相应的Spring Data Redis和Jedis客户端,可以减少版本这块的冲突,当然,如果要引入...

easonjim
2017/11/08
0
0
第二章——Spring Boot启动器与依赖管理

强烈推荐选择支持依赖管理和可以发布到“Maven中央”仓库的构建系统。推荐使用Maven或Gradle。Spring Boot可以使用其他构建系统(例如,Ant),但支持得并不是很好。 1 依赖管理 Spring Boo...

Leech
2018/02/04
0
0
你一直在用的 Spring Boot Starters 究竟是怎么回事

Spring Boot 对比 Spring MVC 最大的优点就是使用简单,约定大于配置。不会像之前用 Spring MVC 的时候,时不时被 xml 配置文件搞的晕头转向,冷不防还因为 xml 配置上的一点疏忽,导致整个项...

风的姿态
05/30
0
0
聊聊spring-boot-starter-data-redis的配置变更

序 本文主要研究一下spring-boot-starter-data-redis的配置变更 配置变更 以前是spring-boot的1.4.x版本的(spring-data-redis为1.7.x版本),最近切到2.0.4.RELEASEB版本(spring-data-redis为...

go4it
2018/09/05
0
0
springboot系列十 Spring-Data-Redis

基本使用 依赖和配置 依赖 配置 使用 测试 写个启动类,启动后访问 http://localhost:8080/redis/test?key=a&val=abc 查看redis CacheManager缓存管理 使用cacheManager,结合spring可以使用...

yimingkeji
2018/12/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

优雅的关闭Spring Boot

优雅的关闭Spring Boot 1、实现 TomcatConnectorCustomizer 接口拿到Tomcat的连接获取 Tomcat连接池 2、实现 ApplicationListener<ContextClosedEvent> 监听服务器关闭事件,注册JVM钩子函数...

sowhat
今天
2
0
Python3-Web开发

简介 Web开发框架 什么是Web框架? Web应用程序框架或简单的Web框架表示一组库和模块,使Web应用程序开发人员能够编写应用程序,而不必担心协议,线程管理等低级细节。 virtualenv是一个虚拟...

wuxinshui
今天
3
0
使用技媒体实践编写发布博客

技媒体实践博客 CSDN OSChina 知乎 简书 思否 掘金 51CTO

晨猫
今天
2
0
Lucene

1、什么是全文检索 数据分类 我们生活中的数据总体分为两种:结构化数据和非结构化数据。 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。 非结构化数据:指不定长或无固...

榴莲黑芝麻糊
昨天
5
0
python到setuptools、pip工具的安装

python安装 基础开发库   apt-get install gcc  apt-get install openssl libssl-dev 安装数据库和开发库   apt-get install mysql-server libmysqld-dev python环境   下载地址...

问题终结者
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部