在SpringBoot项目中配置Redis

这篇具有很好参考价值的文章主要介绍了在SpringBoot项目中配置Redis。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、前言

二、使用步骤

1. 引入start依赖

2. 在application.yml配置文件中做相应配置

3. 配置Redis序列化器

4. 将序列化器配置到redisTemplate中

5. 封装Redis操作工具类


一、前言

我们知道Redis适用于存储频繁使用的数据,因为Redis数据库是基于缓存的非关系数据库,相比较关系型数据库,查询的速度更快,但不适合表示复杂关系,那知道它这一特性,就会明白在实际项目中,会经常使用到Redis,就比如我最近做的博客项目,就是将文章浏览量存储到Redis中,因为每次都从数据库中去查询浏览量,肯定效率就不是很高了,所以我就在最开始就将文章的浏览量数据放到Redis中,每次也是更新的浏览量中的数据,再使用定时框架,定时的更新到数据库即可,另外秒杀的时候也要用到Redis,既然Redis使用这么频繁,那么该怎样使用Java语言操作Redis呢?接下来,我就讲一下在SpringBoot项目中如何配置Redis,下面我就简单说明步骤。

二、使用步骤

其实配置Redis和配置其它东西都差不多,既然使用了SpringBoot,基于自动配置,使用无非就是引依赖、然后在yml配置文件中做相应的配置即可,或者还可以使用配置类进行配置,有个时候可能还要启动一下,在启动类上面加个启动注解,使用Redis不需要这一步。

1. 引入start依赖

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

由于序列化方式依靠的是fastjson序列化框架,因此也要有fastjson依赖,如果没有使用自定义序列化,则这个不是必须的,另外如果基于的是其它第三方序列化框架,则添加对应的依赖即可

 <!--fastjson依赖-->
 <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.76</version>
 </dependency>

2. 在application.yml配置文件中做相应配置

spring:
  redis:
    # Redis本地服务器地址,注意要开启redis服务,即那个redis-server.exe
    host: localhost
    # Redis服务器端口,默认为6379.若有改动按改动后的来
    port: 6379
    #Redis服务器连接密码,默认为空,若有设置按设置的来
    password: 
    lettuce:
      pool:
        # 连接池最大连接数,若为负数则表示没有任何限制
        max-active: 8
        # 连接池最大阻塞等待时间,若为负数则表示没有任何限制
        max-wait: -1
        # 连接池中的最大空闲连接
        max-idle: 8

3. 配置Redis序列化器

public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T>
{
    @SuppressWarnings("unused")
    private ObjectMapper objectMapper = new ObjectMapper();

    //配置序列化与反序列化字符集
    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");

    private Class<T> clazz;

    //开启 fastjson 序列化库的自动类型支持功能,开启后,会在序列化或反序列化过程中自动添加类型信息,确保序列化与反序列化成功
    static
    {
        ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
    }

    public FastJson2JsonRedisSerializer(Class<T> clazz)
    {
        super();
        this.clazz = clazz;
    }

    //序列化过程,使用fastjson将对象转为字节数组
    @Override
    public byte[] serialize(T t) throws SerializationException
    {
        if (t == null)
        {
            return new byte[0];
        }
        //添加SerializerFeature.WriteClassName可以在序列化时,添加类型信息
        return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
    }

    //反序列化过程,将字节数组转为Java对象
    @Override
    public T deserialize(byte[] bytes) throws SerializationException
    {
        if (bytes == null || bytes.length <= 0)
        {
            return null;
        }
        String str = new String(bytes, DEFAULT_CHARSET);

        //解析为clazz类型的对象
        return JSON.parseObject(str, clazz);
    }

    public void setObjectMapper(ObjectMapper objectMapper)
    {
        Assert.notNull(objectMapper, "'objectMapper' must not be null");
        this.objectMapper = objectMapper;
    }

    protected JavaType getJavaType(Class<?> clazz)
    {
        return TypeFactory.defaultInstance().constructType(clazz);
    }
}

4. 将序列化器配置到redisTemplate中

@Configuration
public class RedisConfig {

        @Bean
        @SuppressWarnings(value = { "unchecked", "rawtypes" })
        public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory)
        {
            RedisTemplate<Object, Object> template = new RedisTemplate<>();
            template.setConnectionFactory(connectionFactory);

            FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);

            ObjectMapper mapper = new ObjectMapper();
            mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
            serializer.setObjectMapper(mapper);

            // 使用StringRedisSerializer来序列化和反序列化redis的key值
            template.setKeySerializer(new StringRedisSerializer());
            template.setValueSerializer(serializer);

            // Hash的key也采用StringRedisSerializer的序列化方式
            template.setHashKeySerializer(new StringRedisSerializer());
            template.setHashValueSerializer(serializer);

            template.afterPropertiesSet();
            return template;
        }
}

5. 封装Redis操作工具类

@Component
public class RedisCache
{
    @Autowired
    public RedisTemplate redisTemplate;

    /**
     * 缓存基本的对象,Integer、String、实体类等
     *
     * @param key 缓存的键值
     * @param value 缓存的值
     */
    public <T> void setCacheObject(final String key, final T value)
    {
        redisTemplate.opsForValue().set(key, value);
    }

    /**
     * 缓存基本的对象,Integer、String、实体类等
     *
     * @param key 缓存的键值
     * @param value 缓存的值
     * @param timeout 时间
     * @param timeUnit 时间颗粒度
     */
    public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit)
    {
        redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
    }

    /**
     * 设置有效时间
     *
     * @param key Redis键
     * @param timeout 超时时间
     * @return true=设置成功;false=设置失败
     */
    public boolean expire(final String key, final long timeout)
    {
        return expire(key, timeout, TimeUnit.SECONDS);
    }

    /**
     * 设置有效时间
     *
     * @param key Redis键
     * @param timeout 超时时间
     * @param unit 时间单位
     * @return true=设置成功;false=设置失败
     */
    public boolean expire(final String key, final long timeout, final TimeUnit unit)
    {
        return redisTemplate.expire(key, timeout, unit);
    }

    /**
     * 获得缓存的基本对象。
     *
     * @param key 缓存键值
     * @return 缓存键值对应的数据
     */
    public <T> T getCacheObject(final String key)
    {
        ValueOperations<String, T> operation = redisTemplate.opsForValue();
        return operation.get(key);
    }

    /**
     * 删除单个对象
     *
     * @param key
     */
    public boolean deleteObject(final String key)
    {
        return redisTemplate.delete(key);
    }

    /**
     * 删除集合对象
     *
     * @param collection 多个对象
     * @return
     */
    public long deleteObject(final Collection collection)
    {
        return redisTemplate.delete(collection);
    }

    /**
     * 缓存List数据
     *
     * @param key 缓存的键值
     * @param dataList 待缓存的List数据
     * @return 缓存的对象
     */
    public <T> long setCacheList(final String key, final List<T> dataList)
    {
        Long count = redisTemplate.opsForList().rightPushAll(key, dataList);
        return count == null ? 0 : count;
    }

    /**
     * 获得缓存的list对象
     *
     * @param key 缓存的键值
     * @return 缓存键值对应的数据
     */
    public <T> List<T> getCacheList(final String key)
    {
        return redisTemplate.opsForList().range(key, 0, -1);
    }

    /**
     * 缓存Set
     *
     * @param key 缓存键值
     * @param dataSet 缓存的数据
     * @return 缓存数据的对象
     */
    public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet)
    {
        BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key);
        Iterator<T> it = dataSet.iterator();
        while (it.hasNext())
        {
            setOperation.add(it.next());
        }
        return setOperation;
    }

    /**
     * 获得缓存的set
     *
     * @param key
     * @return
     */
    public <T> Set<T> getCacheSet(final String key)
    {
        return redisTemplate.opsForSet().members(key);
    }

    /**
     * 缓存Map
     *
     * @param key
     * @param dataMap
     */
    public <T> void setCacheMap(final String key, final Map<String, T> dataMap)
    {
        if (dataMap != null) {
            redisTemplate.opsForHash().putAll(key, dataMap);
        }
    }

    /**
     * 获得缓存的Map
     *
     * @param key
     * @return
     */
    public <T> Map<String, T> getCacheMap(final String key)
    {
        return redisTemplate.opsForHash().entries(key);
    }

    /**
     * 往Hash中存入数据
     *
     * @param key Redis键
     * @param hKey Hash键
     * @param value 值
     */
    public <T> void setCacheMapValue(final String key, final String hKey, final T value)
    {
        redisTemplate.opsForHash().put(key, hKey, value);
    }

    /**
     * 获取Hash中的数据
     *
     * @param key Redis键
     * @param hKey Hash键
     * @return Hash中的对象
     */
    public <T> T getCacheMapValue(final String key, final String hKey)
    {
        HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash();
        return opsForHash.get(key, hKey);
    }

    /**
     * 删除Hash中的数据
     * 
     * @param key
     * @param hkey
     */
    public void delCacheMapValue(final String key, final String hkey)
    {
        HashOperations hashOperations = redisTemplate.opsForHash();
        hashOperations.delete(key, hkey);
    }

    /**
     * 获取多个Hash中的数据
     *
     * @param key Redis键
     * @param hKeys Hash键集合
     * @return Hash对象集合
     */
    public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys)
    {
        return redisTemplate.opsForHash().multiGet(key, hKeys);
    }

    /**
     * 获得缓存的基本对象列表
     *
     * @param pattern 字符串前缀
     * @return 对象列表
     */
    public Collection<String> keys(final String pattern)
    {
        return redisTemplate.keys(pattern);
    }

    /**
     * 为Redis中value对应的map增加value
     * @param key 键值
     * @param hKey value-map对应的键值
     * @param v value-map 对应的value值
     */
    public void incrementCacheMapValue(String key,String hKey,int v){
        redisTemplate.boundHashOps(key).increment(hKey, v);
    }
}

如果大家对Redis的序列化还想进一步了解的化,可以参考我的另外一篇文章

https://blog.csdn.net/m0_63445035/article/details/130371592?spm=1001.2014.3001.5502文章来源地址https://www.toymoban.com/news/detail-594875.html

到了这里,关于在SpringBoot项目中配置Redis的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot连接远程服务器redis

    进入redis安装地址,我这里安装的是 /usr/local/src/redis-6.2.6 先copy一份配置文件 然后修改配置文件信息 vim redis.conf 启动redis 去云服务器安全组中开放端口 重启防火墙 查看6379的防火墙状态 1、Spring-redis依赖 2、配置redis的信息 3、运行

    2024年01月19日
    浏览(61)
  • 配置redis.conf 使其他电脑连接本机redis

    配置步骤 打开redis.conf redis.conf 文件中把 bind 127.0.0.1 注释掉,或者改为: bind 0.0.0.0 ,并将 protected-mode yes   改为 protected-mode no   附注: bind:是绑定本机的IP地址,(准确的是:本机的网卡对应的IP地址,每一个网卡都有一个IP地址),而不是redis允许来自其他计算机的IP地址

    2024年02月09日
    浏览(43)
  • SpringBoot连接Redis失败报错:Unable to connect to Redis; (小白篇)

    学习redis一段时间了,现在开始使用springboot整合redis,实现Java与redis数据库的连接与一系列的使用。 但刚开始就给我来了个下马威,直接寄,连接不上redis,在swagger的报错如下: Unable to connect to Redis; nested exception is org.springframework.data.redis.connection.PoolException: Could not get a reso

    2024年02月07日
    浏览(61)
  • SpringBoot集成Lettuce连接Redis方法和案例

    说明: SpringBoot从2.0起默认使用lettuce客户端进行连接。 此次使用的版本:springboot:2.6.6,lettuce:6.1.8。 Springboot+Lettuce 单连方式 连接Redis单机/主备/Proxy集群示例。 1、在application.properties配置文件中加上redis相关配置。  2、Redis配置类RedisConfiguration。 3、Redis操作类RedisUtil。 4、

    2024年02月08日
    浏览(42)
  • 异常:Springboot中redis使用lettuce连接池经常连接超时解决

    环境 依赖 配置 1. 问题点:项目启动后,一段时间过后redis自动掉线 2. 问题分析: 这是lettuce-core的实现里,有类似心跳机制的保持长连接方式,不过心跳机制是不停的来回发心跳包直到连接不可用再去被动重新连接,而lettuce的方案是将连接池里处于空闲(idle)状态的client每

    2024年02月11日
    浏览(58)
  • Redis 安装以及配置隧道连接

    目录 1.CentOS 1. 安装Redis 2. Redis 启动和停⽌ 3. 操作Redis 2.Ubuntu 1. 安装Redis 2. Redis 启动/停⽌ 3. 操作 Redis 3.开启隧道 3.1 Xshell 配置隧道 3.2 windTerm 配置隧道  3.3 FinalShell配置隧道  4.可视化客户端连接 Another Redis Desktop Manager 1.CentOS 1. 安装Redis 2. Redis 启动和停⽌ 3. 操作Redis   2.Ubun

    2024年02月14日
    浏览(40)
  • 【服务器】Java连接redis及使用Java操作redis、使用场景

    在你的项目里面导入redis的pom依赖 连接redis 以下数据类型基本上涵盖了各种常见的数据存储需求,而且 Redis 的数据类型支持多种高级操作,因此特别适用于 快速、可靠、实时 的数据访问场景。 字符串(String) :最基本的数据类型,可以包含 任何数据 ,包括 二进制数据 。

    2024年02月06日
    浏览(57)
  • 【项目搭建三】SpringBoot引入redis

    本文使用spring data redis访问和操作redis,pom文件中加入以下依赖: application.yml中添加以下配置: 注: spring data redis中,可以配置lettuce或jedis作为客户端的连接池。springBoot 2.x默认使用的是lettuce。如果你使用jedis作为连接池,需定义一个JedisConnectionFactory注入到RedisTemplate中,但是

    2024年01月21日
    浏览(35)
  • 基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖集成Redis(九)

    1.1 Redis的Java客户端 Redis 的 Java 客户端很多,常用的几种: Jedis Lettuce Spring Data Redis Spring 对 Redis 客户端进行了整合,提供了 Spring Data Redis,在Spring Boot项目中还提供了对应的Starter,即 spring-boot-starter-data-redis。 1.2 Spring Data Redis使用方式 1.2.1 介绍 Spring Data Redis 是 Spring 的一部分

    2024年02月05日
    浏览(53)
  • Redis安装以及配置隧道连接(centOs)

    目录 1.centOs安装Redis 2. Redis 启动和停⽌ 3. 操作Redis 2.Xshell配置隧道 1.修改 /etc/redis/redis.conf 修改 bind 127.0.0.1 为 bind 0.0.0.0 修改 protected-mode yes 为 protected-mode no 使⽤命令“redis-cli shutdown\\\"先关闭redis 服务, 再使⽤“redis-server /etc/redis.conf ”启动redis 服务       全部配置之后, 需要

    2024年02月14日
    浏览(92)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包