SpringBoot(二十四)整合Redis

时间:2019-01-19 23:42:00 来源:互联网 作者: 神秘的大神 字体:

缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力。Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以,现在Redis用在缓存的场合非常多。

之前有两篇博文(centos安装RedisRedis五大数据类型的常用操作),分别介绍了Redis的安装和Redis的常用操作。今天主要介绍介绍springboot整合Redis。

v应用场景

现在公司做的项目都偏重论坛/社区/社交类产品,所以对Redis的实用场景主要集中在排行榜,最新/最热内容,Redis提供的有序集合数据类构能实现各种复杂的排行榜应用。还有点赞、踩、关注/被关注、共同好友等是社交网站的基本功能,社交网站的访问量通常来说比较大,而且传统的关系数据库类型不适合存储这种类型的数据,Redis提供的哈希、集合等数据结构能很方便的的实现这些功能。

还有很多应用场景,比如分布式会话和分布式锁(分布式锁感兴趣的可以看我之前的一篇文章《Java分布式锁,搞懂分布式锁实现看这篇文章就对了》)等等,总之越来越广泛。

v搭建Redis

1.1. 引入Redis

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

 

注意redis.clients是我本地调试测试用的,可以忽略。

1.2. 添加RedisCacheConfig

package com.demo.Redis;    import org.springframework.beans.factory.annotation.Autowired;  import org.springframework.cache.annotation.EnableCaching;  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.StringRedisTemplate;  import org.springframework.data.redis.listener.PatternTopic;  import org.springframework.data.redis.listener.RedisMessageListenerContainer;  import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;    import java.util.concurrent.CountDownLatch;    /**   * Created by toutou on 2019/1/20.   */  @Configuration  @EnableCaching  public class RedisCacheConfig {      @Bean      RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,                                              MessageListenerAdapter listenerAdapter) {            RedisMessageListenerContainer container = new RedisMessageListenerContainer();          container.setConnectionFactory(connectionFactory);          container.addMessageListener(listenerAdapter, new PatternTopic("chat"));            return container;      }        @Bean      MessageListenerAdapter listenerAdapter(Receiver receiver) {          return new MessageListenerAdapter(receiver, "receiveMessage");      }        @Bean      Receiver receiver(CountDownLatch latch) {          return new Receiver(latch);      }        @Bean      CountDownLatch latch() {          return new CountDownLatch(1);      }        @Bean      StringRedisTemplate template(RedisConnectionFactory connectionFactory) {          return new StringRedisTemplate(connectionFactory);      }        public class Receiver {              private CountDownLatch latch;            @Autowired          public Receiver(CountDownLatch latch) {              this.latch = latch;          }            public void receiveMessage(String message) {              latch.countDown();          }      }  }

 

可以按需添加,也可以按需忽略。

1.3. 添加Redis配置,修改application.properties

# ----- Redis -------- #  # REDIS (RedisProperties)  # Redis数据库索引(默认为0)  spring.redis.database=0    # Redis服务器地址  spring.redis.host=10.168.11.129  # Redis服务器连接端口  spring.redis.port=6379  # Redis服务器连接密码(默认为空)  spring.redis.password=  # 连接池最大连接数(使用负值表示没有限制)  spring.redis.pool.max-active=8    # 连接池最大阻塞等待时间(使用负值表示没有限制)  spring.redis.pool.max-wait=-1    # 连接池中的最大空闲连接  spring.redis.pool.max-idle=8    # 连接池中的最小空闲连接  spring.redis.pool.min-idle=0    # 连接超时时间(毫秒)  spring.redis.timeout=5000

 

1.4. 添加Service

package com.demo.service;    import com.demo.pojo.UserDetails;    /**   * Created by toutou on 2018/10/15.   */  public interface UserService {      UserDetails getUserDetailsByUid(int uid);      String getUserNameById(Integer uid);      void setUserNameById(Integer uid, String userName);  }

 

UserServiceImpl

package com.demo.service;    import com.demo.dao.UserDetailsMapper;  import com.demo.dao.UserPositionMapper;  import com.demo.pojo.UserDetails;  import com.demo.pojo.UserPosition;  import com.google.common.base.Strings;  import org.springframework.beans.factory.annotation.Autowired;  import org.springframework.data.redis.core.StringRedisTemplate;  import org.springframework.stereotype.Service;    import java.math.BigDecimal;  import java.util.List;    /**   * Created by toutou on 2018/10/15.   */  @Service  public class UserServiceImpl implements UserService{      @Autowired      UserDetailsMapper userDetailsMapper;        @Autowired      UserPositionMapper userPositionMapper;        @Autowired      StringRedisTemplate template;        static final String KEY_USER_INFO__NAME = "com_demo_user_info_007_%s";        public String getUserNameById(Integer uid){          String userName = "未知用户";          try {              userName = template.opsForValue().get(String.format(KEY_USER_INFO__NAME, uid));              if (Strings.isNullOrEmpty(userName)) {                  // Redis中没有就读数据库                  UserDetails userDetails = getUserDetailsByUid(uid);                  if (userDetails != null && !Strings.isNullOrEmpty(userDetails.getCity())) {                      userName = userDetails.getCity();                  }              }          }catch(Exception e){              System.out.println(e.toString());          }            return userName;        }        public void setUserNameById(Integer uid, String userName){          template.opsForValue().set(String.format(KEY_USER_INFO__NAME, uid), userName);      }        public UserDetails getUserDetailsByUid(int uid){          return userDetailsMapper.getUserDetailsByUid(uid);      }          }

 

1.5. 添加RedisController

package com.demo.controller;    import com.demo.service.UserService;  import lombok.extern.slf4j.Slf4j;  import org.springframework.beans.factory.annotation.Autowired;  import org.springframework.web.bind.annotation.RequestMapping;  import org.springframework.web.bind.annotation.RestController;  import redis.clients.jedis.Jedis;    /**   * Created by toutou on 2019/1/20.   */  @RestController  @Slf4j  public class RedisController {        @Autowired      UserService userService;        @RequestMapping(value = "/getusernamebyid")      public String getUserNameById(Integer uid)      {          return userService.getUserNameById(uid);      }        @RequestMapping(value = "/setusernamebyid")      public String setUserNameById(Integer uid, String uname)      {          userService.setUserNameById(uid, uname);          return "设置成功";      }        @RequestMapping(value = "/jedistest")      public String jedisTest(){          // 创建一个jedis对象          Jedis jedis = new Jedis("ip", 6379);          // 直接调用jedis对象的方法,方法名称和redis的命令一致          jedis.set("key1", "test01");          String key1 = jedis.get("key1");          System.out.println(key1 + " " + key1);          // 关闭jedis          jedis.close();          return key1;      }  }

 

注意jedisTest是我本地调试测试用的,可以忽略。

vRedis测试效果

SpringBoot(二十四)整合Redis

SpringBoot(二十四)整合Redis

v源码地址

https://github.com/toutouge/javademo/tree/master/hellospringboot


         作  者:请叫我头头哥          
         出  处:http://www.cnblogs.com/toutou/          
         关于作者:专注于基础平台的项目开发。如有问题或建议,请多多赐教!          
         版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。          
         特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我          
         声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是作者坚持原创和持续写作的最大动力!