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

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准时推送技术文章,让你的下班路不在孤单,而且每月还有送书流动,助你晋升硬实力!

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理