2019년 4월 22일 월요일

[java] spring 에 redisTemplate 설정 하기 (root-context.xml)

자바에서 redis 를 사용할때는 jedis 라는 wrapping api 를 사용 하는데 기본 사용법은

메이븐에 아래 의존 라이브러리를 추가하고

<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>

아래처럼 pool 객체를 생성 하여 제어한다

JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
JedisPool pool = new JedisPool(jedisPoolConfig, "192.168.0.31", 6379, 1000, "alaneoqkr!@#");
Jedis jedis = pool.getResource();
String test = jedis.get("aaa");
System.out.println(test);
if (jedis != null) {
    jedis.close();
}
pool.close();


하지만 이와같은 방법은 매번 close 작업을 해야하고

value 값을 json 형태로 저장 했을때 매번 vo 또는 map 객체로 컨버팅 작업이 필요하다

즉, 코딩양이 늘어난다

그럼 xml 파일을 통해 bean 을 설정 하는 방법을 알아보자


일단 필요한 의존 라이브러리를 pom.xml 에 추가한다


<!-- redis -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.8.6.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>

그다음 WEB-INF 디렉토리 하위에 root-context.xml 파일을 수정한다.

<!-- jedis poolConfig bean 등록 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" />

<!-- jedis jedisConnectionFactory 설정 -->
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
    <property name="usePool" value="true" />                   pool 사용여부
    <property name="hostName" value="192.168.0.31" />     호스트
    <property name="port" value="6379" />                       포트
    <property name="poolConfig" ref="jedisPoolConfig" />    위에서 생성한 pool
    <property name="password" value="*******" />               비밀번호
</bean>

<!-- redis 템플릿 설정 -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
   
    <!-- 위에서 생성한 jedisConnectionFactory 를 꽂아줌 -->
    <property name="connectionFactory" ref="jedisConnectionFactory" />

    <!-- 키는 string, value 는 Object 로 설정 -->
    <!-- keySerializer, hashKeySerializer 는 StringRedisSerializer 로 잡고 -->
    <!-- valueSerializer, hashValueSerializer 는 GenericJackson2JsonRedisSerializer -->
    <!-- 로 잡은후 생성자로 Object 객체를 넣어주었다. -->


    <property name="keySerializer">
        <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
    </property>
    <property name="valueSerializer">
        <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer">
            <constructor-arg value="java.lang.Object" />
        </bean>
    </property>
    <property name="hashKeySerializer">
        <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
    </property>
    <property name="hashValueSerializer">
        <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />
            <constructor-arg value="java.lang.Object" />
    </property>
</bean>


spring 코드

controller 또는 service 에 ( 보통은 service) redisTemplate 객체를 선언하고 사용할 Operation 을 선언한다 난 일단 다 했다


@Autowired
RedisTemplate<String, Object> redisTemplate;

@Resource(name="redisTemplate")
private ValueOperations<String, Object> valueOps;

@Resource(name="redisTemplate")
private SetOperations<String, String> setOps;

@Resource(name="redisTemplate")
private ListOperations<String, Object> listOps;

@Resource(name="redisTemplate")
private ZSetOperations<String, String> zSetOps;

@Resource(name="redisTemplate")
private HashOperations<String, String, Object> hashOps;


...

HashMap<String,Object> resultMap = new HashMap<String,Object>();
//vo 객체를 가져왔다
AdminVo adminVo= adminDao.selectAdminByAccount(adminVo);

//데이터 넣기
valueOps.set("user", adminVo);                                                 //set 명령어와 동일
hashOps.put("USER:LIST", result.getAdminAccount(), adminVo);        //hset
listOps.leftPush("list", adminVo);                                                //lpush
setOps.add("set", "1", "2", "3", "1");                                             //set
zSetOps.add("zSet", "1", 1);                                                       //zset       

//데이터 꺼내기
resultMap.put("get", valueOps.get("user"));
resultMap.put("hGet", hashOps.get("USER:LIST", result.getAdminAccount()));
resultMap.put("rightPop", listOps.rightPop("list"));
resultMap.put("set", setOps.members("set"));
resultMap.put("zSet", zSetOps.range("zSet", 0, -1));

데이터 넣을시 root 컨텍스트에서 설정한 Object type 으로 설정 하면

{"java.lang.Object":"somepackage.AdminVo"..............."}

위와 같은 형태로 데이터 형이정보도 같이 저장되어

바로 HashMap 또는 vo 객채로 다운캐스팅이 가능해진다.

...

이런식으로
AdminVo redisGetUserObject = (AdminVo)valueOps.get("user");


만약 redis pool 객체를 얻지 못할경우는

레디스 설정 파일에 bind 부분을 0.0.0.0 으로 바꾸고 protec~~ yes 값을 no 로 바꾸고 레디스를 재시작 해준다.




댓글 없음:

댓글 쓰기

[lunux]리눅스 폴더별 용량 확인

리눅스 폴더별 용량 확인 조회 하고자 하는 디렉토리 리스트가있는 경로로 이동후 du -h --max-depth=1