• SpringBoot进阶教程(五十二)整合Redis


    缓存现在几乎是所有中大型网站都在用的必杀技,合理的利用缓存不仅能够提升网站访问速度,还能大大降低数据库的压力。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/javademosecond/tree/master/hellospringboot


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

  • 相关阅读:
    意外发现在调用Activator.CreateInstance的时候在构造函数处加断点居然可以~~
    手机操作系统
    读取Excel文件到DataSet
    支持mrp软件的手机(MTK手机)检测
    如何查看手机系统版本
    .NET进度条用例
    dos命令导出指定类型的文件列表
    FTP上传下载 FTP操作类 FTPHelper 异步上传 递归创建文件文件夹
    批量删除GridView(DataGrid)选中项
    sql判断临时表是否存在
  • 原文地址:https://www.cnblogs.com/toutou/p/spring_boot_redis.html
Copyright © 2020-2023  润新知