zoukankan      html  css  js  c++  java
  • Spring Boot2(三):使用Spring Boot2集成Redis缓存

    本文在个人技术博客【鸟不拉屎】同步发布,详情可猛戳 亦可扫描文章末尾二维码关注个人公众号【鸟不拉屎】

    前言

    前面一节总结了SpringBoot实现Mybatis的缓存机制,但是实际项目中很少用到Mybatis的二级缓存机制,反而用到比较多的是第三方缓存Redis

    Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。

    安装启动Redis

    安装Redis的就不讲太多了,直接去官方下载redis,下载Redis-x64-3.2.100.zip,cmd,在redis目录下输入:redis-server.exe redis.windows.conf启动即可

    另外可以通过Redis桌面客户端可视化连接工具操作:redisdesktop

    代码部署

    快速建立Spring Boot项目

    添加redis依赖

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

    application.yml配置

    spring:
      redis:
        host: 127.0.0.1
        database: 0
        password:
        port: 6379
        jedis:
          pool:
            max-active: 1000  # 连接池最大连接数(使用负值表示没有限制)
            max-wait: -1ms  # 连接池最大阻塞等待时间(使用负值表示没有限制)
            max-idle: 10  # 连接池中的最大空闲连接
            min-idle: 5 # 连接池中的最小空闲连接
    

    RedisConfig配置类

    @Autowired
    private RedisConnectionFactory factory;
    
    /**
     *
     * @return
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        //更改在redis里面查看key编码问题
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
        redisTemplate.setConnectionFactory(factory);
        return redisTemplate;
    }
    

    RedisUtils工具类

    @Autowired
    private RedisTemplate redisTemplate;
    // 简单的K-V操作
    @Resource(name="redisTemplate")
    private ValueOperations<String, String> valueOperations;
    
    // 针对Map类型的数据操作
    @Resource(name="redisTemplate")
    private HashOperations<String, String, Object> hashOperations;
    
    // 针对List类型的数据操作
    @Resource(name="redisTemplate")
    private ListOperations<String, Object> listOperations;
    
    // set类型数据操作
    @Resource(name="redisTemplate")
    private SetOperations<String, Object> setOperations;
    
    // zset类型数据操作
    @Resource(name="redisTemplate")
    private ZSetOperations<String, Object> zSetOperations;
    

    实体类SysCodeEntity

    @Data
    public class SysCodeEntity implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        private int id;
    
        // 分类编码
        private String kindCode;
    
        // 分类名称
        private String kindName;
    
        // CODE编码
        private String code;
    	......
    }
    

    ServiceImpl实现类

    /**
     * 查询所有数字字典
     * @return
     */
    @Override
    public List<SysCodeEntity> queryCodeAll() {
        logger.info("先从缓存中查找,如果没有则去数据进行查询");
        List<SysCodeEntity> codeList = (List<SysCodeEntity>)redisTemplate.opsForList().leftPop("codeList");
        if (codeList == null) {
            logger.info("说明缓存中没有数据,则到数据库中查询");
            codeList = sysCodeDao.queryCodeAll();
    
            logger.info("将数据库获取的数据存入缓存");
            redisTemplate.opsForList().leftPush("codeList", codeList);
        } else {
            logger.info("则说明缓存中存在,直接从缓存中获取数据");
        }
        logger.info("codeList=" + codeList);
        return codeList;
    }
    

    上面例子具体解释已经在注释中体现,通过opsForList的leftPop和leftPush存入和获取Redis缓存的数据。

    Controller层实现

    /**
     * 查询所有数字字典
     * @return
     */
    @RequestMapping("/getAll")
    private List<SysCodeEntity> getUser() {
        Long startTime = System.currentTimeMillis(); //开始时间
        List<SysCodeEntity> codeList = sysCodeService.queryCodeAll();
        Long endTime = System.currentTimeMillis(); //结束时间
        System.out.println("查询数据库--共耗时:" + (endTime - startTime) + "毫秒"); //1007毫秒
        return codeList;
    }
    

    Postman进行测试

    http://localhost:8080/getAll
    

    日志信息

    总结和扩展

    1、Redis支持:字符串String、哈希Hash、列表List、集合Set、有序集合Sorted Set、发布订阅Pub/Sub、事务Transactions,7种数据类型

    2、Redis实用场景:缓存系统、计数器、消息列队系统、排行版及相关问题、社交网络、按照用户投票和时间排序、过期项目处理、实时系统

    3、Redis的高级功能:慢查询(内部执行时间超过某个指定的时限查询)、PipeLine管道(降低客户端与redis通信次数,适用于批处理)、BitMap位图(针对大数据量设计)、HyperLogLog(极小空间完成独立数据统计)、发布订阅、消息队列、GEO地理位置存储

    4、Redis持久化:

    ​ 快照RDB(使用快照,一种半持久耐用模式。不时的将数据集以异步方式从内存以RDB格式写入硬盘)

    ​ 日志AOF(1.1版本开始使用更安全的AOF格式替代,一种只能追加的日志类型。将数据集修改操作记录起来。Redis能够在后台对只可追加的记录作修改来避免无限增长的日志)

    5、Redis分布式解决方案:主从复制、集群...

    示例代码-github

    后期持续探索Redis技术 To be continued...

    推荐阅读:Redis 入门到分布式实践


    关于作者:

    个人博客:鸟不拉屎

    github主页:niaobulashi

    github博客:鸟不拉屎

    掘金:鸟不拉屎

    博客园:鸟不拉屎

    知乎:鸟不拉屎

  • 相关阅读:
    Linux 学习之DNS服务器
    Windows系统镜像自动添加驱动程序
    Linux下集群的搭建
    Heartbeat+LVS构建高可用负载均衡集群
    Keepalived高可用集群搭建(转载linuxIDC)
    CentOS 7.x设置自定义开机启动,添加自定义系统服务
    代码改变世界
    Vim食用指南
    Hibernate三种状态详解
    MySQL服务器的安装与配置
  • 原文地址:https://www.cnblogs.com/niaobulashi/p/spring-boot-redis.html
Copyright © 2011-2022 走看看