Spring-data-redis操做redis知識總結

什麼是spring-data-redis

      spring-data-redis是spring-data模塊的一部分,專門用來支持在spring管理項目對redis的操做,使用java操做redis最經常使用的是使用jedis,但並非只有jedis可使用,像jdbc-redis,jredis也都屬於redis的java客戶端,他們之間是沒法兼容的,若是你在一個項目中使用了jedis,而後後來決定棄用掉改用jdbc-redis就比較麻煩了,spring-data-redis提供了redis的java客戶端的抽象,在開發中能夠忽略掉切換具體的客戶端所帶來的影響,並且他自己就屬於spring的一部分,比起單純的使用jedis,更加穩定.管理起來更加自動化.(固然jedis的缺點不止以上).java

spring-data-redis的特性

      1.自動管理鏈接池,提供了一個高度封裝的RedisTemplate類redis

      2.針對jedis客戶端的大量api進行了歸類封裝,把同一類型的操做封裝成了Operation接口.支持redis中的五種數據類型的操做.spring

  3.針對數據的"序列化與反序列化",提供了多種能夠選擇的策略(RedisSerializer)數據庫

            JdkSerializationRedisSerializer:當須要存儲java對象時使用.apache

            StringRedisSerializer:當須要存儲string類型的字符串時使用.json

            JacksonJsonRedisSerializer:將對象序列化成json的格式存儲在redis中,須要jackson-json工具的支持,(目前我還沒使用過,不瞭解)api

Operations

  redisTemplate有兩個方法常常用到,一個是opsForXXX一個是boundXXXOps,XXX是value的類型,前者獲取到一個Opercation,可是沒有指定操做的key,能夠在一個鏈接(事務)內操做多個key以及對應的value;後者會獲取到一個指定了key的operation,在一個鏈接內只操做這個key對應的value.數組

ValueOperation和BoundValueOperation

ValueOperations valueOperations = redisTemplate.opsForValue();瀏覽器

BoundValueOperations<String, User> boundValueOps = redisTemplate.boundValueOps("key");緩存

  ValueOperation能夠緩存Integer,String,java對象等類型.使用.set(key,value)方法進行設置,get(key)方法用來獲取.

      一樣的方式能夠獲取ListOperations對象,能夠用來緩存List,此外還有SetOperation,HashOperation

在spring+springmvc項目中使用spring-data-redis

   1.maven配置,添加pom依賴

 1 <dependency>
 2      <groupId>org.springframework.data</groupId>
 3      <artifactId>spring-data-redis</artifactId>
 4      <version>1.3.4.RELEASE</version>
 5 </dependency>
 6 
 7 <dependency>
 8      <groupId>redis.clients</groupId>
 9      <artifactId>jedis</artifactId>
10      <version>2.4.2</version>
11 </dependency>

  2.spring-redis.xml配置:

 <!--JedisPoolConfig 鏈接池參數配置-->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!--最大空閒實例數-->
        <property name="maxIdle" value="300" />
        <!--最大活躍實例數-->
        <property name="maxTotal" value="600" />
        <!--建立實例時最長等待時間-->
        <property name="maxWaitMillis" value="1000" />
        <!--建立實例時是否驗證-->
        <property name="testOnBorrow" value="true" />
    </bean>

    <!--JedisConnectionFactory 跟配置數據庫鏈接池相似,須要配置JedisConnectionFactory來經過服務器或者鏈接池的方式獲取redis服務器的鏈接-->
    <bean id="connectionFactory"
          class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="127.0.0.1"/>
        <property name="port" value="6379"/>
        <property name="usePool" value="true"/>
        <property name="poolConfig" ref="poolConfig"/>
    </bean>

    <bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
    <bean id="valueSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>


    <!-- redis模板配置  spring-data-redis提供了一個基礎的泛型RedisTemplate封裝了基礎的crud操做-->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="defaultSerializer" ref="stringRedisSerializer"/>
        <property name="keySerializer" ref="stringRedisSerializer"/>
        <property name="valueSerializer" ref="valueSerializer"/>

    </bean>

        以上配置完成後,就可使用spring-data-redis了,爲了演示一下具體的使用,這裏接着寫一個簡單地demo.

3.建立實體類User

 1 public class User implements Serializable {
 2 
 3     private static final long serialVersionUID = 1L;
 4 
 5     /** 用戶ID */
 6     private Long id;
 7 
 8     /** 用戶名 */
 9     private String name;
10 
11     /** 用戶年齡 */
12     private Integer age;
13 }

       注意:若是須要向redis內存儲pojo對象,那麼該對象必需要實現Serializable接口,由於在redis中存儲pojo類仍然存儲的是string,它會把數據轉化成byte[]數組的形式,在存取的時候就要對數據格式進行轉化,就涉及到了序列化與反序列化.

      4.建立UserCcontroller

@Controller
public class UserController extends BaseController {

    @Autowired
    private IUserService userService;

    @Autowired
    private RedisTemplate<String,User> redisTemplate;

    @ResponseBody
    @RequestMapping("/redis")
    public Object redis() {

        User u1=new User();
        u1.setId(1L);
        u1.setName("wang");
        u1.setAge(22);
        redisTemplate.opsForValue().set("user:wang",u1);

        User u2=redisTemplate.opsForValue().get("user:wang");
        return u2;
    }
}

         這裏咱們將user對象存儲到redis中,再讀出來,運行項目,測試這個接口,就能夠在瀏覽器中看到json格式的user對象.

常見報錯及解決方案

     最開始我測試spring-data-redis的功能是從一個空項目一點點配置的,啓動時報了不少異常,下面一個一個來.

     1.啓動tomcat報錯

Caused by: java.lang.VerifyError: (class: org/springframework/data/redis/connection/jedis/JedisConnectionFactory, 
method: afterPropertiesSet signature: ()V) Incompatible argument to function

      緣由及解決方案:

          在pom中我最開始配置的jedis版本是2.7.3,spring-data-redis版本是1.1.1,網上搜索了一翻,發現有一個說法是jedis-2.7.3.jar 和 spring-data-redis-1.1.1.RELEASE.jar 沒法搭配使用,因而我把spring-data-redis的版本設成比較高的1.3.4,從新部署,果真此問題解決,緊接着問題又來了.

  2.啓動tomcat報錯

Caused by: Java.lang.NoSuchMethodError: redis.clients.jedis.JedisShardInfo.setTimeout(I)V

  緣由及解決方案:一樣是版本的問題(沒錯,都被我撞上了),jedis版本是2.7.3,過高了,改爲2.4.3之後,問題解決.

  3.啓動tomcat報錯

java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool

      緣由及解決方案:這個GenericObjectPool使用到了commons-pool.jar中的類,咱們的依賴中沒有這個jar,因此添加commons-pool的dependency便可.

  4.運行接口報錯

HTTP Status 500 - Request processing failed; nested exception is java.lang.ClassCastException: com.baomidou.springmvc.model.system.User cannot be cast to java.lang.String

  緣由及解決方案:在spring-redis配置文件中的redisTemplate的property中缺乏name="valueSerializer"的配置,由於存儲在redis的value是user對象,須要使用JdkSerializationRedisSerializer對象進行對象的序列化操做,解決方案就是配置成上面spring-redis.xml的方式.

相關文章
相關標籤/搜索