redis开发规约

key设计

1、可读性和可管理性

# 业务名:表名:id
getpersoninfo:person:1

2、简洁性

减少key长度,建议不超过39字节
例子 humanresource:employee:88301  -> hr:emp_88301

3、特色字符

key 不要包含特殊字符(空格,换行,引号),建议使用英文与数字

不同类型的应用场景

 序列化

JdkSerializationRedisSerializer

pojo对象的存储场景,使用jdk本身序列化机制,是默认机制,采用ObjectInputsStream/ObjectOutputStream进行序列化

StringRedisSerializer

采用string的方式序列化

Jackson2JsonRedisSerializer

利用jackson-json工具,将pojo序列化成json格式存储

GenericFastJsonRedisSerializer

javabean与json之间的转换,同时需要指定calss类型

springboot中的应用

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisTemplateConfiguration {
/**
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory
redisConnectionFactory) {
    RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(redisConnectionFactory);
    // 使用Jackson2JsonRedisSerialize 替换默认序列化
    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new
    Jackson2JsonRedisSerializer(Object.class);
    ObjectMapper objectMapper = new ObjectMapper();
    //对于Null值不输出
    objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
    // 设置key和value的序列化规则
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
    // 设置hashKey和hashValue的序列化规则
    redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
    //afterPropertiesSet和init-method之间的执行顺序是afterPropertiesSet 先执行,
    init-method 后执行。
    redisTemplate.afterPropertiesSet();
    return redisTemplate;
}

声明式缓存

@Cacheable/@CacheResult 读取/设置缓存
@CachePut 添加/更新缓存
@CacheEvict/@CacheRemove 移除缓存

springboot 使用

1、引入@EnableCaching

2、使用@Cacheable(value="查询的key",key=“#查询的具体字段”,condition=“#查询条件”,cacheManager=“缓存自定义处理方式-对应下面的cachemangager方法”)

自定义缓存处理方式

使用spring cache 的困扰

1、默认spring cache采用::分割数据,并不是约定俗称的冒号分割

2、默认使用jdk序列化,jdk序列化生成的字节流较大,应该改为json序列化

3、spring cache注解不支持expire过期时间,需要自己编写代码实现

@Configuration
public class SpringCacheConfgiration {
    @Bean
    @Primary //设置默认的CacheManager
    public CacheManager cacheManager(LettuceConnectionFactory factory){
        //加载默认Spring Cache配置信息
        RedisCacheConfiguration config =
        RedisCacheConfiguration.defaultCacheConfig();
        //设置有效期为1小时
        config = config.entryTtl(Duration.ofHours(1));
        //说明缓存Key使用单冒号进行分割
        config = config.computePrefixWith(cacheName -> cacheName + ":");
        //Redis Key采用String直接存储
        config =
config.serializeKeysWith(RedisSerializationContext.SerializationPair.from         Serializer(new StringRedisSerializer()));
        //Redis Value则将对象采用JSON形式存储
        config =
config.serializeValuesWith(RedisSerializationContext.SerializationPair.fr        omSerializer(new GenericJackson2JsonRedisSerializer()));
        //不缓存Null值对象
        config = config.disableCachingNullValues();
        //实例化CacheManger缓存管理器
        RedisCacheManager cacheManager =
        RedisCacheManager.RedisCacheManagerBuilder
            //绑定REDIS连接工厂
            .fromConnectionFactory(factory)
            //绑定配置对象
            .cacheDefaults(config)
            //与声明式事务注解@Transactional进行兼容
            .transactionAware()
            //完成对象构建
            .build();
        return cacheManager;
}
    //为不同的TTL创建不同的CacheManager
    @Bean
    public CacheManager cacheManager1m(LettuceConnectionFactory factory){
        //加载默认Spring Cache配置信息
        RedisCacheConfiguration config =
        RedisCacheConfiguration.defaultCacheConfig();
        //设置有效期为1小时
        config = config.entryTtl(Duration.ofMinutes(1));
        //说明缓存Key使用单冒号进行分割
        config = config.computePrefixWith(cacheName -> cacheName + ":");
        //Redis Key采用String直接存储
        config =
config.serializeKeysWith(RedisSerializationContext.SerializationPair.from         Serializer(new StringRedisSerializer()));
        //Redis Value则将对象采用JSON形式存储
        config =
config.serializeValuesWith(RedisSerializationContext.SerializationPair.fr         omSerializer(new GenericJackson2JsonRedisSerializer()));
        //不缓存Null值对象
        config = config.disableCachingNullValues();
        //实例化CacheManger缓存管理器
        RedisCacheManager cacheManager =
        RedisCacheManager.RedisCacheManagerBuilder
            //绑定REDIS连接工厂
            .fromConnectionFactory(factory)
            //绑定配置对象
            .cacheDefaults(config)
            //与声明式事务注解@Transactional进行兼容
            .transactionAware()
            //完成对象构建
            .build();
        return cacheManager;
    }
}

 

posted @ 2024-04-07 19:02  程序菜小子  阅读(38)  评论(0)    收藏  举报