深入理解Spring Redis的使用 (七)、Spring Redis 使用 jackson序列化 以及 BaseDao代码

之前在介绍Spring Redis进行存储的时候,都是通过RedisTemplate中的defaultSerializer,即JdkSerializationRedisSerializer。通过Jdk的序列化比较简单,但是有时候线上调试的时候通过控制台查看,完全看不出来存储了什么东西。而且在空间占用和性能上,相比Jackson,完全没有优势。

有过两次线上出问题,定位的时候知道缓存有错,却不知道到底出在那个缓存的字段上,调试非常不方便。于是序列化统统换成了Jackson。

代码如下:

import java.lang.reflect.ParameterizedType;
import java.util.concurrent.TimeUnit;

import javax.annotation.Resource;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SetOperations;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
/**
 * key统一为String,省略.HK为hash类型的hashkey类型,HV为value类型或者hashvalue类型(这两个不可能同时存在,所以只取一个)
 * @author Han
 */
public class BaseRedisDao<HK, HV> implements InitializingBean{

    //实际参数的class start
    private Class<HK> hkClass;

    private Class<HV> hvClass;

    private Class<HK> getHKClass(){
        if (hkClass == null) {
            hkClass = (Class<HK>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        }
        return hkClass;
    }

    private Class<HV> getHVClass(){
        if (hvClass == null) {
            hvClass = (Class<HV>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[1];
        }
        return hvClass;
    }
    // end
    @Autowired
    private RedisTemplate<String, HV> redisTemplate;

    protected ValueOperations<String, HV> valueOperations;
    //
    protected HashOperations<String, HK, HV> hashOperations;
    //
    protected ListOperations<String, HV> listOperations;

    protected SetOperations<String, HV> setOperations;
    /**
     *
     * @param key
     * @param value
     * @param expire
     * @return
     */
    protected void set(String key, HV value, long expire) {
        valueOperations.set(key, value, expire, TimeUnit.SECONDS);
    }

    /**
     * get value
     *
     * @param key
     * @return
     */
    protected HV get(String key) {
        return valueOperations.get(key);
    }

    /**
     * key delete
     * @param key
     */
    protected void delete(String key){
        getRedisTemplate().delete(key);
    }

    /**
     * key exist
     * @param key
     * @return
     */
    protected boolean hasKey(String key){
        return  getRedisTemplate().hasKey(key);
    }
    /**
     *key expire
     * @param key
     * @param timeout
     * @param unit
     * @return
     */
    protected Boolean expire(String key,long timeout,TimeUnit unit){
        return getRedisTemplate().expire(key, timeout, unit);
    }
    /**
     * redistemplate是全局唯一的,子类不要出现对redistemplate的成员变量的设置(比如keyserializer,)
     * @return
     */
    RedisTemplate<String, HV> getRedisTemplate() {
        return redisTemplate;
    }
    /**
     * 当需要更改serializer,可以直接通过connection.set等方法实现
     * @param callback
     * @return
     */
    protected <T> T execute(RedisCallback<T> callback){
        return redisTemplate.execute(callback);
    }
    /**
     * 获取stringserializer
     */
    protected RedisSerializer<String> getStringSerializer(){
        return redisTemplate.getStringSerializer();
    }
    /**
     * 获取JdkSerializationRedisSerializer
     */
    @SuppressWarnings("unchecked")
    protected <T> RedisSerializer<T> getDefaultSerializer(){
        return (RedisSerializer<T>) redisTemplate.getDefaultSerializer();
    }
    /**
     * 获取stringserializer
     * @return
     */
    @SuppressWarnings("unchecked")
    protected  RedisSerializer<String> getKeySerializer(){
        return (RedisSerializer<String>) redisTemplate.getKeySerializer();
    }
    /**
     * 获取jackson2jsonredisserializer
     * @return
     */
    protected RedisSerializer<HV> getValueSerializer(){
        return (RedisSerializer<HV>) redisTemplate.getValueSerializer();
    }
    /**
     * 获取jackson2jsonredisserializer
     * @return
     */
    @SuppressWarnings("unchecked")
    protected RedisSerializer<HK> getHashKeySerializer() {
        return (RedisSerializer<HK>) redisTemplate.getHashKeySerializer();
    }

    /**
     * 获取jackson2jsonredisserializer
     * @return
     */
    @SuppressWarnings("unchecked")
    protected RedisSerializer<HV> getHashValueSerializer() {
        return (RedisSerializer<HV>) redisTemplate.getHashValueSerializer();
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        if(getHKClass() == null || getHVClass() == null){
            throw new IllegalArgumentException("获取泛型class失败");
        }
        //
        valueOperations = redisTemplate.opsForValue();
        hashOperations = redisTemplate.opsForHash();
        listOperations = redisTemplate.opsForList();
        setOperations = redisTemplate.opsForSet();
        //
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<HV>(getHVClass()));
        redisTemplate.setHashKeySerializer(new Jackson2JsonRedisSerializer<HK>(getHKClass()));
        redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<HV>(getHVClass()));
    }
}

对于key的序列化,直接在配置文件定义

<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" scope="prototype">
        <property name="connectionFactory" ref="jedisConnectionFactory" />
        <property name="keySerializer" ref="stringKeySerializer"/>
        <property name="enableTransactionSupport" value="true"/><!-- 配置true可以使用transactional控制事务,spring已经提供支持 -->
    </bean>
时间: 2024-12-23 04:40:17

深入理解Spring Redis的使用 (七)、Spring Redis 使用 jackson序列化 以及 BaseDao代码的相关文章

第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第七天】(redis缓存)

https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结[第五天] 第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结[第六天] 第04项目:淘淘商城(SpringMVC+Spring+Mybatis)[第七天](redis缓存) 第04

Redis初学及与Spring集成小结

Redis初学及与Spring集成小结 1.redis是干什么的? redis是一种key-value内存数据库.在技术日新月异的发展环境下,客户的访问需求也在逐渐增长,物理数据库的压力也越来越大,由此redis也应运而生. redis常用的方式是将redis作为缓存数据库,减小物理数据库的访问压力: 2.redis常用数据结构: a.strings: set key value;设置key-value值 get key;获取key的value值 redis...method(redis中的一些

Spring Security 解析(七) —— Spring Security Oauth2 源码解析

Spring Security 解析(七) -- Spring Security Oauth2 源码解析 ??在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因此决定先把Spring Security .Spring Security Oauth2 等权限.认证相关的内容.原理及设计学习并整理一遍.本系列文章就是在学习的过程中加强印象和理解所撰写的,如有侵权请告知. 项目环境: JDK1.8 Spring boot 2.x Spring Security

Spring系列之谈谈对Spring IOC的理解

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IOC .DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解. 一.分享Iteye的开涛对Ioc的精彩讲解首先要分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文 1.1.IoC是什么 Ioc—Inversi

个人理解去搭建SSH三大框架spring管理配置文件(初学第一次接触SSH)

<bean id="dataSuorces" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="oracle.jdbc.OracleDirver"/>(oracle数据库) <property name="url"

Spring Boot系列教程七:Spring boot集成MyBatis

一.创建项目 项目名称为 "springboot_mybatis_demo",创建过程中勾选 "Web","MyBatis","MySQL",第一次创建Maven需要下载依赖包(耐心等待) 二.实现 2.1创建User类 1 package com.woniu.bean; 2 3 4 public class User { 5 private long id; 6 private String name; 7 private

spring cloud 入门系列七:基于Git存储的分布式配置中心--Spring Cloud Config

我们前面接触到的spring cloud组件都是基于Netflix的组件进行实现的,这次我们来看下spring cloud 团队自己创建的一个全新项目:Spring Cloud Config.它用来为分布式系统中的基础设施和微服务提供集中化的外部配置支持,分为服务端和客户端两个部分. 其中服务端也称为分布式配置中心,他是独立的微服务应用,用来连接配置仓库并为客户端提供获取接口(这些接口返回配置信息.加密.解密信息等): 客户端是微服务架构中的各个微服务应用或基础设施,它们通过制定的配置中心来管理

关于快速创建一个spring-boot项目的操作,简单的spring运行方式的总结,spring注解的简单理解。

作为一个开发者我们都是通过开发工具进行创建工程通常我们都是采用(如:eclipse.intellij idea)来快速生成项目结构)但是sprig-boot项目我们不需要依赖开发工具进行 我们可以通过spring提供的便捷途径进行创建项目: 下面是sprig-boot项目快速创建的地址: 地址:http://start.spring.io/ 进入这个地址之后我们可以看到相关的按钮:图形化的界面多点点就会知道什么意思了 如上上面图中的相关的设置.自己可以进行相关的设置.最后会生成一个zip 包.然

spring cloud深入学习(七)-----配置中心git示例

随着线上项目变的日益庞大,每个项目都散落着各种配置文件,如果采用分布式的开发模式,需要的配置文件随着服务增加而不断增多.某一个基础服务信息变更,都会引起一系列的更新和重启,运维苦不堪言也容易出错.配置中心便是解决此类问题的灵丹妙药. 市面上开源的配置中心有很多,BAT每家都出过,360的QConf.淘宝的diamond.百度的disconf都是解决这类问题.国外也有很多开源的配置中心Apache的Apache Commons Configuration.owner.cfg4j等等.这些开源的软件