程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> redisTemplate的spring配置以及lua腳本驅動,redistemplatelua

redisTemplate的spring配置以及lua腳本驅動,redistemplatelua

編輯:JAVA綜合教程

redisTemplate的spring配置以及lua腳本驅動,redistemplatelua


  最近在使用spring-data-redis的redisTemplate,所以寫篇使用記錄吧。

  1.不用多說,使用maven引入相關依賴,因為項目已經引入其他的

  

<dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>1.6.2.RELEASE</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring-context</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-aop</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-context-support</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-tx</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-core</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>slf4j-api</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>

 2.spring配置文件

<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>
    <!-- Jedis ConnectionFactory -->
    <bean id="jedisConnectionFactory"
        class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
        p:hostName="${redis.url}" p:port="${redis.port}" p:password="${redis.password}" p:pool-config-ref="poolConfig"/>
    <bean id="stringRedisSerializer"
        class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean>
    <bean id="jsonSerializer"
        class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer">
    </bean>

    <!-- redis template definition -->
    <bean id="redisTemplate" name="redisTemplate"
        class="org.springframework.data.redis.core.RedisTemplate"
        p:connection-factory-ref="jedisConnectionFactory" p:keySerializer-ref="stringRedisSerializer"
        p:hashKeySerializer-ref="stringRedisSerializer" p:valueSerializer-ref="jsonSerializer"
        p:hashValueSerializer-ref="jsonSerializer">
    </bean>

  假如要使用redis驅動lua腳本則需要加入類似的配置

<bean id="updateAvailableSavingsCard" class="org.springframework.data.redis.core.script.DefaultRedisScript">
        <property name="location" value="classpath:META-INF/lua/updateAvailableSavingsCard.lua"/>
        <property name="resultType" value="org.meibaobao.ecos.basecomponent.common.Result"/>
    </bean>
    <bean id="initAvailableSavingsCard" class="org.springframework.data.redis.core.script.DefaultRedisScript">
        <property name="location" value="classpath:META-INF/lua/initAvailableSavingsCard.lua"/>
        <property name="resultType" value="java.lang.Boolean"/>
    </bean>

  lua腳本文件(updateAvailableSavingsCard.lua)

-- 操作可用儲蓄卡,當客戶購買則減,賣家增加可用庫存則加,使用lua腳本redis操作的保證原子性
redis.call('INCRBY', KEYS[1], ARGV[1])
local current = redis.call('GET', KEYS[1])
local result ={}
result["@class"] = "org.meibaobao.ecos.basecomponent.common.Result"
if tonumber(current)<0
then
    redis.call('DECRBY', KEYS[1], ARGV[1])
    current = redis.call('GET', KEYS[1])
    result["success"] = false
    result["data"] = current
    local encodestr = cjson.encode(result)
    print(encodestr)
    return  encodestr
end
result["success"] = true
result["data"] = current
local encodestr = cjson.encode(result)
print(encodestr)
return  encodestr

 

3.資源文件

#redis
redis.url=10.72.82.124
redis.port=6379
redis.password=

redis.maxIdle=200
redis.maxActive=1024
redis.maxWait=1000
redis.testOnBorrow=true

4.java代碼

package org.meibaobao.ecos.storedCard.scheme.service.component.impl;

import java.util.Collections;

import javax.annotation.Resource;

import org.meibaobao.ecos.basecomponent.common.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.stereotype.Service;

/**
 * 儲蓄卡資源
 *
 */
@Service
public class StoredCardInventoryServiceImpl {
    @Resource(name = "updateAvailableSavingsCard")
    RedisScript<Result> updateAvailableSavingsCard;
    @Resource(name = "initAvailableSavingsCard")
    RedisScript<Boolean> initAvailableSavingsCard;
    
    @Autowired
    RedisTemplate<String,Integer> redisTemplate;
    
    public static String availableStotredCardInventoryNamePre = "availableStotredCard_";
    /**
     * 操作可用資源
     */
    public Result availableStotredCardInventory(String storedCardSchemeNo,int num){
        return redisTemplate.execute(updateAvailableSavingsCard,  Collections.singletonList(availableStotredCardInventoryNamePre+storedCardSchemeNo),num);
    }
    /**
     * 初始化可用資源
     */
    public Boolean initAvailableStotredCardInventory(String storedCardSchemeNo,int num){
        return redisTemplate.execute(initAvailableSavingsCard,  Collections.singletonList(availableStotredCardInventoryNamePre+storedCardSchemeNo),
                num);
    }
}

5.junit4單元測試代碼

package org.meibaobao.ecos.storedCard.scheme.service.component.impl;

import java.util.Map;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:development/xml/spring/applicationContext.xml" })
public class StotredCardInventoryServiceImplTest {
    
    @Resource
    private StoredCardInventoryServiceImpl stotredCardInventoryServiceImpl;
    
    @Autowired
    RedisTemplate<String,Object> redisTemplate;
    
    @Test
    public void availableStotredCardInventory() {
        System.out.println(stotredCardInventoryServiceImpl.initAvailableStotredCardInventory("test1111112",-10));
        System.out.println(stotredCardInventoryServiceImpl.initAvailableStotredCardInventory("test1111112",-10));
        
        redisTemplate.opsForValue().set("test99999", "123asd");
        
        System.out.println(redisTemplate.opsForValue().get("test99999"));    
        
        
        //測試hash
        String key = "hashtest11";
        redisTemplate.opsForHash().put(key, "name1", "11");
        redisTemplate.opsForHash().put(key, "name2", "22");
        redisTemplate.opsForHash().put(key, "name3", "33");
        
        System.out.println(redisTemplate.opsForHash().get(key, "name2"));
        redisTemplate.opsForHash().delete(key, "name2");
        System.out.println(redisTemplate.opsForHash().get(key, "name2"));
        System.out.println(redisTemplate.opsForHash().get(key, "name1"));
        
        Map<Object, Object> opsMap = redisTemplate.opsForHash().entries(key);
        if(opsMap != null) {
            System.out.println(opsMap.keySet());
            System.out.println(opsMap.values());
            for(Object object : opsMap.keySet()) {
                System.out.println(object + "," + opsMap.get(object));
            }
        }
    }
    
    
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved