Redis(十七)-SpringBoot集成Redis

Posted 码农飞哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis(十七)-SpringBoot集成Redis相关的知识,希望对你有一定的参考价值。

您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦
💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通
❤️ 2. Python爬虫专栏,系统性的学习爬虫的知识点。9.9元买不了吃亏,买不了上当 。python爬虫入门进阶
❤️ 3. Ceph实战,从原理到实战应有尽有。 Ceph实战
❤️ 4. Java高并发编程入门,打卡学习Java高并发。 Java高并发编程入门
😁 5. 社区逛一逛,周周有福利,周周有惊喜。码农飞哥社区,飞跃计划
全网同名【码农飞哥】欢迎关注,个人VX: wei158556

文章目录

简介

SpringBoot是一个开发基于Spring框架的应用的快速开发框架,它也是SpringCloud构建微服务分布式系统的基础设施。
本文将重点介绍如何在SpringBoot项目中集成Redis。

1. 创建SpringBoot项目

  1. 打开IDEA 选中: File—>New—>Module
  2. 进入创建模型的页面,选择 Spring Initializr
  3. 点击Next,输入包路径 com.jay,项目名spring_boot_redis。
  4. 接着点击Next,选择如下两个依赖。
    这样就创建了一个名为spring_boot_redis的SpringBoot项目。

2. 在pom.xml中添加依赖

在pom文件中引入redis的依赖和common-pool2依赖。

    <!--引入redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!--spring 2.x 集成redis所需common-pool2-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.6.2</version>
        </dependency>
          <!--序列化值时使用-->
  <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
        </dependency>

3. 设置配置类

为了方便配置,这里将application.properties文件改成application.yml文件,这里主要设置redis的主机,端口号,数据库名等。

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    database: 0
    connect-timeout: 1800000  #连接超时时间30分钟
    lettuce:
      pool:
        max-active: 20  #连接池最大连接数
        max-idle: 8 #最大空闲连接
        min-idle: 0 #最小空闲连接

4. 设置配置类

配置类的作用就是用来生成RedisTemplate的实例。其中,@Configuration 注解用于指定该类是一个配置类。这里指定Redis的序列化方式采用string的序列化方式。而不是采用JDK序列化方式。

@Configuration
public class RedisConfig 
    @Bean
    @Primary
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) 
        try 
            // 测试连通性
            factory.getConnection();
         catch (RedisConnectionFailureException e) 
            System.out.println("未发现redis服务。");
        
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        //采用string的序列化方式
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        redisTemplate.setConnectionFactory(factory);
        return redisTemplate;
    

5. 定义工具类

直接操作redisTemplate类可能比较麻烦,所以,这里定义了一个工具类来操作Redis。该工具类定义了操作String,list,set,zset,hash等数据类型的各种方法。

package com.jay;

import com.google.gson.Gson;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ScanOptions;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * Redis工具类
 */
@Component
public class RedisUtils 

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    /**
     * 默认过期时长,单位:秒
     */
    public static final long DEFAULT_EXPIRE = 60 * 60 * 24L;
    /**
     * 不设置过期时长
     */
    public static final long NOT_EXPIRE = -1;
    private static final Gson gson = new Gson();


    //获取redis的值,字符串
    public <T> T get(String key, Class<T> clazz) 
        Object value = redisTemplate.opsForValue().get(key);
        if (value != null) 
            return fromJson(value.toString(), clazz);
        
        return null;
    



    public void set(String key, Object value, long expire) 
        if (expire != NOT_EXPIRE) 
            redisTemplate.opsForValue().set(key, value, expire);
         else 
            redisTemplate.opsForValue().set(key, value);
        
    


    public void set(String key, Object value) 
        set(key, value, DEFAULT_EXPIRE);
    

    // add new function since 2.22.22

    /** -------------------key相关操作--------------------- */

    /**
     * 删除key
     *
     * @param key
     */
    public void delete(String key) 
        redisTemplate.delete(key);
    

    /**
     * 批量删除key
     *
     * @param keys
     */
    public void delete(Collection<String> keys) 
        redisTemplate.delete(keys);
    

    /**
     * 序列化key
     *
     * @param key
     * @return
     */
    public byte[] dump(String key) 
        return redisTemplate.dump(key);
    

    /**
     * 是否存在key
     *
     * @param key
     * @return
     */
    public Boolean hasKey(String key) 
        return redisTemplate.hasKey(key);
    

    /**
     * 设置过期时间
     *
     * @param key
     * @param timeout
     * @param unit
     * @return
     */
    public Boolean expire(String key, long timeout, TimeUnit unit) 
        return redisTemplate.expire(key, timeout, unit);
    

    /**
     * 设置过期时间
     *
     * @param key
     * @param date
     * @return
     */
    public Boolean expireAt(String key, Date date) 
        return redisTemplate.expireAt(key, date);
    

    /**
     * 查找匹配的key
     *
     * @param pattern
     * @return
     */
    public Set<String> keys(String pattern) 
        return redisTemplate.keys(pattern);
    

    /**
     * 将当前数据库的 key 移动到给定的数据库 db 当中
     *
     * @param key
     * @param dbIndex
     * @return
     */
    public Boolean move(String key, int dbIndex) 
        return redisTemplate.move(key, dbIndex);
    

    /**
     * 移除 key 的过期时间,key 将持久保持
     *
     * @param key
     * @return
     */
    public Boolean persist(String key) 
        return redisTemplate.persist(key);
    

    /**
     * 返回 key 的剩余的过期时间
     *
     * @param key
     * @param unit
     * @return
     */
    public Long getExpire(String key, TimeUnit unit) 
        return redisTemplate.getExpire(key, unit);
    

    /**
     * 返回 key 的剩余的过期时间
     *
     * @param key
     * @return
     */
    public Long getExpire(String key) 
        return redisTemplate.getExpire(key);
    

    /**
     * 从当前数据库中随机返回一个 key
     *
     * @return
     */
    public String randomKey() 
        return redisTemplate.randomKey();
    

    /**
     * 修改 key 的名称
     *
     * @param oldKey
     * @param newKey
     */
    public void rename(String oldKey, String newKey) 
        redisTemplate.rename(oldKey, newKey);
    

    /**
     * 仅当 newkey 不存在时,将 oldKey 改名为 newkey
     *
     * @param oldKey
     * @param newKey
     * @return
     */
    public Boolean renameIfAbsent(String oldKey, String newKey) 
        return redisTemplate.renameIfAbsent(oldKey, newKey);
    

    /**
     * 返回 key 所储存的值的类型
     *
     * @param key
     * @return
     */
    public DataType type(String key) 
        return redisTemplate.type(key);
    

    /** -------------------string相关操作--------------------- */

    /**
     * 返回 key 中字符串值的子字符
     *
     * @param key
     * @param start
     * @param end
     * @return
     */
    public String getRange(String key, long start, long end) 
        return redisTemplate.opsForValue().get(key, start, end);
    

    /**
     * 将给定 key 的值设为 value ,并返回 key 的旧值(old value)
     *
     * @param key
     * @param value
     * @return
     */
    public Object getAndSet(String key, Object value) 
        return String.valueOf(redisTemplate.opsForValue().getAndSet(key, value));
    


    /**
     * 批量获取
     *
     * @param keys
     * @return
     */
    public List<Object> multiGet(Collection<String> keys) 
        return redisTemplate.opsForValue().multiGet(keys);
    

    /**
     * 设置ASCII码, 字符串'a'的ASCII码是97, 转为二进制是'01100001', 此方法是将二进制第offset位值变为value
     *
     * @param key
     * @param offset 位置
     * @param value  值,true为1, false为0
     * @return
     */
    public boolean setBit(String key, long offset, boolean value) 
        return redisTemplate.opsForValue().setBit(key, offset, value);
    

    /**
     * 将值 value 关联到 key ,并将 key 的过期时间设为 timeout
     *
     * @param key
     * @param value
     * @param timeout 过期时间
     * @param unit    时间单位, 天:TimeUnit.DAYS 小时:TimeUnit.HOURS 分钟:TimeUnit.MINUTES
     *                秒:TimeUnit.SECONDS 毫秒:TimeUnit.MILLISECONDS
     */
    public void setEx(String key, Object value, long timeout, TimeUnit unit) 
        redisTemplate.opsForValue().set(key, value, timeout, unit);
    

    /**
     * 只有在 key 不存在时设置 key 的值
     *
     * @param key
     * @param value
     * @return 之前已经存在返回false, 不存在返回true
     */
    public boolean setIfAbsent(String key, Object value) 
        return redisTemplate.opsForValue().setIfAbsent(key, value);
    

    /**
     * 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始
     *
     * @param key
     * @param value
     * @param offset 从指定位置开始覆写
     */
    public void setRange(String key, Object value, long offset) 
        redisTemplate.opsForValue().set(key, value, offset);
    

    /**
     * 获取字符串的长度
     *
     * @param key
     * @return
     */
    public Long size(String key) 
        return redisTemplate.opsForValue().size(key);
    

    /**
     * 批量添加
     *
     * @param maps
     */
    public void multiSet(Map<String, Object> maps) 
        redisTemplate.opsForValue().multiSet(maps);
    

    /**
     * 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在
     *
     * @param maps
     * @return 之前已经存在返回false, 不存在返回true
     */
    public boolean multiSetIfAbsent(Map<String, Object> maps) 
        return redisTemplate.opsForValue().multiSetIfAbsent(maps);
    

    /**
     * 增加(自增长), 负数则为自减
     *
     * @param key
     * @param increment
     * @return
     */
    public Long incrBy(String key, long increment) 
        return redisTemplate.opsForValue().increment(key, increment);
    

    /**
     * @param key
     * @param increment
     * @return
     */
    public Double incrByFloat(String key, double increment) 
        return redisTemplate.opsForValue().increment(key, increment);
    

    /**
     * 追加到末尾
     *
     * @param key
     * @param value
     * @return
     */
    public Integer append(String key, String value) 
        return redisTemplate.opsForValue().append(key, value);
    

    /** -------------------hash相关操作------------------------- */

    /**
     * 获取存储在哈希表中指定字段的值
     *
     * @param key
     * @param field
     * @return
     */
    public Object hGet(String key, String field) 
        return redisTemplate.opsForHash().get(key, field);
    

    /**
     * 获取所有给定字段的值
     *
     * @param key
     * @return
     */
    public Map<Object, Object> hGetAll(String key) 
        return redisTemplate.opsForHash().entries(key);
    

    /**
     * 获取所有给定字段的值
     *
     * @param key
     * @param fields
     * @return
     */
    public List<Object> hMultiGet(String key, Collection<Object> fields) 
        return redisTemplate.opsForHash().multiGet(key, fields);
    

    public void hPut(String key, String hashKey, String value) 
        redisTemplate.opsForHash().put(key, hashKey, value);
    

    public void hPutAll(String key, Map<String, String> maps) 
        redisTemplate.opsForHash().putAll(key, maps);
    

    /**
     * 仅当hashKey不存在时才设置
     *
     * @param key
     * @param hashKey
     * @param value
     * @return
     */
    public Boolean hPutIfAbsent(String key, String hashKey, String value) 
        return redisTemplate.opsForHash().putIfAbsent(key, hashKey, value);
    

    /**
     * 删除一个或多个哈希表字段
     *
     * @param key
     * @param fields
     * @return
     */
    public Long hDelete(String key, Object... fields) 
        return redisTemplate.opsForHash().delete(key, fields);
    

    /**
     * 查看哈希表 key 中,指定的字段是否存在
     *
     * @param key
     * @param field
     * @return
     */
    public boolean hExists(String key, String field) 
        return redisTemplate.opsForHash().hasKey(key, field);
    (十七)ATP应用测试平台——自定义实现一个springboot2的线程池启动器starter

(十七)ATP应用测试平台——自定义实现一个springboot2的线程池启动器starter

Springbootspring-boot-starter-redis包报错 :unknown

SpringBoot 集成Redisson 提示:java.lang.ClassNotFoundException: **.redis.connection.ReactiveRedisConnec

SpringBoot集成SpringSecurity(十七手机号登录)

SpringBoot整合redis(源码)