关于java:springbootroute十二整合redis做为缓存

51次阅读

共计 3366 个字符,预计需要花费 9 分钟才能阅读完成。

redis 简介

redis 作为一种非关系型数据库,读写十分快,利用非常宽泛,它采纳 key-value 的模式存储数据,value 罕用的五大数据类型有 string(字符串),list(链表),set(汇合),zset(有序汇合)和 hash(哈希表)。

redis 的个性决定了它的性能,它能够用来做以下这些事件!

  1. 排行榜,利用 zset 能够不便的实现排序功能
  2. 计数器,利用 redis 中原子性的自增操作,能够统计到浏览量,点赞量等性能
  3. 简略音讯队列,list 存储构造,满足先进先出的准则,能够应用 lpush/rpop 或 rpush/lpop 实现简略音讯队列
  4. session 共享,分布式系统中,能够利用 redis 实现 session 共享。spring 官网提供的分布式解决方案 Spring Session 就是利用 redis 实现的。

Spring Boot 对 redis 也实现自动化拆卸,应用十分不便。

Spring Boot 整合 redis

1. 引入 redis 依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
           <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
    </dependency>
</dependencies>

2. 配置 redis 相干信息

spring:
  redis:
    # redis 库
    database: 0
    # redis 服务器地址
    host: localhost
    # redis 端口号
    port: 6379
    # redis 明码
    password:
    # 连贯超时工夫(毫秒)timeout: 1000
    lettuce:
      pool:
        # 连接池最大链接数(正数示意没有限度)max-active: 8
        # 连接池最大阻塞等待时间(正数示意没有限度)max-wait: -1
        # 连接池最大闲暇连接数
        max-idle: 8
        # 连接池最小闲暇连接数
        min-idle: 0

3. 操作 redis

SpringBoot 提供了两个 bean 来操作 redis,别离是RedisTemplateStringRedisTemplate,这两者的次要区别如下。

RedisTemplate应用的是JdkSerializationRedisSerializer 存入数据会将数据先序列化成字节数组而后在存入 Redis 数据库。

StringRedisTemplate应用的是 StringRedisSerializer。

上面一起来看看成果:

@RestController
public class RedisDemo {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @GetMapping("redisTmeplateData")
    public void redisTemplateData(){redisTemplate.opsForValue().set("name","Java 旅途");
    }

    @GetMapping("stringRedisTemplateData")
    public void stringRedisTemplateData(){stringRedisTemplate.opsForValue().set("desc","保持分享 java 技术栈");
    }
}

第一个办法存入的数据如下图

第二个办法存入的数据如下图

因为 RedisTemplate 是序列化成字节数组存储的,因而在 redis 客户端的可读性并不好。

主动缓存

@Cacheable能够标记在一个办法上,也能够标记在一个类上。当标记在一个办法上时示意该办法是反对缓存的,当标记在一个类上时则示意该类所有的办法都是反对缓存的。

如果增加了 @Cacheable 注解,那么办法被调用后,值会被存入 redis,下次再调用的时候会间接从 redis 中取值返回。

@GetMapping("getStudent")
@Cacheable(value = "student:key")
public Student getStudent(){log.info("我不是缓存,我是 new 的对象!");
    Student student = new Student("Java 旅途",26);
    return student;
}

记得要开启缓存,在启动类加上 @EnableCaching 注解

拜访下面的办法,如果不打印日志,则是从缓存中获取的值。

封装 redisUtils

RedisTemplate 提供了很多办法来操作 redis,然而找起来比拟麻烦,为了更好的操作 redis,个别会封装 redisUtils 来满足业务开发。这里简略封装几个做个示例,如果开发中有需要能够本人封装。

public class RedisUtils {

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 一般存入
     * @param key
     * @param value
     * @return
     */
    public boolean set(String key,Object value){
        try {redisTemplate.opsForValue().set(key,value);
            return true;
        }catch (Exception e){e.printStackTrace();
            return false;
        }
    }

    /**
     * 一般获取 key
     * @param key
     * @return
     */
    public Object get(String key){return key == null ? null : redisTemplate.opsForValue().get(key);
    }

    /**
     * 存入 key,设置过期时长
     * @param key
     * @param value
     * @param time
     * @return
     */
    public boolean set(String key,Object value,long time){
        try {if(time > 0){redisTemplate.opsForValue().set(key,value,time, TimeUnit.SECONDS);
            }else{redisTemplate.opsForValue().set(key,value);
            }
            return true;
        }catch (Exception e){e.printStackTrace();
            return false;
        }
    }

    /**
     * 判断 key 是否存在
     * @param key
     * @return
     */
    public boolean exists(String key){
        try {return redisTemplate.hasKey(key);
        }catch (Exception e){e.printStackTrace();
            return false;
        }
    }

    /**
     * 删除 key
     * @param key
     */
    public void del(String key){
        try {if(key != null && key.length() > 0){redisTemplate.delete(key);
            }
        }catch (Exception e){e.printStackTrace();
        }
    }
}

此是 spring-boot-route 系列的第十二篇文章,这个系列的文章都比较简单,次要目标就是为了帮忙首次接触 Spring Boot 的同学有一个零碎的意识。本文已收录至我的 github,欢送各位小伙伴star

github:https://github.com/binzh303/s…

点关注、不迷路

如果感觉文章不错,欢送 关注 点赞 珍藏,你们的反对是我创作的能源,感激大家。

如果文章写的有问题,请不要悭吝,欢送留言指出,我会及时核查批改。

如果你还想更加深刻的理解我,能够微信搜寻「Java 旅途」进行关注。回复「1024」即可取得学习视频及精美电子书。每天 7:30 准时推送技术文章,让你的下班路不在孤单,而且每月还有送书流动,助你晋升硬实力!

正文完
 0