Reids與ssm整合使用註解

從jedisConnectionFactory獲取Jedis實例報錯

  • 代碼
// redisTemplate配置
@Bean(name="redisTemplate")
    public RedisTemplate initRedisTemplate() {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        //最大空閒數
        poolConfig.setMaxIdle(50);
        //最大連接數
        poolConfig.setMaxTotal(1000);
        //最大等待毫秒數
        poolConfig.setMaxWaitMillis(20000);

        poolConfig.setTestOnBorrow(true);

        //創建Jedis連接工廠
        JedisConnectionFactory connectionFactory = new JedisConnectionFactory(poolConfig);
        connectionFactory.setHostName("localhost");
        connectionFactory.setPort(6379);
        System.out.println("conn是否爲空:"+(connectionFactory == null));
        //調用後初始化方法,沒有它將拋出異常
        connectionFactory.afterPropertiesSet();
        //定義Redis序列化器
        RedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();
        RedisSerializer stringRedisSerializer = new StringRedisSerializer();
        //定義RedisTemlpate,並設置連接工廠
        RedisTemplate redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        //設置序列化器
        redisTemplate.setDefaultSerializer(stringRedisSerializer);
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setValueSerializer(stringRedisSerializer);
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        redisTemplate.setHashValueSerializer(stringRedisSerializer);

        return redisTemplate;
    }
-------------------------分割線------------------------------------
    //Service中使用的代碼
    /**
     * 使用redis進行操作
     * */
    @ResponseBody
    @RequestMapping("/grapRedPacketByRedis.do")
    public Map<String, Object> grapRedPacketByRedis(Integer redPacketId, Integer userId){
        //搶紅包
        int result= userRedPacketService.grapRedPacketByRedis(redPacketId, userId);
        Map<String,Object> retMap = new HashMap<>();
        boolean flag = result>0;
        retMap.put("success", flag);
        retMap.put("message", flag?"搶紅包成功":"搶紅包失敗");

        return retMap;
    }
-------------------------分割線------------------------------------
    //在Service中注入
    @Autowired
    private RedisTemplate redisTemplate = null;
    ....
    //Lua腳本
    String script = "local listKey = 'red_pakcet_list_' ..KEYS[1] \n"
                    +"local redPacket = 'red_packet_' ..KEYS[1] \n"
                    +"local stock = tonumber(redis.call('hget',redPacket, 'stock')) \n"
                    +"if stock <=0 then return 0 end \n"
                    +"stock = stock-1 \n"
                    +"redis.call('hset',redPacket,'stock',tostring(stock)) \n"
                    +"redis.call('rpush',listKey, ARGV[1]) \n"
                    +"if stock ==0 then return 2 end \n"
                    +"return 1 \n";
    //在緩存Lua腳本後,使用該變量保存Redis返回的32位的SHA1編碼, 使用它去執行緩存的Lua腳本
    String sha1 = null;

    //使用的方法
    @Override
    public Integer grapRedPacketByRedis(Integer redPacketId, Integer userId) {
        //當前搶紅包用戶和日期信息
        String args = userId+"-"+System.currentTimeMillis();
        Integer result = null;
        //獲取底層Redis操作對象
        Jedis jedis = (Jedis) redisTemplate .getConnectionFactory().getConnection().getNativeConnection();
        try {
            //如果腳本沒有加載過,那麼進行加載,這樣就會返回一個sha1編碼
            if(sha1 == null) {
                sha1 = jedis.scriptLoad(script);
            }
            //執行腳本,返回結果
            Object res = jedis.evalsha(sha1,1,redPacketId+"",args);
            result = Integer.parseInt(res+"");
            //返回2 時爲最後一個紅包,此時將搶紅包信息通過異步保存到數據庫
            if(result == 2) {
                //獲取單個小金額紅包
                String unitAmountStr = jedis.hget("red_packet_"+redPacketId, "unit_amount");
                //觸發保存數據庫操作
                Double unitAmount = Double.parseDouble(unitAmountStr);
                System.out.println("thread_name="+Thread.currentThread().getName());
                redisRedPacketService.saveUserRedPacketByRedis(redPacketId, unitAmount);
            }
        } finally {
            //確保jedis關閉
            if(jedis != null && !jedis.isConnected()) {
                jedis.close();
            }
        }
        return result;
    }
-------------------------分割線------------------------------------
    // 前端js請求
    <script type="text/javascript">
    $().ready(function(){
        //模擬30000個異步請求,進行併發
        var max = 30000;
        for (var i = 1; i <= max; i++) {
            // jQuery的post請求, 這裏是異步請求
            $.post({
                //請求搶id爲1的紅包
                url:"./userRedPacket/grapRedPacketByRedis.do?redPacketId=3&userId="+i,
                success:function(result){
                }               
            });
        }
    });
</script>

後臺異常


三月 01, 2018 3:10:17 下午 org.apache.catalina.core.StandardWrapperValve invoke
嚴重: Servlet.service() for servlet [dispatcher] in context with path [/RedPacket] threw exception [Request processing failed; nested exception is org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool] with root cause
java.util.NoSuchElementException: Timeout waiting for idle object
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:449)
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)
    at redis.clients.util.Pool.getResource(Pool.java:49)
    at redis.clients.jedis.JedisPool.getResource(JedisPool.java:226)
    at redis.clients.jedis.JedisPool.getResource(JedisPool.java:16)
    at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:194)
    at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:348)
    at com.avc.rp.service.impl.UserRedPacketServiceImpl.grapRedPacketByRedis(UserRedPacketServiceImpl.java:151)
    at sun.reflect.GeneratedMethodAccessor62.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
    at com.sun.proxy.$Proxy33.grapRedPacketByRedis(Unknown Source)
    at com.avc.rp.controller.UserRedPacketController.grapRedPacketByRedis(UserRedPacketController.java:40)
    at sun.reflect.GeneratedMethodAccessor60.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:475)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:500)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

求大神指教!!!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章