1. 程式人生 > >Spring+Redis整合以及異常 Could not resolve placeholder解決

Spring+Redis整合以及異常 Could not resolve placeholder解決

spring+Redis

  • 概述

    本文主要為了整合spring和redis,以及記錄解決中間遇到的問題。

  • 什麼是redis?

    Redis是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。

    換句話說,Redis就像是一個HashMap,不過不是在JVM中執行,而是以一個獨立程序的形式執行。

    一般說來,會被當作快取使用。 因為它比資料庫(mysql)快,所以常用的資料,可以考慮放在這裡,這樣就提供了效能。

  • redis安裝

    redis官網:http://redis.io
    windows版本的下載地址是: http://redis.io/download


    點選進去之後會跳轉到: https://github.com/mythz/redis-windows是一個開源專案,所以從github上下載後,需要自己編譯生成exe檔案,這裡給出我使用的編譯好的redis-64.3.0.503.zip http://how2j.cn/frontdownload?bean.id=1395
    其中redis-server.exe是伺服器啟動程式,redis-cli.exe是客戶端啟動程式。具體的命令使用不一一贅述,在網上都有很多這種命令的介紹和使用,給出官方手冊http://www.redis.cn/commands.html和簡單教程http://www.runoob.com/redis/redis-commands.html

  • jedis

    1.什麼是jedis?

    常見命令中,使用各種Redis自帶客戶端的命令列方式訪問Redis服務。 而在實際工作中卻需要用到Java程式碼才能訪問,使用第三方jar包 :Jedis就能方便地訪問Redis的各種服務了。

    2.這裡給出一個簡單的測試案例TestRedisManyCommands.java

    其中的依賴,在後續spring+redis的pom檔案中。

    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    
    import org.
    junit.Before; import org.junit.Test; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; public class TestRedisManyCommands { JedisPool pool; Jedis jedis; @Before public void setUp() { jedis = new Jedis("localhost"); } /** * Redis儲存初級的字串 * CRUD */ @Test public void testBasicString(){ //-----新增資料---------- jedis.set("name","meepo");//向key-->name中放入了value-->meepo System.out.println(jedis.get("name"));//執行結果:meepo //-----修改資料----------- //1、在原來基礎上修改 jedis.append("name","dota"); //很直觀,類似map 將dota append到已經有的value之後 System.out.println(jedis.get("name"));//執行結果:meepodota //2、直接覆蓋原來的資料 jedis.set("name","poofu"); System.out.println(jedis.get("name"));//執行結果:poofu //刪除key對應的記錄 jedis.del("name"); System.out.println(jedis.get("name"));//執行結果:null /** * mset相當於 * jedis.set("name","meepo"); * jedis.set("dota","poofu"); */ jedis.mset("name","meepo","dota","poofu"); System.out.println(jedis.mget("name","dota")); } /** * jedis操作Map */ @Test public void testMap(){ Map<String,String> user=new HashMap<String,String>(); user.put("name","meepo"); user.put("pwd","password"); jedis.hmset("user",user); //取出user中的name,執行結果:[meepo]-->注意結果是一個泛型的List //第一個引數是存入redis中map物件的key,後面跟的是放入map中的物件的key,後面的key可以跟多個,是可變引數 List<String> rsmap = jedis.hmget("user", "name"); System.out.println(rsmap); //刪除map中的某個鍵值 jedis.hdel("user","pwd"); System.out.println(jedis.hmget("user", "pwd")); //因為刪除了,所以返回的是null System.out.println(jedis.hlen("user")); //返回key為user的鍵中存放的值的個數1 System.out.println(jedis.exists("user"));//是否存在key為user的記錄 返回true System.out.println(jedis.hkeys("user"));//返回map物件中的所有key [pwd, name] System.out.println(jedis.hvals("user"));//返回map物件中的所有value [meepo, password] Iterator<String> iter=jedis.hkeys("user").iterator(); while (iter.hasNext()){ String key = iter.next(); System.out.println(key+":"+jedis.hmget("user",key)); } } /** * jedis操作List */ @Test public void testList(){ //開始前,先移除所有的內容 jedis.del("java framework"); // 第一個是key,第二個是起始位置,第三個是結束位置,jedis.llen獲取長度 -1表示取得所有 System.out.println(jedis.lrange("java framework",0,-1)); //先向key java framework中存放三條資料 jedis.lpush("java framework","spring"); jedis.lpush("java framework","struts"); jedis.lpush("java framework","hibernate"); //再取出所有資料jedis.lrange是按範圍取出, // 第一個是key,第二個是起始位置,第三個是結束位置,jedis.llen獲取長度 -1表示取得所有 System.out.println(jedis.lrange("java framework",0,-1)); } /** * jedis操作Set */ @Test public void testSet(){ //新增 jedis.sadd("sname","meepo"); jedis.sadd("sname","dota"); jedis.sadd("sname","poofu"); jedis.sadd("sname","noname"); //移除noname jedis.srem("sname","noname"); System.out.println(jedis.smembers("sname"));//獲取所有加入的value System.out.println(jedis.sismember("sname", "meepo"));//判斷 meepo 是否是sname集合的元素 System.out.println(jedis.srandmember("sname")); System.out.println(jedis.scard("sname"));//返回集合的元素個數 } @Test public void test() throws InterruptedException { //keys中傳入的可以用萬用字元 System.out.println(jedis.keys("*")); //返回當前庫中所有的key [sose, sanme, name, dota, foo, sname, java framework, user, braand] System.out.println(jedis.keys("*name"));//返回的sname [sname, name] System.out.println(jedis.del("sanmdde"));//刪除key為sanmdde的物件 刪除成功返回1 刪除失敗(或者不存在)返回 0 System.out.println(jedis.ttl("sname"));//返回給定key的有效時間,如果是-1則表示永遠有效 jedis.setex("timekey", 10, "min");//通過此方法,可以指定key的存活(有效時間) 時間為秒 Thread.sleep(5000);//睡眠5秒後,剩餘時間將為<=5 System.out.println(jedis.ttl("timekey")); //輸出結果為5 jedis.setex("timekey", 1, "min"); //設為1後,下面再看剩餘時間就是1了 System.out.println(jedis.ttl("timekey")); //輸出結果為1 System.out.println(jedis.exists("key"));//檢查key是否存在 System.out.println(jedis.rename("timekey","time")); System.out.println(jedis.get("timekey"));//因為移除,返回為null System.out.println(jedis.get("time")); //因為將timekey 重新命名為time 所以可以取得值 min //jedis 排序 //注意,此處的rpush和lpush是List的操作。是一個雙向連結串列(但從表現來看的) jedis.del("a");//先清除資料,再加入資料進行測試 jedis.rpush("a", "1"); jedis.lpush("a","6"); jedis.lpush("a","3"); jedis.lpush("a","9"); System.out.println(jedis.lrange("a",0,-1));// [9, 3, 6, 1] System.out.println(jedis.sort("a")); //[1, 3, 6, 9] //輸入排序後結果 System.out.println(jedis.lrange("a",0,-1)); } }
  • Spring+Redis

    1.pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <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.volleyfo</groupId>
        <artifactId>jedis</artifactId>
        <version>1.0-SNAPSHOT</version>
        <dependencies>
         
            <!-- redis相關jar -->
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>2.9.0</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.10</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-redis</artifactId>
                <version>1.5.0.RELEASE</version>
            </dependency>
            <!-- spring 相關jar -->
            <!-- Spring 4.3.3 -->
            <!-- Core Container 核心容器 -->
            <!-- 核心工具類,Spring其它模組大量使用Spring-core -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>4.3.3.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
                <version>4.3.3.RELEASE</version>
            </dependency>
            <!-- 執行時Spring容器 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>4.3.3.RELEASE</version>
            </dependency>
            <!-- Spring容器對第三方包的整合 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
                <version>4.3.3.RELEASE</version>
                <type>jar</type>
                <scope>compile</scope>
            </dependency>
            <!-- Spring定義Bean的支援 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-beans</artifactId>
                <version>4.3.3.RELEASE</version>
            </dependency>
            <!-- 使用表示式語言在執行時查詢和操作物件 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-expression</artifactId>
                <version>4.3.3.RELEASE</version>
            </dependency>
            <!-- End Core Container 核心容器 -->
    
            <!-- AOP -->
            <!-- 基於代理的AOP支援 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aop</artifactId>
                <version>4.3.3.RELEASE</version>
            </dependency>
            <!-- 基於AspectJ的AOP支援 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
                <version>4.3.3.RELEASE</version>
            </dependency>
            <!-- aspectj -->
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjrt</artifactId>
                <version>1.8.5</version>
            </dependency>
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
                <version>1.8.5</version>
            </dependency>
            <!-- End AOP -->
    
            <!-- web -->
            <!-- 提供基礎的web整合的功能,在web專案中提供Spring容器 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>4.3.3.RELEASE</version>
            </dependency>
            <!-- 提供基於Servlet的SpringMVC -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc</artifactId>
                <version>4.3.3.RELEASE</version>
            </dependency>
            <!-- 提供WebSocket功能 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-websocket</artifactId>
                <version>4.3.3.RELEASE</version>
            </dependency>
            <!-- 提供Portlet環境支援 -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-webmvc-portlet</artifactId