spring-redis配置

本文详细介绍Spring框架下Redis的配置方式,包括使用XML配置文件、属性文件注入、高级URI注入等多种方法,并提供了具体示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spring-redis配置
1. applicationContext-redis.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <!-- 定义受环境影响易变的变量 -->
    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="ignoreResourceNotFound" value="true" />
    <property name="ignoreUnresolvablePlaceholders" value="true" />
    <property name="locations">
        <list>
            <value>classpath:redis-config.properties</value>
        </list>
    </property>
</bean>
    <!-- 公共POOL配置 -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="1024" />
         <property name="maxIdle" value="8" /><!-- 最大空闲连接数, 默认8个 -->
        <property name="maxWaitMillis" value="15000"/><!-- 获取连接时的最大等待毫秒数 -->
        <property name="testOnBorrow" value="true" /><!-- 在获取连接的时候检查有效性, 默认false -->
        <property name="testWhileIdle" value="false"/><!-- 空闲是否检查是否有效,默认为false -->
        <property name="testOnReturn" value="true"/>
    </bean>


    <!-- jedis shard信息配置 -->
    <bean id="jedisShardInfo" class="redis.clients.jedis.JedisShardInfo">
        <constructor-arg index="0" value="192.168.1.204" />
        <constructor-arg index="1" value="6380" type="int"/> 
        <property name="password" value="123456" />
    </bean>

    <!-- jedis shard pool配置,提供给程序注入使用 -->
    <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">
        <constructor-arg index="0" ref="jedisPoolConfig" />
        <constructor-arg index="1">
            <list>
                <ref bean="jedisShardInfo" />
            </list>
        </constructor-arg>
    </bean>

</beans>
2. 通过redis-config.properties文件注入

applicationContext-redis.xml相应地方更改为

<!-- jedis shard信息配置 -->
<bean id="jedisShardInfo" class="redis.clients.jedis.JedisShardInfo">
    <constructor-arg index="0" value="${redis.ip}" />
    <constructor-arg index="1" value="${redis.port}" type="int"/> 
    <property name="password" value="${redis.password}" />
</bean>

redis-config.properties文件:

redis.ip=192.168.1.204
redis.password=123456
redis.port=6379

注意:如果适用默认端口6379,使用自定义端口6380,如果不指定类型,构造时始终调用两个字符串的构造函数,所以当出现端口更改时,程序还是调用原来的构造函数. 故必须指定参数类型为int

<constructor-arg index="1" value="6380" type="int"/>
3. 高级uri注入,可选择db
<!-- jedis uri信息配置 -->
<bean id="uri" class="java.net.URI">
     <!-- jedis URI配置   redis://redis:password@ip:port/database   -->
    <constructor-arg index="0" value="redis://redis:123456@192.168.1.203:6379/2" />
</bean>
<bean id="jedis.shardInfo" class="redis.clients.jedis.JedisShardInfo">
    <constructor-arg index="0" ref="uri" />
</bean>

这个注入方法比较高级,可以选择Redis DB 可以选择相应的db(redis默认db=0),目前redis.clients.jedis.JedisShardInfo类中没有提供直接改变db的构造方法或者属性注入,个人认为这是目前改变db最快捷的方法;当然也有其他方法,比如自己重写当前类等

我还碰到一个更奇葩的问题,密码中存在“/”,导致不能正确读取到db,原因各位请看源码便知
解决方法:

<!-- jedis uri信息配置 -->
<bean id="uri" class="java.net.URI">
     <!-- jedis URI配置   redis://redis:password@ip:port/database   -->
    <constructor-arg index="0" value="redis://redis:123456@192.168.1.203:6379/2" />
</bean>
<bean id="jedis.shardInfo" class="redis.clients.jedis.JedisShardInfo">
    <constructor-arg index="0" ref="uri" />
    <property name="password" value="123/456" />
</bean>

PS:spring注入是先方法再属性,所以此方法可行!

4. 最后附上redis.clients.jedis.JedisShardInfo源码:
package redis.clients.jedis;

import java.net.URI;

import redis.clients.jedis.exceptions.InvalidURIException;
import redis.clients.util.JedisURIHelper;
import redis.clients.util.ShardInfo;
import redis.clients.util.Sharded;

public class JedisShardInfo extends ShardInfo<Jedis> {

  public String toString() {
    return host + ":" + port + "*" + getWeight();
  }

  private int connectionTimeout;
  private int soTimeout;
  private String host;
  private int port;
  private String password = null;
  private String name = null;
  // Default Redis DB
  private int db = 0;

  public String getHost() {
    return host;
  }

  public int getPort() {
    return port;
  }

  public JedisShardInfo(String host) {
    super(Sharded.DEFAULT_WEIGHT);
    URI uri = URI.create(host);
    if (JedisURIHelper.isValid(uri)) {
      this.host = uri.getHost();
      this.port = uri.getPort();
      this.password = JedisURIHelper.getPassword(uri);
      this.db = JedisURIHelper.getDBIndex(uri);
    } else {
      this.host = host;
      this.port = Protocol.DEFAULT_PORT;
    }
  }

  public JedisShardInfo(String host, String name) {
    this(host, Protocol.DEFAULT_PORT, name);
  }

  public JedisShardInfo(String host, int port) {
    this(host, port, 2000);
  }

  public JedisShardInfo(String host, int port, String name) {
    this(host, port, 2000, name);
  }

  public JedisShardInfo(String host, int port, int timeout) {
    this(host, port, timeout, timeout, Sharded.DEFAULT_WEIGHT);
  }

  public JedisShardInfo(String host, int port, int timeout, String name) {
    this(host, port, timeout, timeout, Sharded.DEFAULT_WEIGHT);
    this.name = name;
  }

  public JedisShardInfo(String host, int port, int connectionTimeout, int soTimeout, int weight) {
    super(weight);
    this.host = host;
    this.port = port;
    this.connectionTimeout = connectionTimeout;
    this.soTimeout = soTimeout;
  }

  public JedisShardInfo(String host, String name, int port, int timeout, int weight) {
    super(weight);
    this.host = host;
    this.name = name;
    this.port = port;
    this.connectionTimeout = timeout;
    this.soTimeout = timeout;
  }

  public JedisShardInfo(URI uri) {
    super(Sharded.DEFAULT_WEIGHT);
    if (!JedisURIHelper.isValid(uri)) {
      throw new InvalidURIException(String.format(
        "Cannot open Redis connection due invalid URI. %s", uri.toString()));
    }

    this.host = uri.getHost();
    this.port = uri.getPort();
    this.password = JedisURIHelper.getPassword(uri);
    this.db = JedisURIHelper.getDBIndex(uri);
  }

  public String getPassword() {
    return password;
  }

  public void setPassword(String auth) {
    this.password = auth;
  }

  public int getConnectionTimeout() {
    return connectionTimeout;
  }

  public void setConnectionTimeout(int connectionTimeout) {
    this.connectionTimeout = connectionTimeout;
  }

  public int getSoTimeout() {
    return soTimeout;
  }

  public void setSoTimeout(int soTimeout) {
    this.soTimeout = soTimeout;
  }

  public String getName() {
    return name;
  }

  public int getDb() {
    return db;
  }

  @Override
  public Jedis createResource() {
    return new Jedis(this);
  }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值