zoukankan      html  css  js  c++  java
  • springBoot整合redis--让缓存成为你系统的一部分

    三步上篮

    1、导入redis依赖

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>

    2.编写config

    package com.example.demo.config;
    
    import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer;
    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.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.cache.RedisCacheWriter;
    import org.springframework.data.redis.connection.RedisConnectionFactory;
    import org.springframework.data.redis.core.*;
    
    import org.springframework.data.redis.serializer.RedisSerializationContext;
    import org.springframework.data.redis.serializer.StringRedisSerializer;
    
    import java.time.Duration;
    
    /**
     * Redis配置
     *
     * @author chenshun
     * @email sunlightcs@gmail.com
     * @date 2017-07-70 19:22
     */
    @Configuration
    @EnableCaching
    public class RedisConfig extends CachingConfigurerSupport {
        
        @Autowired
        private RedisConnectionFactory factory;
    
    
    //    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    //    //定义value的序列化方式
    //    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
    //    ObjectMapper om = new ObjectMapper();
    //        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    //        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    //        jackson2JsonRedisSerializer.setObjectMapper(om);
    //
    //        redisTemplate.setKeySerializer(new StringRedisSerializer());
    //        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    //        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
    //        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
    //        redisTemplate.setConnectionFactory(factory);
        @Bean
        @SuppressWarnings("rawtypes")
        public RedisTemplate<String, Object> redisTemplate() {
            RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashValueSerializer(new FastJsonRedisSerializer(Object.class));
            redisTemplate.setValueSerializer(new FastJsonRedisSerializer(Object.class));
            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();
        }
        /**缓存管理器*/
      
        @Primary
        @Bean
        @SuppressWarnings({ "unchecked", "rawtypes" })
        public CacheManager cacheManager(RedisTemplate redisTemplate) {
             //初始化一个RedisCacheWriter
             RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisTemplate.getConnectionFactory());
             //设置CacheManager的值序列化方式为json序列化
             RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair.fromSerializer(new FastJsonRedisSerializer(Object.class));
             RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(pair);
    
             //设置默认超过时期是1天
             defaultCacheConfig.entryTtl(Duration.ofDays(1));
             //初始化RedisCacheManager
             return new RedisCacheManager(redisCacheWriter, defaultCacheConfig);
        }
    }

    3.实现redis服务(redis存取调用service)

    package com.example.demo.service.redis;
    
    import java.util.Map;
    import java.util.concurrent.TimeUnit;
    
    /**
     * redis操作Service,
     * 对象和数组都以json形式进行存储
     * Created by macro on 2018/8/7.
     */
    public interface RedisService {
        /**
         * 存储数据
         */
        void set(String key, String value);
    
        void setStringExpire(String key, String value, long expire, TimeUnit timeUnit);
    
        /**
         * 存储数据
         */
        void setExpire(String key, Object value, long expire);
    
        /**
         * 获取数据
         */
        String get(String key);
    
        /**
         * 设置超期时间
         */
        boolean expire(String key, long expire);
    
        /**
         * 删除数据
         */
        void remove(String key);
    
        /**
         * 自增操作
         *
         * @param delta 自增步长
         */
        Long increment(String key, long delta);
    
        <T> T getMapField(String key, String field, Class<T> clazz);
    
        void delMapField(String key, String... field);
    
        <T> void addMap(String key, String field, T obj);
    
        void setMap(String key, Map<Object, Object> value);
        Map<Object, Object> getMap(String key);
    
    
    }
    package com.example.demo.service.redis.impl;
    
    
    import com.example.demo.service.redis.RedisService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.BoundHashOperations;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.stereotype.Service;
    
    import java.util.Map;
    import java.util.concurrent.TimeUnit;
    
    /**
     * redis操作Service的实现类
     * Created by macro on 2018/8/7.
     */
    @Service
    public class RedisServiceImpl implements RedisService {
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
    
        @Autowired
        private RedisTemplate<String, Object> redisTemplate;
    
        @Override
        public void set(String key, String value) {
            stringRedisTemplate.opsForValue().set(key, value);
        }
    
        @Override
        public void setStringExpire(String key, String value, long expire,TimeUnit timeUnit) {
            stringRedisTemplate.opsForValue().set(key, value);
            stringRedisTemplate.expire(key,expire,timeUnit);
        }
    
        @Override
        public void setExpire(String key, Object value, long expire) {
            redisTemplate.opsForValue().set(key, value);
            redisTemplate.expire(key, expire, TimeUnit.SECONDS);
        }
    
        @Override
        public String get(String key) {
            return stringRedisTemplate.opsForValue().get(key);
        }
    
        @Override
        public boolean expire(String key, long expire) {
            return redisTemplate.expire(key, expire, TimeUnit.SECONDS);
        }
    
        @Override
        public void remove(String key) {
            stringRedisTemplate.delete(key);
        }
    
        @Override
        public Long increment(String key, long delta) {
            return stringRedisTemplate.opsForValue().increment(key, delta);
        }
    
        @Override
        public <T> T getMapField(String key, String field, Class<T> clazz) {
            return (T) redisTemplate.boundHashOps(key).get(field);
        }
    
        @Override
        public void delMapField(String key, String... field) {
            BoundHashOperations<String, String, ?> boundHashOperations = redisTemplate.boundHashOps(key);
            boundHashOperations.delete(field);
        }
    
        @Override
        public <T> void addMap(String key, String field, T obj) {
            redisTemplate.opsForHash().put(key, field, obj);
        }
    
    
        @Override
        public Map<Object, Object> getMap(String key) {
            return redisTemplate.opsForHash().entries(key);
        }
    
        @Override
        public void setMap(String key, Map<Object, Object> value) {
            redisTemplate.opsForHash().putAll(key, value);
        }
    
    }

    最后 调用测试

     

     另外 贴个yml中的redis配置

    # DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
    spring:
      datasource:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/ispd25?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
        username: root
        password: 123
    
    # Tomcat datasource specific settings
    # org.apache.tomcat.jdbc.pool.DataSource  org.apache.tomcat.jdbc.pool.PoolProperties
    #初始化连接: 连接池启动时创建的初始化连接数量
        tomcat:
          initial-size: 5
    #最大活动连接: 连接池在同一时间能够分配的最大活动连接的数量,如果设置为非正数则表示不限制
          max-active: 60
    #最大空闲连接: 连接池中容许保持空闲状态的最大连接数量, 超过的空闲连接将被释放, 如果设置为负数表示不限制
          max-idle: 10
    #最小空闲连接: 连接池中容许保持空闲状态的最小连接数量, 低于这个数量将创建新的连接, 如果设置为0则不创建.默认与initialSize相同
          min-idle: 5
    # 最大等待时间: 当没有可用连接时, 连接池等待连接被归还的最大时间( 以毫秒计数), 超过时间则抛出异常, 如果设置为-1 表示无限等待单位毫秒
          max-wait: -1
    #是否对空闲连接进行校验,如果检测失败, 则连接将被从池中去除.注意: 设置为true 后如果要生效,validationQuery 参数必须设置为非空字符串
          test-while-idle: true
    #SQL 查询, 用来验证从连接池取出的连接
          validation-query: SELECT 1
    #空闲连接回收器执行间隔,单位毫秒
          time-between-eviction-runs-millis: 310000
    # Validate the connection before borrowing it from the pool.
          test-on-borrow: true
    #校验查询超时时间以秒为单位
          validation-query-timeout: 10
    #避免过度验证,保证验证不超过这个频率——以毫秒为单位
          validation-interval: 30000
    #空闲连接能够保持空闲的最小时间,单位毫秒,在这个区间不会被回收器回收
          min-evictable-idle-time-millis: 1200000
    #空闲连接回收器的执行线程数
          num-tests-per-eviction-run: 10
    #检查连接是否泄漏(一般是因为没有关闭连接),如果他们超过了removeAbandonedTimout 的限制.如果设置为true, 连接被认为是被泄露并且可以被删除,
          remove-abandoned: true
    #连接多久没有释放则认为是泄漏线程
          remove-abandoned-timeout: 1800
    
    # JPA (JpaBaseConfiguration, HibernateJpaAutoConfiguration)
    # Enable JPA repositories.
      data:
        jpa:
          repositories:
            enabled: true
      jpa:
        database: MYSQL
    # Initialize the schema on startup.
        generate-ddl: false
    # DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto" property. Default to "create-drop" when using an embedded database, "none" otherwise.
        hibernate:
            ddl-auto: none
            open-in-view: false
    # Additional native properties to set on the JPA provider.
        properties:
          hibernate:
            dialect :  org.hibernate.dialect.MySQL5Dialect
            format_sql: true
        show-sql: true
    
      redis:
        host: 192.168.111.147
        port: 6379
        database: 3
        timeout: 20000ms
        password:
        jedis:
          pool:
            max-active: 8
            min-idle: 0
            max-idle: 8
            max-wait: -1ms
        cache:
          time: 3000
          enable: true
    
    conf:
      address:
        smp: http://192.168.11.130:8026
    
    ftp:
       host: 192.168.10.25
       port: 21
       username: uftp
       password: 1234
       ftpPath: /data/
       visit:  http://192.168.10.25:8050/
       imageSize: 10485760
  • 相关阅读:
    兼容性问题
    Webfont 的兼容性问题[持续更新]
    WebView的坑[持续更新]
    [转]60fps on the mobile web
    IT男送什么礼物给女朋友呢?
    Lumia 1520 IE mobile window.devicePixelRatio
    Fiddler 故障
    IE(8~11+) 可用右键加速器
    [转]Zen Cart官网屏蔽中国用户访问的真正原因
    Internet Explorer Developer Channel 自动化测试 IE 浏览器
  • 原文地址:https://www.cnblogs.com/guanxiaohe/p/11949463.html
Copyright © 2011-2022 走看看