SpringBoot 优雅整合Redis

目录

一、为什么要使用Redis

  • 简介

    redis是Nosql数据库中使用较为广泛的非关系型内存数据库,redis内部是一个key-value存储系统。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型,类似于Java中的map)。Redis基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。

  • 为什么

二、安装和配置Redis

三、SpringBoot简单应用Redis

  1. 添加maven依赖

        <!-- redis -->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>
        <!-- jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>   

  2. application.properties配置redis信息

    
    #redis
    
    spring.redis.hostName: localhost 
    spring.redis.port: 6379  
    spring.redis.password:

  3. springboot应用主入口开启缓存

    package com.zk.kfcloud;
    
    import com.alibaba.fastjson.JSONObject;
    import com.zk.kfcloud.Exception.MenuCreateException;
    import com.zk.kfcloud.Utils.wechat.CustomerMenu;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cache.annotation.EnableCaching;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    
    
    @EnableCaching //开启缓存
    @EnableTransactionManagement // 开启事务管理
    @SpringBootApplication
    @MapperScan("com.zk.kfcloud.Dao")
    public class KfcloudApplication {
       public static void main(String[] args) {
           SpringApplication.run(KfcloudApplication.class, args);
           KfcloudApplication.creatMenu();
       }
    }
    
    1. 这样其实就已经简单配置好redis了

    2. 测试一下

      contoller层

      @RestController
      public class testRedis {
      
        @GetMapping("/testRedis")
        public  String uid(HttpSession session) {
            UUID uid = (UUID) session.getAttribute("uid");
            if (uid == null) {
                uid = UUID.randomUUID();
            }
            session.setAttribute("uid", uid);
            return session.getId();
        }
      }

      启动redis

      这里写图片描述

四、SpringBoot高级应用Redis

  • 其实也就是,结合redisTemplate来使用redis

  • 项目目录结构
    这里写图片描述

  • 增加集成redistemplate配置

    @Slf4j
    @Configuration
    @EnableAutoConfiguration
    public class RedisConfig {
    
    
      //获取springboot配置文件的值 (get的时候获取)
      @Value("${spring.redis.hostName}")
      private String host;
    
      @Value("${spring.redis.password}")
      private String password;
    
    
      /**
       * @Bean @ConfigurationProperties
       * 该功能在官方文档是没有提到的,我们可以把@ConfigurationProperties和@Bean和在一起使用。
       * 举个例子,我们需要用@Bean配置一个Config对象,Config对象有a,b,c成员变量需要配置,
       * 那么我们只要在yml或properties中定义了a=1,b=2,c=3,
       * 然后通过@ConfigurationProperties就能把值注入进Config对象中
       * @return
       */
      @Bean
      @ConfigurationProperties(prefix = "spring.redis.pool")
      public JedisPoolConfig getRedisConfig() {
          JedisPoolConfig config = new JedisPoolConfig();
          return config;
      }
    
      @Bean
      @ConfigurationProperties(prefix = "spring.redis")
      public JedisConnectionFactory getConnectionFactory() {
          JedisConnectionFactory factory = new JedisConnectionFactory();
          factory.setUsePool(true);
          JedisPoolConfig config = getRedisConfig();
          factory.setPoolConfig(config);
          log.info("JedisConnectionFactory bean init success.");
          return factory;
      }
    
    
      @Bean
      public RedisTemplate<?, ?> getRedisTemplate() {
          JedisConnectionFactory factory = getConnectionFactory();
          log.info(this.host+","+factory.getHostName()+","+factory.getDatabase());
          log.info(this.password+","+factory.getPassword());
          log.info(String.valueOf(factory.getPoolConfig().getMaxIdle()));
          RedisTemplate<?, ?> template = new StringRedisTemplate(getConnectionFactory());
          return template;
      }
    }
  • RedisService

    public interface RedisService {
    
      public boolean set(final String key, final String value);
    
      public String get(final String key);
    
      public <T> boolean setList(String key, List<T> list);
    
      public <T> List<T> getList(String key, Class<T> clz);
    
      public long lpush(final String key, Object obj);
    
      public long rpush(final String key, Object obj);
    
      public String lpop(final String key);
    
      public boolean expire(final String key, long expire);
    
    }
  • RedisServiceImpl(即redistemplate的工具类)

    @Service
    public class RedisServiceImpl implements RedisService {
    
    
      @Resource
      private RedisTemplate<String, ?> redisTemplate;
    
      @Override
      public boolean set(final String key, final String value) {
          boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
              @Override
              public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
                  RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
                  connection.set(serializer.serialize(key), serializer.serialize(value));
                  return true;
              }
          });
          return result;
      }
    
      @Override
      public String get(final String key){
          String result = redisTemplate.execute(new RedisCallback<String>() {
              @Override
              public String doInRedis(RedisConnection connection) throws DataAccessException {
                  RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
                  byte[] value =  connection.get(serializer.serialize(key));
                  return serializer.deserialize(value);
              }
          });
          return result;
      }
    
      @Override
      public boolean expire(final String key, long expire) {
          return redisTemplate.expire(key, expire, TimeUnit.SECONDS);
      }
    
      @Override
      public <T> boolean setList(String key, List<T> list) {
          String value = JSON.toJSONString(list);
          return set(key,value);
      }
    
      @Override
      public <T> List<T> getList(String key, Class<T> clz) {
          String json = get(key);
          if(json!=null){
              List<T> list = JSON.parseArray(json, clz);
              return list;
          }
          return null;
      }
    
      @Override
      public long lpush(final String key, Object obj) {
          final String value = JSON.toJSONString(obj);
          long result = redisTemplate.execute(new RedisCallback<Long>() {
              @Override
              public Long doInRedis(RedisConnection connection) throws DataAccessException {
                  RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
                  long count = connection.lPush(serializer.serialize(key), serializer.serialize(value));
                  return count;
              }
          });
          return result;
      }
    
      @Override
      public long rpush(final String key, Object obj) {
          final String value = JSON.toJSONString(obj);
          long result = redisTemplate.execute(new RedisCallback<Long>() {
              @Override
              public Long doInRedis(RedisConnection connection) throws DataAccessException {
                  RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
                  long count = connection.rPush(serializer.serialize(key), serializer.serialize(value));
                  return count;
              }
          });
          return result;
      }
    
      @Override
      public String lpop(final String key) {
          String result = redisTemplate.execute(new RedisCallback<String>() {
              @Override
              public String doInRedis(RedisConnection connection) throws DataAccessException {
                  RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
                  byte[] res =  connection.lPop(serializer.serialize(key));
                  return serializer.deserialize(res);
              }
          });
          return result;
      }
    }
  • 测试controller

    @RestController
    public class testRedis {
    
      @Autowired
      private RedisService redisService;
    
      @GetMapping("/testRedis")
      public  String uid(HttpSession session) {
          UUID uid = (UUID) session.getAttribute("uid");
          if (uid == null) {
              uid = UUID.randomUUID();
          }
          redisService.set("sessionid",String.valueOf(uid));
          redisService.set("word", "正在使用Redis高级功能。。。");
          return session.getId();
      }
    }
  • 启动redis,查看效果

    这里写图片描述

五、引用

  1. SpringBoot 集成redis和redisTemplate
  2. 从零开始的Spring Session(二)
  3. 官方指南- Spring Session - Spring Boot
  4. 项目github源代码地址
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值