首页 > 数据库 >redis设置database 不生效剖析

redis设置database 不生效剖析

时间:2023-12-30 21:33:32浏览次数:30  
标签:database Redis redis commons 剖析 instance PooledObject lettuce pool

(设置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;

<font color='green'>注意:</font>   Jedis 和Lettuce 是Java 操作Redis 的客户端。 在Spring Boot 1.x 版本默认使用的是Jedis ,而在Spring Boot 2.x 版本默认使用的就是Lettuce。 所以如果你用的是1.x版本的话 需要把 RedisConnectionFactory factory 替换为LettuceConnectionFactory lettuceConnectionFactory 同时在依赖中排除lettuce的jar 改为用jedis

在这里插入图片描述

对比

  commons-pool2lettuce-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 提供的通用对象池功能可能更适合。

标签:database,Redis,redis,commons,剖析,instance,PooledObject,lettuce,pool
From: https://blog.51cto.com/u_16111319/9041965

相关文章

  • C# 操作 Redis
    一、简介C#中通过StackExchange.Redis库可以方便地操作Redis,实现高性能的数据缓存和存储。StackExchange.Redis提供了强大的API,允许开发者轻松连接、读取和写入Redis数据。通过使用ConnectionMultiplexer类,可以建立与Redis服务器的连接,并使用IDatabase接口执行各种......
  • 基于Redis的简单漏桶算法
    下列代码是限制每秒10QPS的简单算法,需要修改频率请修改Duration.ofMillis(100)处publicclassLimitationManage{privatestaticfinalStringVALUE="A";@ResourceprivateRedissonClientredissonClient;publicBooleantryAcquire(Stringkey){......
  • 华为云耀云服务器L实例-微人事前后端分离人力资源管理系统-Redis配置
     华为云耀云服务器L实例-微人事前后端分离人力资源管理系统-Redis配置   产品官网:https://www.huaweicloud.com/product/hecs-light.html 项目源代码地址:https://github.com/lenve/vhr  今天我们采用可靠更安全、智能不卡顿、价优随心用、上手更简单、管理特......
  • 在Python中,如果你想查找特定的SQLite数据库文件(例如'mydatabase.db'),你可以使用os模块
    这是Python中os.walk()函数的常见用法¹²⁴⁵⁶。os.walk()函数用于递归遍历指定目录及其子目录,并返回一个生成器,每次迭代都会返回一个包含三个元素的元组:当前目录的路径、当前目录下所有子目录的列表和当前目录下所有文件的列表¹²⁴⁵⁶。在fordirpath,dirnames,filenamesi......
  • Redis 之基本命令
    一、基本命令1、ping心跳命令2、get/set(读写键值命令)3、select(切换数据库)4、dbsize(查看key数量)5、flushdb(删除当前库中所有数据)6、flushall(删除所有DB中的数据) ......
  • redis哨兵模式
    在主从架构的基础上继续增加三个哨兵当前架构:1主2从3哨兵启动顺序:redis主节点-从节点1-从节点2-哨兵依次启动(redis-sentinelsentinel-26380.cong)测试情况如下:主节点死掉,三哨兵自动选举新的主节点,除非所有节点挂掉哨兵模式配置文件:port26380//当前哨兵端口26380daem......
  • 恒创科技:常见HTTP 500错误发生原因及解决办法剖析
    ​对于网站运营者来说,提到500内部服务器错误并不陌生。互联网行业对它的称呼有好几种,如“500内部服务器错误”、“HTTP500-内部服务器错误”、“临时错误(500)”、“内部服务器错误”。尽管叫法不同,但根本问题是相同的。目前,它仍算是一个比较常见的错误提示,一般情况下......
  • JDK、Tomcat、Redis、MySQL集齐,教你如何搭建高效性能测试项目
    前言:作为一个软件工程师,怎能不知道如何搭建一个性能测试项目呢?性能测试是一个软件工程师不可或缺的一环,因为一款软件性能好坏直接关系到用户体验,而用户体验又是一个软件能否成功的最重要的因素。本文将带你一步步搭建一个性能测试项目,包括如何搭建JDK、Tomcat、Redis和数据库,并......
  • 项目中使用spring.session.store-type=redis和@EnableRedisHttpSession 的区别
    spring项目的session存在哪里SpringSession提供了多种存储策略,可以选择将session存储在内存、数据库或Redis缓存中。内存存储:这是默认的存储方式,适用于单个应用程序的情况。SpringSession会在应用程序启动时创建一个ConcurrentHashMap对象,用于存储session数据。JDBC存......
  • 如何用Redis构建分布式锁系统?
       对常见的加锁场景的归纳,只涉及到了JVM的api锁和redis的分布式锁。其实也可以用zookeeper或者mysql,其他的以后在分享吧,其实最完美的还是老外那套saga状态机解决分布式事务比较完美,缺点就是难度很大要用到领域驱动的思想,国内普遍用的贫血模型,切换到DDD还是需要些时间研究......