자바 의 redis 편 상세 설명(spring-data-redis 통합)

18899 단어 springredis
1,spring-data-redis 를 이용 하여 통합
프로젝트 에 사용 할 pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>

 <groupId>com.x.redis</groupId>
 <artifactId>Spring_redis</artifactId>
 <version>1.0-SNAPSHOT</version>
 <packaging>jar</packaging>

 <name>Spring_redis</name>
 <url>http://maven.apache.org</url>

 <properties>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 </properties>

 <dependencies>
  <dependency> 
  <groupId>org.springframework.data</groupId> 
  <artifactId>spring-data-redis</artifactId> 
  <version>1.0.2.RELEASE</version> 
 </dependency> 
 <dependency> 
  <groupId>org.springframework</groupId> 
  <artifactId>spring-core</artifactId> 
  <version>3.1.2.RELEASE</version> 
 </dependency> 

  
 <dependency> 
  <groupId>redis.clients</groupId> 
  <artifactId>jedis</artifactId> 
  <version>2.1.0</version> 
 </dependency> 
  
  <dependency> 
  <groupId>junit</groupId> 
  <artifactId>junit</artifactId> 
  <version>4.8.2</version> 
  <scope>test</scope> 
 </dependency> 
    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.6.1</version>
   </dependency>
   <!--     jakarta commons logging      lsf4j   。 -->
   <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.6.1</version>
   </dependency>
   <!-- Hack:  commons-logging jar     ,    jcl-over-slf4j   -->
   <dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.1.1</version>
    <scope>provided</scope>
   </dependency>
   <!-- slf4j   :logback,    log4j。  、  ! -->
   <dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>0.9.24</version>
    <scope>runtime</scope>
   </dependency>
 </dependencies>
</project>

log 부분 을 제외 하고 spring core 와 spring-data-redis 만 있 습 니 다.
프로젝트 파일 디 렉 터 리 구조:

applicationContext.xml:
1,context:property-placeholder 탭 은 properties 파일 을 가 져 오 는 데 사 용 됩 니 다.${redis.maxidle}과 같은 변 수 를 교체 합 니 다.
2.context:component-scan 은 com.x.redis.dao 신문 에 실 용적 인 spring 의 주석 주입 방식 입 니 다.
3.사실 우 리 는 JedisPoolConfig 를 숫자 에 맞 추 면 됩 니 다.다음은 spring 의 패키지 입 니 다.그래서 UserDAOImpl 의 실현 을 보면 알 수 있 습 니 다.

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
 xmlns:context="http://www.springframework.org/schema/context" 
 xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" 
 xmlns:aop="http://www.springframework.org/schema/aop" 
 xsi:schemaLocation=" 
   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 
 
 <context:property-placeholder location="classpath:redis.properties" /> 
 <context:component-scan base-package="com.x.redis.dao">
 </context:component-scan>
 <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> 
  <property name="maxIdle" value="${redis.maxIdle}" /> 
  <property name="maxActive" value="${redis.maxActive}" /> 
  <property name="maxWait" value="${redis.maxWait}" /> 
  <property name="testOnBorrow" value="${redis.testOnBorrow}" /> 
 </bean> 
  
 <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" 
  p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/> 
  
 <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"> 
  <property name="connectionFactory" ref="connectionFactory" /> 
 </bean>   
  
 <bean id="userDAO" class="com.x.redis.dao.impl.UserDAOImpl" /> 
</beans>
redis.properties:

# Redis settings
#redis.host=192.168.20.101
#redis.port=6380
#redis.pass=foobared
redis.host=127.0.0.1
redis.port=6379
redis.pass=
 
redis.maxIdle=300
redis.maxActive=600
redis.maxWait=1000
redis.testOnBorrow=true
UserDAOImpl:
1.spring 은 dao 층 의 패 키 징 에 대해 아래 코드 와 유사 한 템 플 릿 방식 을 많이 사용 합 니 다.
2,RedisTemplate 는 spring 이 redis 에 대한 패키지 일 뿐 입 니 다.

public class UserDAOImpl implements UserDAO {

 @Autowired
 protected RedisTemplate<Serializable, Serializable> redisTemplate;

 public void saveUser(final User user) {
  redisTemplate.execute(new RedisCallback<Object>() {

   @Override
   public Object doInRedis(RedisConnection connection) throws DataAccessException {
    connection.set(redisTemplate.getStringSerializer().serialize("user.uid." + user.getId()),
        redisTemplate.getStringSerializer().serialize(user.getName()));
    return null;
   }
  });
 }

 @Override
 public User getUser(final long id) {
  return redisTemplate.execute(new RedisCallback<User>() {
   @Override
   public User doInRedis(RedisConnection connection) throws DataAccessException {
    byte[] key = redisTemplate.getStringSerializer().serialize("user.uid." + id);
    if (connection.exists(key)) {
     byte[] value = connection.get(key);
     String name = redisTemplate.getStringSerializer().deserialize(value);
     User user = new User();
     user.setName(name);
     user.setId(id);
     return user;
    }
    return null;
   }
  });
 }

 
}

기타:
User:

public class User {

 private long id;
 private String name;
 
 public long getId() {
  return id;
 }
 
 public void setId(long id) {
  this.id = id;
 }
 
 public String getName() {
  return name;
 }
 
 public void setName(String name) {
  this.name = name;
 }
}

테스트 코드:

public static void main(String[] args) {
  ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:/applicationContext.xml");
  UserDAO userDAO = (UserDAO)ac.getBean("userDAO");
  User user1 = new User();
  user1.setId(1);
  user1.setName("obama");
  userDAO.saveUser(user1);
  User user2 = userDAO.getUser(1);
  System.out.println(user2.getName());
 }
2,spring-data-redis 통합 사용 하지 않 음
개인 적 으로 는 이렇게 통합 유연성 이 높 아 임 무 를 더욱 명료 하 게 수행 할 수 있다 고 생각한다.
pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>

 <groupId>com.d.work</groupId>
 <artifactId>Redis_Templete</artifactId>
 <version>1.0-SNAPSHOT</version>
 <packaging>jar</packaging>

 <name>Redis_Templete</name>
 <url>http://maven.apache.org</url>

 <properties>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 </properties>

 <dependencies>
 <dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>3.8.1</version>
  <scope>test</scope>
 </dependency>
 <dependency> 
  <groupId>redis.clients</groupId> 
  <artifactId>jedis</artifactId> 
  <version>2.1.0</version> 
 </dependency> 
  <dependency> 
  <groupId>org.springframework</groupId> 
  <artifactId>spring-core</artifactId> 
  <version>3.1.2.RELEASE</version> 
 </dependency> 
  <dependency> 
  <groupId>org.springframework</groupId> 
  <artifactId>spring-beans</artifactId> 
  <version>3.1.2.RELEASE</version> 
 </dependency> 
  <dependency> 
  <groupId>org.springframework</groupId> 
  <artifactId>spring-context</artifactId> 
  <version>3.1.2.RELEASE</version> 
 </dependency> 
 <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.6.1</version>
   </dependency>
   <!--     jakarta commons logging      lsf4j   。 -->
   <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.6.1</version>
   </dependency>
   <!-- Hack:  commons-logging jar     ,    jcl-over-slf4j   -->
   <dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.1.1</version>
    <scope>provided</scope>
   </dependency>
   <!-- slf4j   :logback,    log4j。  、  ! -->
   <dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>0.9.24</version>
    <scope>runtime</scope>
   </dependency>
 </dependencies>
</project>

디 렉 터 리 구조:

data-source.xml
1,context:property-placeholder 와 context:component-can 앞에서 설 명 했 습 니 다.
2.ShardedJedisPool 을 설 치 했 고 jdeis 에 JedisPool 이 있 습 니 다.이 두 가지 차이 점:
하 나 는 블록 형식 으로 주 된 redis 서버 를 연결 할 수 있 고 하 나 는 하나의 것 입 니 다.상세 한 후속 학습
3.spring-data-redis 의 패 키 징 을 사용 하지 않 기 때문에 스스로 패 키 징 해 야 합 니 다.

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
 xmlns:context="http://www.springframework.org/schema/context" 
 xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" 
 xmlns:aop="http://www.springframework.org/schema/aop" 
 xsi:schemaLocation=" 
   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 

 <context:property-placeholder location="classpath:redis.properties" /> 
 <context:component-scan base-package="com.d.work.main">
 </context:component-scan>
  <context:component-scan base-package="com.d.work.redis">
 </context:component-scan>
 <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
  <property name="maxActive" value="50" />
  <property name="maxIdle" value="8" />
  <property name="maxWait" value="1000" />
  <property name="testOnBorrow" value="true"/>
  <property name="testOnReturn" value="true"/>
  <!-- <property name="testWhileIdle" value="true"/> -->
 </bean>

 <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool" scope="singleton">
  <constructor-arg index="0" ref="jedisPoolConfig" />
  <constructor-arg index="1">
   <list>
    <bean class="redis.clients.jedis.JedisShardInfo">
     <constructor-arg name="host" value="${redis.host}" />
     <constructor-arg name="port" value="${redis.port}" />
     <constructor-arg name="timeout" value="${redis.timeout}" />
     <constructor-arg name="weight" value="1" />
    </bean>
   </list>
  </constructor-arg>
 </bean>
</beans>

RedisDataSource:세 가지 방법 을 정의 합 니 다.

public interface RedisDataSource {
 public abstract ShardedJedis getRedisClient();
 public void returnResource(ShardedJedis shardedJedis);
 public void returnResource(ShardedJedis shardedJedis,boolean broken);
}
redisDataSource 구현:
1.설 정 된 ShardedJedisPool 을 주입 합 니 다.이 세 가지 방법의 역할:
  •  getRedisClient():redis 를 가 져 온 클 라 이언 트 입 니 다.명령 을 수행 할 수 있 습 니 다.
  • return Resource(ShardedJedis shardedJedis):자원 을 pool
  • 에 반환 합 니 다.
  • return Resource(ShardedJedis shardedJedis,boolean broken):이상 이 발생 하면 pool 에 자원 을 반환 합 니 다(두 번 째 방법 은 필요 없습니다)
  • 
    @Repository("redisDataSource")
    public class RedisDataSourceImpl implements RedisDataSource {
    
     private static final Logger log = LoggerFactory.getLogger(RedisDataSourceImpl.class);
    
     @Autowired
     private ShardedJedisPool shardedJedisPool;
    
     public ShardedJedis getRedisClient() {
      try {
       ShardedJedis shardJedis = shardedJedisPool.getResource();
       return shardJedis;
      } catch (Exception e) {
       log.error("getRedisClent error", e);
      }
      return null;
     }
    
     public void returnResource(ShardedJedis shardedJedis) {
      shardedJedisPool.returnResource(shardedJedis);
     }
    
     public void returnResource(ShardedJedis shardedJedis, boolean broken) {
      if (broken) {
       shardedJedisPool.returnBrokenResource(shardedJedis);
      } else {
       shardedJedisPool.returnResource(shardedJedis);
      }
     }
    }
    
    
    2 층 의 패 키 징:RedisClient Template,예 를 들 어 방 값 과 수 치 를 실현 합 니 다.마지막 코드 는 모든 명령 의 실현 을 제공 했다.
    코드 는 맵 성질 의 또 한 번 jedis 를 호출 하 는 방법 일 뿐,broken 으로 표시 자 를 만들어 자원 을 반환 하 는 방식 을 결정 합 니 다.
    이 층 의 목적 은 주로 상층 부의 호출 이 pool 에서 링크 의 취득 과 반환 문제 에 관심 을 가 질 필요 가 없 게 하 는 것 이다.
    
    @Repository("redisClientTemplate")
    public class RedisClientTemplate {
    
     private static final Logger log = LoggerFactory.getLogger(RedisClientTemplate.class);
    
     @Autowired
     private RedisDataSource  redisDataSource;
    
     public void disconnect() {
      ShardedJedis shardedJedis = redisDataSource.getRedisClient();
      shardedJedis.disconnect();
     }
    
     /**
      *      
      * 
      * @param key
      * @param value
      * @return
      */
     public String set(String key, String value) {
      String result = null;
    
      ShardedJedis shardedJedis = redisDataSource.getRedisClient();
      if (shardedJedis == null) {
       return result;
      }
      boolean broken = false;
      try {
       result = shardedJedis.set(key, value);
      } catch (Exception e) {
       log.error(e.getMessage(), e);
       broken = true;
      } finally {
       redisDataSource.returnResource(shardedJedis, broken);
      }
      return result;
     }
    
     /**
      *      
      * 
      * @param key
      * @return
      */
     public String get(String key) {
      String result = null;
      ShardedJedis shardedJedis = redisDataSource.getRedisClient();
      if (shardedJedis == null) {
       return result;
      }
    
      boolean broken = false;
      try {
       result = shardedJedis.get(key);
    
      } catch (Exception e) {
       log.error(e.getMessage(), e);
       broken = true;
      } finally {
       redisDataSource.returnResource(shardedJedis, broken);
      }
      return result;
     }
    }
    
    
    테스트 코드:
    
     public static void main(String[] args) {
      ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:/data-source.xml");
      RedisClientTemplate redisClient = (RedisClientTemplate)ac.getBean("redisClientTemplate");
      redisClient.set("a", "abc");
      System.out.println(redisClient.get("a"));
     }
    RedisClient 템 플 릿 을 첨부 하여 모두 구현:
    RedisClient 템 플 릿 코드 가 너무 많아 서 다운로드 주 소 를 첨부 합 니 다:http://xiazai.jb51.net/201701/yuanma/RedisClientTemplate_jb51.rar
     이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기