一、前期准备

1、一个构建好的springboot系统2、下载redis安装包,去redis官网下载3、启动redis服务,windows下双击bin目录下的redis-service.exe

二、环境构建

1、在项目的pom.xml中引入redis依赖

        <dependency>            <groupId>org.springframework.bootgroupId>            <artifactId>spring-boot-starter-data-redisartifactId>        dependency>

2、在项目配置文件application.yml中添加redis配置

spring:  #redis缓存  redis:    open: true  # 是否开启redis缓存  true开启   false关闭    database: 0    host: 127.0.0.1    port: 6379    password:    # 密码(默认为空)    timeout: 60000ms  # 连接超时时长(毫秒)    jedis:      pool:        max-active: 1000  # 连接池最大连接数(使用负值表示没有限制)        max-wait: -1ms      # 连接池最大阻塞等待时间(使用负值表示没有限制)        max-idle: 10      # 连接池中的最大空闲连接        min-idle: 5       # 连接池中的最小空闲连接

三、redis手动缓存

缓存配置

import com.fasterxml.jackson.annotation.JsonAutoDetect;import com.fasterxml.jackson.annotation.PropertyAccessor;import com.fasterxml.jackson.databind.DeserializationFeature;import com.fasterxml.jackson.databind.ObjectMapper;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.CacheManager;import org.springframework.cache.annotation.CachingConfigurerSupport;import org.springframework.cache.annotation.EnableCaching;import org.springframework.cache.interceptor.KeyGenerator;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import org.springframework.data.redis.cache.RedisCacheConfiguration;import org.springframework.data.redis.cache.RedisCacheManager;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.*;import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.RedisSerializationContext;import org.springframework.data.redis.serializer.RedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.time.Duration;/** * 缓存配置类 * @author 谢小鱼 * @Date 2019-11-20 11:00 **/@Configuration@EnableCachingpublic class RedisConfig extends CachingConfigurerSupport {        @Bean    public RedisTemplate<String, Object> redisTemplate() {        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();        redisTemplate.setKeySerializer(new StringRedisSerializer());        redisTemplate.setHashKeySerializer(new StringRedisSerializer());        redisTemplate.setHashValueSerializer(new StringRedisSerializer());        redisTemplate.setValueSerializer(new StringRedisSerializer());        redisTemplate.setConnectionFactory(factory);        return redisTemplate;    }    @Bean    public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {        return redisTemplate.opsForHash();    }    @Bean    public ValueOperations<String, String> valueOperations(RedisTemplate<String, String> redisTemplate) {        return redisTemplate.opsForValue();    }    @Bean    public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {        return redisTemplate.opsForList();    }    @Bean    public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {        return redisTemplate.opsForSet();    }    @Bean    public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {        return redisTemplate.opsForZSet();    }}

四、redis注解缓存

import com.fasterxml.jackson.annotation.JsonAutoDetect;import com.fasterxml.jackson.annotation.PropertyAccessor;import com.fasterxml.jackson.databind.DeserializationFeature;import com.fasterxml.jackson.databind.ObjectMapper;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.cache.CacheManager;import org.springframework.cache.annotation.CachingConfigurerSupport;import org.springframework.cache.annotation.EnableCaching;import org.springframework.cache.interceptor.KeyGenerator;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import org.springframework.data.redis.cache.RedisCacheConfiguration;import org.springframework.data.redis.cache.RedisCacheManager;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.*;import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.RedisSerializationContext;import org.springframework.data.redis.serializer.RedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.time.Duration;/** * 缓存配置类 * @author 谢小鱼 * @Date 2019-11-20 11:00 **/@Configuration@EnableCachingpublic class RedisConfig extends CachingConfigurerSupport {    private static final Logger logger = LoggerFactory.getLogger(RedisConfig.class);    @Autowired    private RedisConnectionFactory factory;    /**     * 默认两小时     */    private static final long DURATION_SECOND_7200 = 7200L;    private static final long DURATION_SECOND_300 = 300L;        @Override    @Bean    public KeyGenerator keyGenerator() {        return new KeyGenerator() {            @SuppressWarnings("rawtypes")            @Override            public Object generate(Object target, Method method, Object... params) {                StringBuilder sb = new StringBuilder(RedisAutoCacheValue.AUTO_KEY_PREFIX);                if(target instanceof Proxy) {                  //如果是代理类                  Class[] i = target.getClass().getInterfaces();                  if(i != null  && i.length > 0) {                    //取第一个即可                    sb.append(i[0].getName());                  }else {                    sb.append(target.getClass().getName());                  }                } else if(target instanceof org.springframework.cglib.proxy.Factory){                    //如果是cglib代理,需要手动去除 $$ 后面的                    String className = target.getClass().getName();                    sb.append(className, 0, className.indexOf("$$"));                } else {                  sb.append(target.getClass().getName());                }                sb.append(".");                sb.append(method.getName());                sb.append("_");                for (Object obj : params) {                    if (obj != null) {                        Class cls = obj.getClass();                        if (cls.isArray()) {                            //对于基础数据处理                            logger.info("keyGenerator : {}", cls.getComponentType());                            if (cls.isAssignableFrom(long.class)) {                                long[] ay = (long[]) obj;                                for (long o : ay) {                                    sb.append(o).append("");                                }                            } else if (cls.isAssignableFrom(int.class)) {                                int[] ay = (int[]) obj;                                for (int o : ay) {                                    sb.append(o).append("");                                }                            } else if (cls.isAssignableFrom(float.class)) {                                float[] ay = (float[]) obj;                                for (float o : ay) {                                    sb.append(o).append("");                                }                            } else if (cls.isAssignableFrom(double.class)) {                                double[] ay = (double[]) obj;                                for (double o : ay) {                                    sb.append(o).append("");                                }                            } else if (cls.isAssignableFrom(String.class)) {                                String[] ay = (String[]) obj;                                for (String o : ay) {                                    sb.append(o).append("");                                }                            } else {                                sb.append(obj.toString());                            }                            //TODO 对其他类型数组处理                        } else {                            sb.append(obj.toString());                        }                    } else {                        sb.append("null");                    }                    sb.append("_");                    //sb.append(obj == null ? "null" : obj.toString());                }                sb.delete(sb.length()-1, sb.length());                return sb.toString();            }        };    }    /**     * 默认的缓存管理,存放时效较长的缓存     * @param redisTemplate     * @return     */    @SuppressWarnings({"rawtypes", "Duplicates"})    @Primary    @Bean    public CacheManager cacheManager(RedisTemplate redisTemplate) {        RedisCacheConfiguration config = RedisCacheConfiguration                .defaultCacheConfig()                //过期时间                .entryTtl(Duration.ofSeconds(DURATION_SECOND_7200))                //不缓存null值                //.disableCachingNullValues()                //明确manager中的序列化与template一样,防止莫名其妙的问题                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(this.keySerializer()))                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(this.valueSerializer()));        RedisCacheManager rcm = RedisCacheManager.builder(redisTemplate.getConnectionFactory()).cacheDefaults(config).transactionAware().build();        return rcm;    }    /**     * 存放时效较短的缓存(5分钟)     * @param redisTemplate     * @return     */    @SuppressWarnings({"rawtypes", "Duplicates"})    @Bean    public CacheManager cacheManagerIn5Minutes(RedisTemplate redisTemplate) {        RedisCacheConfiguration config = RedisCacheConfiguration                .defaultCacheConfig()                //过期时间                .entryTtl(Duration.ofSeconds(DURATION_SECOND_300))                //不缓存null值                //.disableCachingNullValues()                //明确manager中的序列化与template一样,防止莫名其妙的问题                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(this.keySerializer()))                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(this.valueSerializer()));        RedisCacheManager rcm = RedisCacheManager.builder(redisTemplate.getConnectionFactory()).cacheDefaults(config).transactionAware().build();        return rcm;    }        private RedisSerializerkeySerializer() {        return new StringRedisSerializer();    }    private RedisSerializer valueSerializer() {        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);        ObjectMapper om = new ObjectMapper();        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);        //略过不匹配的属性        om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);        jackson2JsonRedisSerializer.setObjectMapper(om);        return jackson2JsonRedisSerializer;    }}

自动缓存key:

/** * 自动缓存value集中在此 * @author Leon * @Date 2019-11-19 12:38 **/public class RedisAutoCacheValue {    /**     * 自动生成key前缀     */    public static final String AUTO_KEY_PREFIX = "AUTO:";}

推荐使用注解的方式操作redis,便于维护

公众号ID:程序小鱼

欢迎扫码关注

有哪些老鸟程序员知道而新手不知道的小技巧?

程序不等于数据结构加算法,而等于搜索引擎加英语。

@primary注解_springboot整合redis分别实现手动缓存和注解缓存相关推荐

  1. @builder注解_SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证

    一.说明 SpringSecurity是一个用于Java 企业级应用程序的安全框架,主要包含用户认证和用户授权两个方面.相比较Shiro而言,Security功能更加的强大,它可以很容易地扩展以满足更 ...

  2. 猿创征文 | 微服务 Spring Boot 整合Redis 实战开发解决高并发数据缓存

    文章目录 一.什么是 缓存? ⛅为什么用缓存? ⚡如何使用缓存 二.实现一个商家缓存 ⌛环境搭建 ♨️核心源码 ✅测试接口 三.采用 微服务 Spring Boot 注解开启缓存 ✂️@CacheEn ...

  3. maven整合@data注解_springboot整合spring Cache(redis)

    前言 前面有介绍过spring整合redis和redis的一些注意点,在实际开发中,spring cache方便简化的缓存操作的大部分内容.通过注解的方式实现缓存. 缓存抽象的核心是将缓存应用于Jav ...

  4. springboot整合redis分别实现手动缓存和注解缓存

    一.前期准备 一个构建好的springboot系统 下载redis安装包,去redis官网下载 启动redis服务,windows下双击bin目录下的redis-service.exe 二.环境构建 ...

  5. maven整合@data注解_SpringBoot 整合 Dubbo实践(实用文章)

    作者:Cott 来源:https://www.cnblogs.com/cott/p/12373043.html 1.选择ZooKeeper作为注册中心 在linux环境中使用docker安装ZooKe ...

  6. redis缓存原理与实现_SpringBoot整合Redis缓存,手把手教你一步一步实现

    推荐学习 分布式大全:反向代理/Redis/中间件/MySQL/消息,挑战阿里P7必备 都是"Redis惹的祸",害我差点挂在美团三面,真是"虚惊一场" 微服务 ...

  7. nodejs redis 发布订阅_SpringBoot整合Redis,怎么实现发布/订阅?

    一.简介 1.发布订阅 SUBSCRIBE, UNSUBSCRIBE 和 PUBLISH 实现了 发布/订阅消息范例,发送者 (publishers) 不用编程就可以向特定的接受者发送消息 (subs ...

  8. redis 连接池_SpringBoot整合redis

    闲来没事,把之前自己搭建的SpringBoot集成Redis整理了一下,相信网上有很多,我只是写一下搭建的文章,能帮到就好,不能帮助,也是自己整理的文档罢了.文章开始: 开发工具用的IDEA 2018 ...

  9. redis序列化_SpringBoot整合redis

    redis是最常用的缓存数据库,常用于存储用户登录token.临时数据.定时相关数据等. redis是单线程的,所以redis的操作是原子性的,这样可以保证不会出现并发问题. redis基于内存,速度 ...

最新文章

  1. Linux查看多核CPU利用率
  2. 记一次金士顿DT100 G3 32G修复
  3. 常数乘以无穷大等于多少_电气知识知多少?第一弹
  4. python mpl_toolkits.mplot3d.axes3d.Axes3D()使用 介绍
  5. 基于java的网上花店销售系统_基于web的花店销售系统的设计与实现
  6. yum 安装 sun java,CentOS yum安装sun Java jre jdk和openjdk
  7. MyBatis SQL注入隐患及防范
  8. Axure模板库(1)-常见网站
  9. 【华为浏览器如何安装扩展程序】
  10. 小微企业智能名片管理小程序
  11. 【DeepExploit】基于强化学习的自动渗透工具
  12. python you-get 下载视频
  13. 从超融合到混合云,深信服有了哪些新“畅想”?
  14. VUE踩坑——this.$nextTick、头条小程序组件传值报错问题
  15. java自定义日历控件_【无私分享】修订版干货!!!一个炫酷的自定义日历控件,摆脱日历时间选择烦恼,纯福利~...
  16. 如何用好erp系统【ERP】
  17. pythonturtle写字_python用turtle写字
  18. win10下安装cuda和cudnn
  19. Java业务系统配置管理设计方案实现
  20. 使用SimpleUpdater实现WinForm自动升级

热门文章

  1. Gstreamer之gst_buffer_map()用法(十七)
  2. Android6.0 dump h264/h265编码裸流(二)
  3. Ubuntu修改su和sudo密码
  4. 嵌入式系统下对GPIO的简单操作
  5. ipv6单播地址包括哪两种类型_探秘联接|技术小课堂之BRAS设备IPv6地址分配方式...
  6. 云服务器网站301重定向跳转有什么作用?
  7. 计算机对团队合作的重要性,最新研究表明:计算机+协作完败面对面协作、计算机独立工作...
  8. feign整合sential_Sentinel 和 Feign 集成时,方法名称写错
  9. python中自定义类中的self_学习python第52天
  10. 如何远程linux服务器桌面,LINUX操作系统如何远程登录桌面