Redis结合springboot及redis常用命令

概述

本文内容主要

  • 关于spring-redis
  • 关于redis的key设计
  • redis的基本数据结构
  • 介绍redis与springboot的整合
  • sringboot中的redistemplate的使用

redis常用命令:redis常用命令

转载: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>

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 学习(二) —— 数据类型及操作 安装参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot是一个开源的Java开发框架,它简化了Java应用程序的开发过程。它提供了一系列的工具、库和约定,使得开发人员可以轻松地构建独立的、可执行的、可部署的Spring应用程序。 Vue是一个渐进式的JavaScript框架,用于构建用户界面。它提供了一些先进的特性,如数据绑定、组件化和虚拟DOM,使得开发人员能够更高效地构建交互式的Web应用程序。 Redis是一个开源的内存数据库,它提供了丰富的数据结构和功能,如字符串、哈希、列表、集合和有序集合。它被广泛用于缓存、会话管理和消息队列等场景,可以大大提高应用程序的性能和可扩展性。 结合使用Spring Boot、Vue和Redis可以构建一个强大的Web应用程序。Spring Boot提供了简化开发和部署的能力,Vue提供了灵活、高效的前端开发框架,而Redis提供了高性能的数据存储和访问能力。 使用Spring Boot和Vue可以实现前后端分离的开发模式,前后端可以独立开发和部署。通过调用Spring Boot的RESTful接口,Vue可以获取、修改和展示数据。此外,Vue的SPA(单页应用)特性可以使得应用程序更加流畅和用户友好。 而Redis可以用作应用程序的缓存层,存储常用、频繁访问的数据,从而减轻数据库的负载,提高响应速度。同时,Redis还可以用作分布式锁和消息队列,使应用程序更加健壮和可靠。 总之,Spring Boot、Vue和Redis结合可以提供一个高效、可伸缩的Web开发解决方案。通过合理地利用它们的特性和功能,开发人员可以构建出功能丰富、性能优异的Web应用程序。 ### 回答2: Spring Boot是一个开源的Java开发框架,它简化了Java应用程序的开发过程。它基于Spring框架,提供了自动化配置和默认值设置,使得开发人员可以更加快速、简便地构建可独立运行的、生产级别的Spring应用程序。 Vue是一个开源的JavaScript框架,用于构建用户界面。与传统的JavaScript开发方式相比,Vue采用了响应式数据绑定和组件化的开发方式,使得开发者可以更加高效地构建交互式的前端界面。 Redis是一个开源的内存数据库,它支持多种数据结构的存储和操作。Redis具有高性能的特点,可以有效地存储和访问大量的数据。它还提供了多种数据操作命令和集群部署方案,供开发人员使用。 将这三个技术结合在一起可以带来一些好处。首先,Spring Boot提供了对Redis的集成支持,使得开发人员可以方便地使用Redis进行缓存和数据存储。这可以提高应用程序的性能和响应速度。 其次,Vue可以通过Ajax和后端的Spring Boot应用程序进行交互。Vue的组件化开发方式使得前端界面的开发更加模块化和可维护。开发人员可以使用Vue的响应式数据绑定和组件通信机制,实现复杂的用户界面交互逻辑。 最后,Redis的高性能和多种数据结构的支持可以为应用程序提供强大的数据存储和缓存能力。开发人员可以使用Redis提供的命令进行数据操作,例如设置、获取和删除数据,以及对数据进行排序和计数等操作。 综上所述,结合Spring Boot、Vue和Redis可以构建高效、可靠的应用程序。使用Spring Boot进行后端开发,Vue进行前端开发,同时利用Redis提供的缓存和数据存储能力,可以使得应用程序的开发过程更加简单和高效,同时提高应用程序的性能和用户体验。 ### 回答3: Spring Boot是一个基于Spring框架的快速开发框架,它通过简化配置和自动化功能来提高开发效率。它集成了许多常用的开发工具和组件,提供了快速构建和部署应用程序的能力。Vue是一个前端框架,它可以通过编写组件化的界面来开发用户界面。Redis是一个内存数据库,它可以用来缓存数据,提高应用程序的性能。 通过结合使用Spring Boot、Vue和Redis,可以实现一个强大的Web应用程序。首先,使用Spring Boot提供的快速开发能力来构建后端逻辑和API接口。Spring Boot具有良好的松耦合性和高度灵活性,可以轻松集成各种其他组件和技术,比如数据库访问、安全认证等。 然后,在前端部分使用Vue来构建用户界面。Vue的组件化开发模式使得开发者可以将界面划分为多个独立的组件,每个组件负责特定的功能和视图。这样可以实现更好的代码重用和维护性,并提供良好的用户体验。 最后,使用Redis来缓存数据以提高应用程序的性能。Redis具有快速的读写能力,并支持多种数据结构的存储,如字符串、列表、哈希等。通过将经常访问的数据存储到Redis中,可以减少数据库的访问次数,从而加快应用程序的响应速度。 综上所述,通过结合使用Spring Boot、Vue和Redis,可以构建一个高效、可扩展的Web应用程序。Spring Boot提供了快速开发和集成能力,Vue提供了优秀的用户界面开发方式,而Redis可以提供高速的数据缓存能力。这样的技术组合可以满足现代Web应用程序对性能和可靠性的要求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值