springboot之使用redistemplate優雅地操作redis


概述

本文內容主要

  • 關於spring-redis
  • 關於redis的key設計
  • redis的基本數據結構
  • 介紹redis與springboot的整合
  • sringboot中的redistemplate的使用

之前看了很多博客,大都都只是粗略的介紹,這里想要記錄的全面一些,也算是一個學習的過程
首發於我的個人博客:janti的個人博客

關於spring-redis

spring-data-redis針對jedis提供了如下功能:

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

   
   
  
  
          
  1. 針對jedis客戶端中大量api進行了歸類封裝,將同一類型操作封裝為operation接口

ValueOperations:簡單K-V操作
SetOperations:set類型數據操作
ZSetOperations:zset類型數據操作
HashOperations:針對map類型的數據操作
ListOperations:針對list類型的數據操作

3. 提供了對key的“bound”(綁定)便捷化操作API,可以通過bound封裝指定的key,然后進行一系列的操作而無須“顯式”的再次指定Key,即BoundKeyOperations:

BoundValueOperations
BoundSetOperations
BoundListOperations
BoundSetOperations
BoundHashOperations

4. 將事務操作封裝,有容器控制。

5. 針對數據的“序列化/反序列化”,提供了多種可選擇策略(RedisSerializer)

JdkSerializationRedisSerializer:POJO對象的存取場景,使用JDK本身序列化機制,將pojo類通過ObjectInputStream/ObjectOutputStream進行序列化操作,最終redis-server中將存儲字節序列。是目前最常用的序列化策略。

StringRedisSerializer:Key或者value為字符串的場景,根據指定的charset對數據的字節序列編碼成string,是“new String(bytes, charset)”和“string.getBytes(charset)”的直接封裝。是最輕量級和高效的策略。

JacksonJsonRedisSerializer:jackson-json工具提供了javabean與json之間的轉換能力,可以將pojo實例序列化成json格式存儲在redis中,也可以將json格式的數據轉換成pojo實例。因為jackson工具在序列化和反序列化時,需要明確指定Class類型,因此此策略封裝起來稍微復雜。【需要jackson-mapper-asl工具支持】

OxmSerializer:提供了將javabean與xml之間的轉換能力,目前可用的三方支持包括jaxb,apache-xmlbeans;redis存儲的數據將是xml工具。不過使用此策略,編程將會有些難度,而且效率最低;不建議使用。【需要spring-oxm模塊的支持】

如果你的數據需要被第三方工具解析,那么數據應該使用StringRedisSerializer而不是JdkSerializationRedisSerializer。

關於key的設計

key的存活時間:

無論什么時候,只要有可能就利用key超時的優勢。一個很好的例子就是儲存一些諸如臨時認證key之類的東西。當你去查找一個授權key時——以OAUTH為例——通常會得到一個超時時間。
這樣在設置key的時候,設成同樣的超時時間,Redis就會自動為你清除。

關系型數據庫的redis

1: 把表名轉換為key前綴 如, tag:
2: 第2段放置用於區分區key的字段--對應mysql中的主鍵的列名,如userid
3: 第3段放置主鍵值,如2,3,4...., a , b ,c
4: 第4段,寫要存儲的列名
例:user:userid:9:username

Redis的數據類型

String字符串

  • string是redis最基本的類型,一個key對應一個value。
  • string類型是二進制安全的。意思是redis的string可以包含任何數據。比如jpg圖片或者序列化的對象 。
  • string類型是Redis最基本的數據類型,一個鍵最大能存儲512MB。
  • String類型的操作參考

鏈表

  • redis列表是簡單的字符串列表,排序為插入的順序。列表的最大長度為2^32-1。
  • redis的列表是使用鏈表實現的,這意味着,即使列表中有上百萬個元素,增加一個元素到列表的頭部或尾部的操作都是在常量的時間完成。
  • 可以用列表獲取最新的內容(像帖子,微博等),用ltrim很容易就會獲取最新的內容,並移除舊的內容。
  • 用列表可以實現生產者消費者模式,生產者調用lpush添加項到列表中,消費者調用rpop從列表中提取,如果沒有元素,則輪詢去獲取,或者使用brpop等待生產者添加項到列表中。

  • List類型的操作參考

集合

  • redis集合是無序的字符串集合,集合中的值是唯一的,無序的。可以對集合執行很多操作,例如,測試元素是否存在,對多個集合執行交集、並集和差集等等。
  • 我們通常可以用集合存儲一些無關順序的,表達對象間關系的數據,例如用戶的角色,可以用sismember很容易就判斷用戶是否擁有某個角色。
  • 在一些用到隨機值的場合是非常適合的,可以用 srandmember/spop 獲取/彈出一個隨機元素。
    同時,使用@EnableCaching開啟聲明式緩存支持,這樣就可以使用基於注解的緩存技術。注解緩存是一個對緩存使用的抽象,通過在代碼中添加下面的一些注解,達到緩存的效果。
  • Set類型的操作參考

ZSet 有序集合

  • 有序集合由唯一的,不重復的字符串元素組成。有序集合中的每個元素都關聯了一個浮點值,稱為分數。可以把有序看成hash和集合的混合體,分數即為hash的key。

  • 有序集合中的元素是按序存儲的,不是請求時才排序的。
  • ZSet類型的操作類型

Hash-哈希

  • redis的哈希值是字符串字段和字符串之間的映射,是表示對象的完美數據類型。

  • 哈希中的字段數量沒有限制,所以可以在你的應用程序以不同的方式來使用哈希。

  • Hash類型的操作參考

springboot 與redis的整合

pom文件

依賴如下:

   <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
        <relativePath/>
    </parent>
<span class="hljs-tag">&lt;<span class="hljs-name">dependencies</span>&gt;</span>
    <span class="hljs-comment">&lt;!-- spring boot 配置 --&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.springframework.boot<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>spring-boot-starter-web<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.springframework.boot<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>spring-boot-starter-thymeleaf<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.springframework.boot<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>spring-boot-starter-test<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">scope</span>&gt;</span>test<span class="hljs-tag">&lt;/<span class="hljs-name">scope</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>

    <span class="hljs-tag">&lt;<span class="hljs-name">dependency</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">groupId</span>&gt;</span>org.springframework.boot<span class="hljs-tag">&lt;/<span class="hljs-name">groupId</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">artifactId</span>&gt;</span>spring-boot-starter-data-redis<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">dependency</span>&gt;</span>


<span class="hljs-tag">&lt;/<span class="hljs-name">dependencies</span>&gt;</span></code></pre>

application.properties

# Redis數據庫索引(默認為0)
spring.redis.database=0  
# Redis服務器地址
spring.redis.host=127.0.0.1
# Redis服務器連接端口
spring.redis.port=6379  
# Redis服務器連接密碼(默認為空)
spring.redis.password=
# 連接池最大連接數(使用負值表示沒有限制)
spring.redis.pool.max-active=8  
# 連接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.pool.max-wait=-1  
# 連接池中的最大空閑連接
spring.redis.pool.max-idle=8  
# 連接池中的最小空閑連接
spring.redis.pool.min-idle=0  
# 連接超時時間(毫秒)
spring.redis.timeout=0  

redisTemplate的配置

新建一個redisConfig類,進行相關bean的配置:

package com.config; 

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**

  • @author janti

  • reids 相關bean的配置
    */
    @Configuration
    @EnableCaching
    public class RedisConfig extends CachingConfigurerSupport {

    /**
    * 選擇redis作為默認緩存工具
    * @param redisTemplate
    * @return
    */

    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate) {
    RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
    return rcm;
    }

    /**
    * retemplate相關配置
    * @param factory
    * @return
    */

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {

     RedisTemplate&lt;<span class="hljs-built_in">String</span>, <span class="hljs-built_in">Object</span>&gt; template = <span class="hljs-keyword">new</span> RedisTemplate&lt;&gt;();
     <span class="hljs-comment">// 配置連接工廠</span>
     template.setConnectionFactory(<span class="hljs-keyword">factory</span>);
    
     <span class="hljs-comment">//使用Jackson2JsonRedisSerializer來序列化和反序列化redis的value值(默認使用JDK的序列化方式)</span>
     Jackson2JsonRedisSerializer jacksonSeial = <span class="hljs-keyword">new</span> Jackson2JsonRedisSerializer(<span class="hljs-built_in">Object</span>.<span class="hljs-keyword">class</span>);
    
     ObjectMapper om = <span class="hljs-keyword">new</span> ObjectMapper();
     <span class="hljs-comment">// 指定要序列化的域,field,get和set,以及修飾符范圍,ANY是都有包括private和public</span>
     om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
     <span class="hljs-comment">// 指定序列化輸入的類型,類必須是非final修飾的,final修飾的類,比如String,Integer等會跑出異常</span>
     om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
     jacksonSeial.setObjectMapper(om);
    
     <span class="hljs-comment">// 值采用json序列化</span>
     template.setValueSerializer(jacksonSeial);
     <span class="hljs-comment">//使用StringRedisSerializer來序列化和反序列化redis的key值</span>
     template.setKeySerializer(<span class="hljs-keyword">new</span> StringRedisSerializer());
    
     <span class="hljs-comment">// 設置hash key 和value序列化模式</span>
     template.setHashKeySerializer(<span class="hljs-keyword">new</span> StringRedisSerializer());
     template.setHashValueSerializer(jacksonSeial);
     template.afterPropertiesSet();
    
     <span class="hljs-keyword">return</span> template;
    

    }

    /**
    * 對hash類型的數據操作
    *
    * @param redisTemplate
    * @return
    */

    @Bean
    public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
    return redisTemplate.opsForHash();
    }

    /**
    * 對redis字符串類型數據操作
    *
    * @param redisTemplate
    * @return
    */

    @Bean
    public ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) {
    return redisTemplate.opsForValue();
    }

    /**
    * 對鏈表類型的數據操作
    *
    * @param redisTemplate
    * @return
    */

    @Bean
    public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
    return redisTemplate.opsForList();
    }

    /**
    * 對無序集合類型的數據操作
    *
    * @param redisTemplate
    * @return
    */

    @Bean
    public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
    return redisTemplate.opsForSet();
    }

    /**
    * 對有序集合類型的數據操作
    *
    * @param redisTemplate
    * @return
    */

    @Bean
    public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
    return redisTemplate.opsForZSet();
    }
    }

  • spring-redis中使用了RedisTemplate來進行redis的操作,通過泛型的K和V設置鍵值對的對象類型。這里使用了string作為key的對象類型,值為Object。

  • 對於Object,spring-redis默認使用了jdk自帶的序列化,不推薦使用默認了。所以使用了json的序列化方式

  • 對spring-redis對redis的五種數據類型也有支持
  • HashOperations:對hash類型的數據操作
  • ValueOperations:對redis字符串類型數據操作
  • ListOperations:對鏈表類型的數據操作
  • SetOperations:對無序集合類型的數據操作
  • ZSetOperations:對有序集合類型的數據操作

redis操作的工具類

package com.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Collection;
import java.util.Date;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@Component
public class RedisService {
@Autowired
private RedisTemplate<String, String> redisTemplate;

<span class="hljs-comment">/**
 * 默認過期時長,單位:秒
 */</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">long</span> DEFAULT_EXPIRE = <span class="hljs-number">60</span> * <span class="hljs-number">60</span> * <span class="hljs-number">24</span>;

<span class="hljs-comment">/**
 * 不設置過期時長
 */</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">long</span> NOT_EXPIRE = -<span class="hljs-number">1</span>;




<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">existsKey</span><span class="hljs-params">(String key)</span> </span>{
    <span class="hljs-keyword">return</span> redisTemplate.hasKey(key);
}

<span class="hljs-comment">/**
 * 重名名key,如果newKey已經存在,則newKey的原值被覆蓋
 *
 * <span class="hljs-doctag">@param</span> oldKey
 * <span class="hljs-doctag">@param</span> newKey
 */</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">renameKey</span><span class="hljs-params">(String oldKey, String newKey)</span> </span>{
    redisTemplate.rename(oldKey, newKey);
}

<span class="hljs-comment">/**
 * newKey不存在時才重命名
 *
 * <span class="hljs-doctag">@param</span> oldKey
 * <span class="hljs-doctag">@param</span> newKey
 * <span class="hljs-doctag">@return</span> 修改成功返回true
 */</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">renameKeyNotExist</span><span class="hljs-params">(String oldKey, String newKey)</span> </span>{
    <span class="hljs-keyword">return</span> redisTemplate.renameIfAbsent(oldKey, newKey);
}

<span class="hljs-comment">/**
 * 刪除key
 *
 * <span class="hljs-doctag">@param</span> key
 */</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">deleteKey</span><span class="hljs-params">(String key)</span> </span>{
    redisTemplate.delete(key);
}

<span class="hljs-comment">/**
 * 刪除多個key
 *
 * <span class="hljs-doctag">@param</span> keys
 */</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">deleteKey</span><span class="hljs-params">(String... keys)</span> </span>{
    Set&lt;String&gt; kSet = Stream.of(keys).map(k -&gt; k).collect(Collectors.toSet());
    redisTemplate.delete(kSet);
}

<span class="hljs-comment">/**
 * 刪除Key的集合
 *
 * <span class="hljs-doctag">@param</span> keys
 */</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">deleteKey</span><span class="hljs-params">(Collection&lt;String&gt; keys)</span> </span>{
    Set&lt;String&gt; kSet = keys.stream().map(k -&gt; k).collect(Collectors.toSet());
    redisTemplate.delete(kSet);
}

<span class="hljs-comment">/**
 * 設置key的生命周期
 *
 * <span class="hljs-doctag">@param</span> key
 * <span class="hljs-doctag">@param</span> time
 * <span class="hljs-doctag">@param</span> timeUnit
 */</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">expireKey</span><span class="hljs-params">(String key, <span class="hljs-keyword">long</span> time, TimeUnit timeUnit)</span> </span>{
    redisTemplate.expire(key, time, timeUnit);
}

<span class="hljs-comment">/**
 * 指定key在指定的日期過期
 *
 * <span class="hljs-doctag">@param</span> key
 * <span class="hljs-doctag">@param</span> date
 */</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">expireKeyAt</span><span class="hljs-params">(String key, Date date)</span> </span>{
    redisTemplate.expireAt(key, date);
}

<span class="hljs-comment">/**
 * 查詢key的生命周期
 *
 * <span class="hljs-doctag">@param</span> key
 * <span class="hljs-doctag">@param</span> timeUnit
 * <span class="hljs-doctag">@return</span>
 */</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">long</span> <span class="hljs-title">getKeyExpire</span><span class="hljs-params">(String key, TimeUnit timeUnit)</span> </span>{
    <span class="hljs-keyword">return</span> redisTemplate.getExpire(key, timeUnit);
}

<span class="hljs-comment">/**
 * 將key設置為永久有效
 *
 * <span class="hljs-doctag">@param</span> key
 */</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">persistKey</span><span class="hljs-params">(String key)</span> </span>{
    redisTemplate.persist(key);
}

}

redis的key工具類

package com.util;

/**

  • redisKey設計
    */
    public class RedisKeyUtil {

    /**
    * redis的key
    * 形式為:
    * 表名:主鍵名:主鍵值:列名

    * @param tableName 表名
    * @param majorKey 主鍵名
    * @param majorKeyValue 主鍵值
    * @param column 列名
    * @return
    /

    public static String getKeyWithColumn(String tableName,String majorKey,String majorKeyValue,String column){
    StringBuffer buffer = new StringBuffer();
    buffer.append(tableName).append(":");
    buffer.append(majorKey).append(":");
    buffer.append(majorKeyValue).append(":");
    buffer.append(column);
    return buffer.toString();
    }
    /

    * redis的key
    * 形式為:
    * 表名:主鍵名:主鍵值
    *
    * @param tableName 表名
    * @param majorKey 主鍵名
    * @param majorKeyValue 主鍵值
    * @return
    */
    public static String getKey(String tableName,String majorKey,String majorKeyValue){
    StringBuffer buffer = new StringBuffer();
    buffer.append(tableName).append(":");
    buffer.append(majorKey).append(":");
    buffer.append(majorKeyValue).append(":");
    return buffer.toString();
    }
    }

如何使用?

測試代碼

新建一個實體類:

package com.domain;

public class UserVo {

<span class="hljs-keyword">public</span>  <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String Table = <span class="hljs-string">"t_user"</span>;

<span class="hljs-keyword">private</span> String name;
<span class="hljs-keyword">private</span> String address;
<span class="hljs-keyword">private</span> Integer age;

<span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getName</span><span class="hljs-params">()</span> </span>{
    <span class="hljs-keyword">return</span> name;
}

<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setName</span><span class="hljs-params">(String name)</span> </span>{
    <span class="hljs-keyword">this</span>.name = name;
}

<span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">getAddress</span><span class="hljs-params">()</span> </span>{
    <span class="hljs-keyword">return</span> address;
}

<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setAddress</span><span class="hljs-params">(String address)</span> </span>{
    <span class="hljs-keyword">this</span>.address = address;
}

<span class="hljs-function"><span class="hljs-keyword">public</span> Integer <span class="hljs-title">getAge</span><span class="hljs-params">()</span> </span>{
    <span class="hljs-keyword">return</span> age;
}

<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setAge</span><span class="hljs-params">(Integer age)</span> </span>{
    <span class="hljs-keyword">this</span>.age = age;
}


<span class="hljs-meta">@Override</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">toString</span><span class="hljs-params">()</span> </span>{
    <span class="hljs-keyword">return</span> <span class="hljs-string">"UserVo{"</span> +
            <span class="hljs-string">"name='"</span> + name + <span class="hljs-string">'\''</span> +
            <span class="hljs-string">", address='"</span> + address + <span class="hljs-string">'\''</span> +
            <span class="hljs-string">", age="</span> + age +
            <span class="hljs-string">'}'</span>;
}

}

再新建一個測試類:

package com.config;

import com.domain.UserVo;
import com.service.RedisService;
import com.util.RedisKeyUtil;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.*;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

import java.util.Set;
import java.util.concurrent.TimeUnit;

import static org.junit.Assert.*;

@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisConfigTest {

<span class="hljs-meta">@Autowired</span>
<span class="hljs-keyword">private</span> StringRedisTemplate stringRedisTemplate;

<span class="hljs-meta">@Autowired</span>
<span class="hljs-keyword">private</span> RedisTemplate redisTemplate;

<span class="hljs-meta">@Resource</span>
<span class="hljs-keyword">private</span> ValueOperations&lt;String,Object&gt; valueOperations;

<span class="hljs-meta">@Autowired</span>
<span class="hljs-keyword">private</span> HashOperations&lt;String, String, Object&gt; hashOperations;

<span class="hljs-meta">@Autowired</span>
<span class="hljs-keyword">private</span> ListOperations&lt;String, Object&gt; listOperations;

<span class="hljs-meta">@Autowired</span>
<span class="hljs-keyword">private</span> SetOperations&lt;String, Object&gt; setOperations;

<span class="hljs-meta">@Autowired</span>
<span class="hljs-keyword">private</span> ZSetOperations&lt;String, Object&gt; zSetOperations;

<span class="hljs-meta">@Resource</span>
<span class="hljs-keyword">private</span> RedisService redisService;

<span class="hljs-meta">@Test</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">testObj</span><span class="hljs-params">()</span> <span class="hljs-keyword">throws</span> Exception</span>{
    UserVo userVo = <span class="hljs-keyword">new</span> UserVo();
    userVo.setAddress(<span class="hljs-string">"上海"</span>);
    userVo.setName(<span class="hljs-string">"測試dfas"</span>);
    userVo.setAge(<span class="hljs-number">123</span>);
    ValueOperations&lt;String,Object&gt; operations = redisTemplate.opsForValue();
    redisService.expireKey(<span class="hljs-string">"name"</span>,<span class="hljs-number">20</span>, TimeUnit.SECONDS);
    String key = RedisKeyUtil.getKey(UserVo.Table,<span class="hljs-string">"name"</span>,userVo.getName());
    UserVo vo = (UserVo) operations.get(key);
    System.out.println(vo);
}

<span class="hljs-meta">@Test</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">testValueOption</span><span class="hljs-params">( )</span><span class="hljs-keyword">throws</span>  Exception</span>{
    UserVo userVo = <span class="hljs-keyword">new</span> UserVo();
    userVo.setAddress(<span class="hljs-string">"上海"</span>);
    userVo.setName(<span class="hljs-string">"jantent"</span>);
    userVo.setAge(<span class="hljs-number">23</span>);
    valueOperations.set(<span class="hljs-string">"test"</span>,userVo);

    System.out.println(valueOperations.get(<span class="hljs-string">"test"</span>));
}

<span class="hljs-meta">@Test</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">testSetOperation</span><span class="hljs-params">()</span> <span class="hljs-keyword">throws</span> Exception</span>{
    UserVo userVo = <span class="hljs-keyword">new</span> UserVo();
    userVo.setAddress(<span class="hljs-string">"北京"</span>);
    userVo.setName(<span class="hljs-string">"jantent"</span>);
    userVo.setAge(<span class="hljs-number">23</span>);
    UserVo auserVo = <span class="hljs-keyword">new</span> UserVo();
    auserVo.setAddress(<span class="hljs-string">"n櫃昂周"</span>);
    auserVo.setName(<span class="hljs-string">"antent"</span>);
    auserVo.setAge(<span class="hljs-number">23</span>);
    setOperations.add(<span class="hljs-string">"user:test"</span>,userVo,auserVo);
    Set&lt;Object&gt; result = setOperations.members(<span class="hljs-string">"user:test"</span>);
    System.out.println(result);
}

<span class="hljs-meta">@Test</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">HashOperations</span><span class="hljs-params">()</span> <span class="hljs-keyword">throws</span> Exception</span>{
    UserVo userVo = <span class="hljs-keyword">new</span> UserVo();
    userVo.setAddress(<span class="hljs-string">"北京"</span>);
    userVo.setName(<span class="hljs-string">"jantent"</span>);
    userVo.setAge(<span class="hljs-number">23</span>);
    hashOperations.put(<span class="hljs-string">"hash:user"</span>,userVo.hashCode()+<span class="hljs-string">""</span>,userVo);
    System.out.println(hashOperations.get(<span class="hljs-string">"hash:user"</span>,userVo.hashCode()+<span class="hljs-string">""</span>));
}

<span class="hljs-meta">@Test</span>
<span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span>  <span class="hljs-title">ListOperations</span><span class="hljs-params">()</span> <span class="hljs-keyword">throws</span> Exception</span>{
    UserVo userVo = <span class="hljs-keyword">new</span> UserVo();
    userVo.setAddress(<span class="hljs-string">"北京"</span>);
    userVo.setName(<span class="hljs-string">"jantent"</span>);
    userVo.setAge(<span class="hljs-number">23</span>);

// listOperations.leftPush("list:user",userVo);
// System.out.println(listOperations.leftPop("list:user"));
// pop之后 值會消失
System.out.println(listOperations.leftPop("list:user"));
}
}

注解緩存的使用

  • @Cacheable:在方法執行前Spring先查看緩存中是否有數據,如果有數據,則直接返回緩存數據;沒有則調用方法並將方法返回值放進緩存。

  • @CachePut:將方法的返回值放到緩存中。

  • @CacheEvict:刪除緩存中的數據。

最后所有的代碼都被上傳到我的github喜歡的話,給個start

參考:
Redis 學習(二) —— 數據類型及操作
安裝參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM