Redis设置database不生效的解决方案

 更新时间:2023年08月16日 09:17:09   作者:家有娇妻张兔兔  
最近在做redis缓存设置的时候,发现即使已经设置了database, 但是存数据的时候还是用的默认0数据库,所以本文就给大家介绍了Redis设置database不生效的解决方案,需要的朋友可以参考下

在这里插入图片描述

前言

事情是这样的 今天在拉取了同事的代码做redis缓存设置的时候,发现即使已经设置了database, 但是存数据的时候还是用的默认0数据库。这引起了我的好奇,遂开始琢磨是什么情况造成的这种现象。

配置

在这里插入图片描述

上述仅为测试代码问题,为了便于维护可以这么写,

spring:
  redis:
    host: ${REDIS_HOST:localhost}
    port: ${REDIS_PORT:6379}
    password: ${REDIS_PASSWORD:}
    database: ${REDIS_DATABASE:0}

加载类

然后通过RedisConfiguration 加载

@ConfigurationProperties("spring.redis")
public class RedisConfiguration {
	private String host;
	private int port;
	private String password;
	private int database;
    // getters and setters...
}

问题

上网找了一系列的文章都没解决,后来仔细观察研究发现是database多了个空格,正确的该是这样,没想到一个空格浪费了这么多时间

在这里插入图片描述

信心满满的以为这就万事大吉了,结果一运行发现依然不可以,后又开始检查,最后发现是少了几个依赖

在这里插入图片描述

发现没有引入commons-pool2依赖,加上了依赖之后再运行发现已经切换了也可以引入lettuce-core 依赖

<!-- lettuce-core -->
<dependency>
    <groupId>io.lettuce.core</groupId>
    <artifactId>lettuce-core</artifactId>
</dependency>

在这里插入图片描述

commons-pool 对象池

引入Commons Pool对象池,用于缓存Redis连接的原因是因为Lettuce本身是基于Netty的异步驱动,在异步访问时并不需要创建连接池,但基于Servlet模型的同步访问时,连接池是有必要的。目的是为了复用对象,以减少创建对象的开销,所以一定记得要加这个依赖。

/**
* Creates an instance that can be served by the pool and wrap it in a
* {@link PooledObject} to be managed by the pool.
*
* @return a {@code PooledObject} wrapping an instance that can be served by the pool
*
* @throws Exception if there is a problem creating a new instance,
*    this will be propagated to the code requesting an object.
*/
PooledObject makeObject()throws Exception;
/**
* Destroys an instance no longer needed by the pool.
* <p>* It is important for implementations of this method to be aware that there
* is no guarantee about what state <code>obj</code>will be in and the
* implementation should be prepared to handle unexpected errors.
* </p> * <p>* Also, an implementation must take in to consideration that instances lost
* to the garbage collector may never be destroyed.
* </p>*
* @param p a {@code PooledObject} wrapping the instance to be destroyed
*
* @throws Exception should be avoided as it may be swallowed by
*    the pool implementation.
*
* @see #validateObject
* @see ObjectPool#invalidateObject
*/
void destroyObject(PooledObject p)throws Exception;
/**
* Ensures that the instance is safe to be returned by the pool.
*
* @param p a {@code PooledObject} wrapping the instance to be validated
*
* @return <code>false</code> if <code>obj</code>is not valid and should
*        be dropped from the pool, <code>true</code>otherwise.
*/
boolean validateObject(PooledObject p);
/**
* Reinitializes an instance to be returned by the pool.
*
* @param p a {@code PooledObject} wrapping the instance to be activated
*
* @throws Exception if there is a problem activating <code>obj</code>,
*    this exception may be swallowed by the pool.
*
* @see #destroyObject
*/
void activateObject(PooledObject p)throws Exception;
/**
* Uninitializes an instance to be returned to the idle object pool.
*
* @param p a {@code PooledObject} wrapping the instance to be passivated
*
* @throws Exception if there is a problem passivating <code>obj</code>,
*    this exception may be swallowed by the pool.
*
* @see #destroyObject
*/
void passivateObject(PooledObject p)throws Exception;

注意:  

Jedis 和Lettuce 是Java 操作Redis 的客户端。

在Spring Boot 1.x 版本默认使用的是Jedis ,而在Spring Boot 2.x 版本默认使用的就是Lettuce。所以如果你用的是1.x版本的话 需要把 RedisConnectionFactory factory 替换为LettuceConnectionFactory lettuceConnectionFactory同时在依赖中排除lettuce的jar 改为用jedis

在这里插入图片描述

对比

commons-pool2 lettuce-core 都是在处理 Redis 连接池方面常用的依赖,但它们有不同的设计和适用场景,因此在选择使用哪个依赖时需要根据具体情况进行权衡。

commons-pool2 是 Apache Commons 项目中的一个组件,用于实现通用的对象池。它不仅仅适用于 Redis 连接池,还可以用于其他对象的池化管理。 commons-pool2 的设计比较通用,允许你管理任意类型的对象池,因此可以更灵活地适应不同的场景。如果你的项目需要管理多个类型的对象池,或者你希望在 Redis 之外使用对象池功能,那么选择 commons-pool2 是一个不错的选择。

另一方面, lettuce-core 是一个专门为 Redis 设计的客户端库。它提供了丰富的功能和性能优化,专注于提供高效的 Redis 连接和操作。 lettuce-core 自带了连接池的功能,你可以使用它内置的连接池来管理 Redis 连接,无需额外的依赖。

所以,选择使用 commons-pool2 还是 lettuce-core 取决于你的项目需求:

  • 如果你只需要管理 Redis 连接池,而不需要通用的对象池功能,那么使用 lettuce-core 内置的连接池可能更为方便和简洁。
  • 如果你的项目需要管理多个类型的对象池,或者需要在其他场景中使用对象池,那么 commons-pool2 提供的通用对象池功能可能更适合

到此这篇关于Redis设置database不生效的解决方案的文章就介绍到这了,更多相关Redis设置database不生效内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于redis状态监控和性能调优详解

    关于redis状态监控和性能调优详解

    Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表、哈希、集合和有序集合5种。下面这篇文章主要给大家介绍了关于redis状态监控和性能调优的相关资料,需要的朋友可以参考下。
    2017-09-09
  • redis如何清理缓存

    redis如何清理缓存

    本文主要介绍了redis如何清理缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Redis基于Bitmap实现用户签到功能

    Redis基于Bitmap实现用户签到功能

    很多应用上都有用户签到的功能,尤其是配合积分系统一起使用。本文主要介绍了Redis基于Bitmap实现用户签到功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • redis的string类型及bitmap介绍

    redis的string类型及bitmap介绍

    这篇文章主要介绍了redis的string类型及bitmap介绍,redis有很多的客户端连接进来,站在redis所在机器的角度来说,就是有很多socket的连接
    2022-07-07
  • 浅析Redis中String数据类型及其底层编码

    浅析Redis中String数据类型及其底层编码

    这篇文章主要介绍 Redis 中 String 数据类型及其底层编码,文中有详细的代码示例,对大家的工作及学习有一定的帮助,需要的朋友可以参考下
    2023-05-05
  • Redis底层数据结构SkipList的实现

    Redis底层数据结构SkipList的实现

    本文主要介绍了Redis底层数据结构SkipList的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Redis连接池配置及初始化实现

    Redis连接池配置及初始化实现

    这篇文章主要介绍了Redis连接池配置及初始化实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • redis实现延时队列的两种方式(小结)

    redis实现延时队列的两种方式(小结)

    这篇文章主要介绍了redis实现延时队列的两种方式(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • redis连接被拒绝的解决方案

    redis连接被拒绝的解决方案

    这篇文章主要介绍了redis连接被拒绝的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Quarkus集成redis操作Redisson实现数据互通

    Quarkus集成redis操作Redisson实现数据互通

    这篇文章主要为大家介绍了Quarkus集成redis操作Redisson实现数据互通的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02

最新评论