二八佳人体似酥,腰间仗剑斩愚夫。虽然不见人头落,暗里教君骨髓枯。

上一章简单介绍了多数据源配置MyBatisPlus(十八),如果没有看过,请观看上一章

一. Redis的介绍和安装

关于Redis介绍和教程,可以看官网介绍

Redis教程

Redis的 Windows版本的安装,可以看官网介绍:

Redis Windows 版本安装

二. SpringBoot 整合 Redis的简单用法

二.一 环境准备

二.一.一 Redis服务器安装并且启动成功

说明目前 Redis服务器启动成功, 客户端可以正常的连接,访问并操作。

127.0.0.1:6379> auth zk123   // 密码登录
OK
127.0.0.1:6379> select 15    //选择第16个,即最后一个数据库进行操作
OK
127.0.0.1:6379[15]> set name TwoButterfly   //set 命令设置值
OK
127.0.0.1:6379[15]> get name     //get 命令获取值
"TwoButterfly"
127.0.0.1:6379[15]> flushdb     //清空当前数据库的信息
OK
127.0.0.1:6379[15]> keys *    //查询数据库的信息
(empty list or set)
127.0.0.1:6379[15]>

二.一.二 创建SpringBoot整合Redis的项目 SpringBoot_Redis

按照 SpringBoot整合Mybatis的项目 SpringBoot_MyBatis 即可。

具体可以看 老蝴蝶以前写的文章。

springboot 数据库下有一个 user表, 对应的实体类为:

User.java

@Data
public class User implements Serializable {/*** @param id id编号* @param name 姓名* @param sex 性别* @param age 年龄* @param description 描述*/private Integer id;private String name;private String sex;private Integer age;private String description;
}

接下来,才是整合的关键.

二.二 pom.xml 添加依赖

在原有的依赖基础上,添加新的依赖

<!--依赖 data-redis的依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--不能忘记这个依赖--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency>

二.三 application.yml 配置文件配置Redis的相关信息

# 引入 数据库的相关配置
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/springboot?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=trueusername: rootpassword: abc123# 配置Redis的使用redis:database: 15 # 所使用的数据库  默认是0host: 127.0.0.1  #所使用的redis的主机地址port: 6379  # 端口号  默认是 6379password: zk123 # 密码timeout: 5000 # 超时时间  5000毫秒# 连接池 lettuce 的配置lettuce:pool:max-active: 100min-idle: 10max-wait: 100000

只需要简单的这两步,就可以将 Redis整合进来了。

二.四 SpringBoot整合Redis测试 RedisTests

只用简单的设置字符串和对象的操作,进行演示。

二.四.一 字符串类型测试

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
@Log4j2
public class RedisTests {@Autowiredprivate RedisTemplate redisTemplate;@Autowiredprivate StringRedisTemplate stringRedisTemplate;/*** 用String 进行举例。*/@Testpublic void stringTest(){//1. 放置普通的字符串信息String name="岳泽霖";redisTemplate.opsForValue().set("name",name);String getName=(String)redisTemplate.opsForValue().get("name");log.info("RedisTemplate获取信息:"+getName);stringRedisTemplate.opsForValue().set("sname",name);String sGetName=stringRedisTemplate.opsForValue().get("sname");log.info("StringRedisTemplate 获取信息:>>>"+sGetName);}
}

控制台打印:

控制台 打印的,都是正常的,不乱码。

通过Redis 客户端 进行查看

可以发现, RedisTemplate 设置的 name 变成了 乱码, 而 StringTemplate 并没有乱码。

查看对应的值 ,先看 name 的

发现 值 value 也是乱码的。

再看 sname 的:

值并不是乱码的。

二.四.二 设置 Bean 测试

@Testpublic void beanTest(){//1. 放置JavaBean 信息User user=new User();user.setId(1);user.setName("岳泽霖");user.setSex("男");user.setAge(26);user.setDescription("一个快乐的程序员");redisTemplate.opsForValue().set("bean",user);//获取信息User rUser=(User)redisTemplate.opsForValue().get("bean");log.info("RedisTemplate获取用户信息:>>>"+rUser.toString());//StringRedisTemplate 放置对象 user, 不太好放置。}

运行,控制台打印输出

从Redis客户端进行查看:

对象值发生了乱码, 不易查看。

发生乱码的原因,实际是没有对key 和 value进行相关的序列化。

二.五 Redis 对Key 和Value 序列化配置

二.五.一 序列化配置 RedisConfig

package top.yueshushu.learn.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisConfig {@Bean@SuppressWarnings("all")public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();template.setConnectionFactory(factory);Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();// key采用String的序列化方式template.setKeySerializer(new StringRedisSerializer());// hash的key也采用String的序列化方式template.setHashKeySerializer(stringRedisSerializer);template.setValueSerializer(jackson2JsonRedisSerializer);// hash的value序列化方式采用jacksontemplate.setHashValueSerializer(jackson2JsonRedisSerializer);template.afterPropertiesSet();return template;}
}

二.五.二 序列化测试

依次运行 stringTest() 方法和 beanTest() 方法, 查看客户端的相关信息

name:

bean:

这个时候,就很直观的展示出来了。

二.六 RedisUtil 工具类

Redis可以对 String,List,Set,Map,ZSet 等多种类型进行操作,一般都会创建相应的工具类。

老蝴蝶也创建了一个相应的工具类,方便使用。

package top.yueshushu.learn.util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Slf4j
@Component(value = "redisUtil")
public class RedisUtil {@Resourceprivate RedisTemplate<String, Object> redisTemplate;/** -------------------1.key相关操作--------------------- *//******1.1 删除操作开始******//*** 功能描述: 通过key删除key*/public void delByKey(String key) {redisTemplate.delete(key);}/*** 功能描述: 删除某个key是否成功,如果删除失败,则返回false.** @param key redis的键值* @return 返回是否删除成功*/public boolean remove(String key) {return Boolean.TRUE.equals(redisTemplate.delete(key));}/*** 功能描述: (谨慎使用) 以key为 前缀 模糊删除所有相关缓存数据 key+*** @param key 删除redis键值对的 前缀匹配*/public void deleteByPrefix(String key) {Set<String> keys = redisTemplate.keys(key + "*");if (!!CollectionUtils.isEmpty(keys)) {redisTemplate.delete(keys);}}/*** 功能描述:(谨慎使用)以key为 后缀 模糊删除所有相关缓存数据 *+key** @param key 删除redis键值对的 后缀*/public void deleteBySuffix(String key) {Set<String> keys = redisTemplate.keys("*" + key);if (!CollectionUtils.isEmpty(keys)) {redisTemplate.delete(keys);}}/*** 功能描述: 批量删除多个key** @param keys 删除多个key,集合的形式*/public void delete(Collection<String> keys) {redisTemplate.delete(keys);}public Long unlink(List<String> keys){return redisTemplate.unlink(keys);}public Boolean unlink(String key){return redisTemplate.unlink(key);}/*** 功能描述: (谨慎使用) 以key为 前缀 模糊删除所有相关缓存数据 key+** @param key 删除redis键值对的 前缀匹配*/public void unlinkByPrefix(String key) {Set<String> keys = redisTemplate.keys(key + "*");if (!!CollectionUtils.isEmpty(keys)) {redisTemplate.unlink(keys);}}/*** 功能描述:(谨慎使用)以key为 后缀 模糊删除所有相关缓存数据 *+key** @param key 删除redis键值对的 后缀*/public void unlinkBySuffix(String key) {Set<String> keys = redisTemplate.keys("*" + key);if (!CollectionUtils.isEmpty(keys)) {redisTemplate.unlink(keys);}}/******1.1 删除操作结束******//******1.2 设置值操作开始******//*** 功能描述: 通过key键存储值,可以是字符串,也可以是Java Bean对象。** @param key   redis的键值* @param value 存储的值信息* @return 返回是否存储成功*/public boolean set(String key, Object value) {try {redisTemplate.opsForValue().set(key, value);return true;} catch (Exception e) {log.error(e.getMessage(), e);return false;}}/*** 功能描述: 通过key键存储值,有失效时间,可以是字符串,也可以是Java Bean对象。** @param key           redis的键值* @param value         存储的值信息* @param expireSeconds 失效的时间,单位是秒* @return 返回是否存储成功*/public boolean set(String key, Object value, long expireSeconds) {try {if (expireSeconds > 0) {redisTemplate.opsForValue().set(key, value, expireSeconds, TimeUnit.SECONDS);} else {redisTemplate.opsForValue().set(key, value);}return true;} catch (Exception e) {log.error(e.getMessage(), e);return false;}}/*** 功能描述: 通过key键存储值,有失效时间,可以是字符串,也可以是Java Bean对象。** @param key      redis的键值* @param value    存储的值信息* @param time     失效的时间* @param timeUnit 失效的时间单位,有秒,分钟,小时,天。* @return 返回是否存储成功*/public boolean set(String key, Object value, long time, TimeUnit timeUnit) {try {if (time > 0) {redisTemplate.opsForValue().set(key, value, time, timeUnit);} else {redisTemplate.opsForValue().set(key, value);}return true;} catch (Exception e) {log.error("发生异常", e);return false;}}/*** 功能描述: 通过key键存储值,指定失效日期,可以是字符串,也可以是Java Bean对象。* @param key redis的键值* @param value 存储的值信息* @param date 失效的时间* @return 返回是否存储成功*/public boolean setExpireAt(String key, Object value, Date date) {try {redisTemplate.opsForValue().set(key, value);redisTemplate.expireAt(key, date);return true;} catch (Exception e) {log.error("发生异常", e);return false;}}/*** 功能描述: 如果key值,不存在,才进行设置。 通过key键存储值,可以是字符串,也可以是Java Bean对象。** @param key   redis的键值* @param value 存储的值信息* @return 返回是否存储成功*/public boolean setIfAbsent(String key, Object value) {try {return redisTemplate.opsForValue().setIfAbsent(key, value);} catch (Exception e) {log.error(e.getMessage(), e);return false;}}/*** 功能描述: 如果key值,不存在,才进行设置。通过key键存储值,有失效时间,可以是字符串,也可以是Java Bean对象。** @param key           redis的键值* @param value         存储的值信息* @param expireSeconds 失效的时间,单位是秒* @return 返回是否存储成功*/public boolean setIfAbsent(String key, Object value, long expireSeconds) {try {if (expireSeconds > 0) {return redisTemplate.opsForValue().setIfAbsent(key, value, expireSeconds, TimeUnit.SECONDS);} else {return redisTemplate.opsForValue().setIfAbsent(key, value);}} catch (Exception e) {log.error(e.getMessage(), e);return false;}}/*** 功能描述: 如果key值,不存在,才进行设置。通过key键存储值,有失效时间,可以是字符串,也可以是Java Bean对象。** @param key      redis的键值* @param value    存储的值信息* @param time     失效的时间* @param timeUnit 失效的时间单位,有秒,分钟,小时,天。* @return 返回是否存储成功*/public boolean setIfAbsent(String key, Object value, long time, TimeUnit timeUnit) {try {if (time > 0) {return redisTemplate.opsForValue().setIfAbsent(key, value, time, timeUnit);} else {return redisTemplate.opsForValue().setIfAbsent(key, value);}} catch (Exception e) {log.error("发生异常", e);return false;}}/*** 功能描述:批量添加值,map形式** @param maps 要添加的键值对集合*/public void multiSet(Map<String, Object> maps) {redisTemplate.opsForValue().multiSet(maps);}/*** 功能描述: 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在** @param maps 要添加的键值对集合* @return 之前已经存在返回false, 不存在返回true*/public boolean multiSetIfAbsent(Map<String, Object> maps) {return redisTemplate.opsForValue().multiSetIfAbsent(maps);}/******1.2 设置值操作结束******//******1.3 获取值操作开始******//*** 功能描述: 获取指定 key 的值,Object类型, 可以返回字符串,也可以返回 JavaBean 对象。** @param key redis的键值* @return 返回键值所对应的值*/public Object getForObject(String key) {return redisTemplate.opsForValue().get(key);}/*** 功能描述: 获取指定 key 的值,常用于返回 JavaBean 对象。** @param key redis的键值* @return 返回键值所对应的值,JavaBean形式。*/public <V> V get(Object key) {try {return (V) redisTemplate.opsForValue().get(key);} catch (Exception e) {log.error(e.getMessage(), e);return null;}}/*** 功能描述: 将给定 key 的值设为 value ,并返回 key 的旧值(old value)** @param key      redis的键值* @param newValue 设置新值* @return 返回key的旧值*/public Object getAndSet(String key, Object newValue) {return redisTemplate.opsForValue().getAndSet(key, newValue);}/*** 功能描述: 批量获取相应的key的值列表信息** @param keys* @return*/public List<Object> multiGet(Collection<String> keys) {return redisTemplate.opsForValue().multiGet(keys);}/******1.3 获取值操作结束******//******1.4 过期操作开始******//*** 功能描述: 设置key的过期时间,单位是小时** @param key      redis的键值* @param timeHour 过期时间,单位是小时*/public void setExpire(String key, int timeHour) {redisTemplate.expire(key, timeHour, TimeUnit.HOURS);}/*** 功能描述: 设置key的过期时间,单位可以自定义** @param key      redis的键值* @param timeout  过期时间* @param timeUnit 过期时间的基本单位*/public void setExpire(String key, int timeout, TimeUnit timeUnit) {redisTemplate.expire(key, timeout, timeUnit);}/*** 功能描述: 设置key的过期时间,是否设置成功。 单位可以自定义** @param key      redis的键值* @param timeout  过期时间* @param timeUnit 过期时间的基本单位* @return 返回是否设置成功*/public Boolean expire(String key, long timeout, TimeUnit timeUnit) {return redisTemplate.expire(key, timeout, timeUnit);}/*** 功能描述: 设置key值在 date 时间时过期。** @param key  redis的键值* @param date 设置的过期时间* @return 返回是否设置成功*/public Boolean expireAt(String key, Date date) {return redisTemplate.expireAt(key, date);}/*** 功能描述: 返回 key 的剩余的过期时间,单位是秒** @param key redis的键值* @return 返回 key 的剩余的过期时间,单位是秒*/public Long getExpire(String key) {return redisTemplate.getExpire(key);}/*** 功能描述: 返回 key 的剩余的过期时间,单位自定义** @param key      redis的键值* @param timeUnit 日期单位* @return 返回 key 的剩余的过期时间,单位自定义*/public Long getExpire(String key, TimeUnit timeUnit) {return redisTemplate.getExpire(key, timeUnit);}/*** 功能描述: 移除 key 的过期时间,key 将持久保持** @param key redis的键值* @return 返回是否设置成功*/public Boolean persist(String key) {return redisTemplate.persist(key);}/******1.4 过期值操作结束******//******1.5 其他key操作开始******//*** 功能描述: 序列化key** @param key redis的键值* @return 返回序列化好的key值*/public byte[] dump(String key) {return redisTemplate.dump(key);}/*** 功能描述:是否存在key** @param key redis的键值* @return true表示存在该key, false表示不存在该key*/public Boolean hasKey(String key) {return redisTemplate.hasKey(key);}/*** 功能描述: 查找能匹配到的key** @param pattern 匹配的正则式* @return 查找能匹配到的key*/public Set<String> keys(String pattern) {return redisTemplate.keys(pattern);}/*** 功能描述: 查找能匹配到的key** @param keyPattern 匹配的正则式* @return 查找能匹配到的key*/public Set<String> getKeys(String keyPattern) {return redisTemplate.keys(keyPattern);}/*** 功能描述: 将当前数据库的 key 移动到给定的数据库 db 当中** @param key     redis的键值* @param dbIndex 要移动到的数据,默认为0~15* @return*/public Boolean move(String key, int dbIndex) {return redisTemplate.move(key, dbIndex);}/*** 功能描述: 从当前数据库中随机返回一个 key** @return 随机返回一个key*/public String randomKey() {return redisTemplate.randomKey();}/*** 功能描述:修改 key 的名称** @param oldKey 老的键* @param newKey 新的键值*/public void rename(String oldKey, String newKey) {redisTemplate.rename(oldKey, newKey);}/*** 功能描述: 仅当 newkey 不存在时,将 oldKey 改名为 newkey** @param oldKey 老的键* @param newKey 新的键值* @return 返回设置是否成功*/public Boolean renameIfAbsent(String oldKey, String newKey) {return redisTemplate.renameIfAbsent(oldKey, newKey);}/*** 功能描述: 返回 key 所储存的值的类型 为五种数据类型和none** @param key redis的键值* @return 返回当前键值的数据类型*/public DataType type(String key) {return redisTemplate.type(key);}/******1.5 其他key操作结束******//** -------------------string相关操作--------------------- *//*** 功能描述:设置指定 key 的值** @param key   redis的键值* @param value 键值要保存的字符串值*/public void setForStr(String key, String value) {redisTemplate.opsForValue().set(key, value);}/*** 功能描述: 返回指定 key 的值** @param key redis的键值*/public String getForStr(String key) {Object value = redisTemplate.opsForValue().get(key);return null == value ? null : value.toString();}/*** 功能描述:返回 key 中字符串值的子字符** @param key   redis的键值* @param start 开始索引* @param end   结束索引* @return 返回截取字符串的值*/public String getRange(String key, long start, long end) {return redisTemplate.opsForValue().get(key, start, end);}/*** 功能描述: 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始** @param key    redis的键值* @param value  要替换的值* @param offset 从指定位置开始覆写*/public void setRange(String key, String value, long offset) {redisTemplate.opsForValue().set(key, value, offset);}/*** 功能描述:获取字符串的长度** @param key redis的键值* @return 返回字符串的长度*/public Long size(String key) {return redisTemplate.opsForValue().size(key);}/*** 功能描述: 将key对应的数字型字符串值加1** @param key redis的键值 存储的是数字型字符串* @return 返回增加后的新值*/public Long increment(String key) {return redisTemplate.opsForValue().increment(key);}/*** 功能描述: 增加(自增长), 负数则为自减** @param key   redis的键值 存储的是数字型字符串* @param delta 增加的步长* @return 返回增加后的新值*/public Long increment(String key, long delta) {return redisTemplate.opsForValue().increment(key, delta);}/*** 功能描述: 增加(自增长), 负数则为自减,可增加浮点型数** @param key       redis的键值 存储的是数字型字符串* @param increment 增加的步长* @return 返回增加后的新值*/public Double incrementByDouble(String key, double increment) {return redisTemplate.opsForValue().increment(key, increment);}/*** 功能描述: 追加到末尾,字符串添加** @param key   redis的键值* @param value 要追加的值* @return 返回追加后的新值*/public Integer append(String key, String value) {return redisTemplate.opsForValue().append(key, value);}/** -------------------3.hash相关操作------------------------- *//******3.1放置值开始******//*** 功能描述: 往key 里面放置单个值** @param key     redis的键值* @param hashKey 列字段名* @param value   列字段对应的值*/public void hPut(String key, String hashKey, Object value) {redisTemplate.opsForHash().put(key, hashKey, value);}/*** 功能描述: 往key 里面放置多个值** @param key  redis的键值* @param maps 字段键值集合*/public void hPut(String key, Map<String, Object> maps) {redisTemplate.opsForHash().putAll(key, maps);}/*** 功能描述: 添加字段键值对,使用hPut() 方法** @param key    redis的键值* @param hKey   字段名* @param hValue 字段值* @return* @deprecated 暂时不再使用*/@Deprecatedpublic boolean hSet(String key, Object hKey, Object hValue) {try {redisTemplate.opsForHash().put(key, hKey, hValue);return true;} catch (Exception e) {log.error("发生异常", e);return false;}}/*** 功能描述: 批量添加字段键值对,使用hPut() 方法** @param key  redis的键值* @param maps 字段键值对集合* @return* @deprecated 暂时不再使用*/@Deprecatedpublic boolean hSet(String key, Map<String, ?> maps) {try {redisTemplate.opsForHash().putAll(key, maps);return true;} catch (Exception e) {log.error("发生异常", e);return false;}}/*** 功能描述: 仅当hashKey不存在时才设置** @param key     redis的键值* @param hashKey 字段名* @param value   字段名对应的值* @return*/public Boolean hPutIfAbsent(String key, String hashKey, Object value) {return redisTemplate.opsForHash().putIfAbsent(key, hashKey, value);}/*** 功能描述:为哈希表 key 中的指定字段的整数值加上增量 increment** @param key       redis的键值* @param field     字段名* @param increment 步长* @return*/public Long hIncrBy(String key, Object field, long increment) {return redisTemplate.opsForHash().increment(key, field, increment);}/*** 功能描述:为哈希表 key 中的指定字段的整数值加上增量 increment,浮点数** @param key   redis的键值* @param field 字段名* @param delta 步长,可为浮点数* @return*/public Double hIncrByFloat(String key, Object field, double delta) {return redisTemplate.opsForHash().increment(key, field, delta);}/******3.1放置值结束******//******3.2获取值开始******//*** 功能描述: 获取单个键值对** @param key   redis的键值* @param field 字段名* @return*/public Object hGet(String key, String field) {try {return redisTemplate.opsForHash().get(key, field);} catch (Exception e) {log.error("发生异常", e);return null;}}/*** 功能描述: 查询指定列的值** @param key      redis的键值* @param hashKeys 字段名集合* @return*/public List hMulGet(String key, Collection hashKeys) {List<?> list = redisTemplate.opsForHash().multiGet(key, hashKeys);return list.stream().filter(Objects::nonNull).collect(Collectors.toList());}/*** 功能描述: 查询指定列的值** @param key      redis的键值* @param hashKeys 字段名集合* @return*/public List hMulGet(String key, Object[] hashKeys) {if (null == hashKeys || hashKeys.length == 0) {return new ArrayList();}List<Object> keyList = Arrays.asList(hashKeys);List<?> list = redisTemplate.opsForHash().multiGet(key, keyList);return list.stream().filter(Objects::nonNull).collect(Collectors.toList());}/*** 功能描述: 根据大Key获取所有键值对,返回的是一个Object对象,需要强转成Map对象** @param key redis的键值* @return*/public Object hGet(String key) {try {return redisTemplate.opsForHash().entries(key);} catch (Exception e) {log.error("发生异常", e);return null;}}/*** 功能描述: 获取所有给定字段的值** @param key redis的键值* @return 返回当前 key对应的所有字段的键值对集合*/public Map<Object, Object> hGetAll(String key) {return redisTemplate.opsForHash().entries(key);}/*** 功能描述: 获取所有给定字段的值** @param key    redis的键值* @param fields 指定的字段集合* @return 返回当前 key对应的筛选字段里面的键值对集合*/public List<Object> hMultiGet(String key, Collection<Object> fields) {return redisTemplate.opsForHash().multiGet(key, fields);}/*** 功能描述:获取所有哈希表中的字段** @param key redis的键值* @return*/public Set<Object> hKeys(String key) {return redisTemplate.opsForHash().keys(key);}/*** 功能描述: 获取key里面的所有的值,返回map** @param key redis键值* @return*/public Object getHashValues(String key) {return redisTemplate.opsForHash().values(key);}/*** 功能描述: 弹出元素后删除,返回弹出的那个元素** @param key   key* @param field 属性* @param <T>   返回类型* @return*/public <T> T hPop(String key, String field) {Object result = redisTemplate.opsForHash().get(key, field);if (null != result) {hDel(key, field);}return (T) result;}/*** 功能描述: 弹出多个符合条件的元素后删除,返回弹出的那些元素** @param key      key* @param hashKeys 属性值* @return*/public List hMulPop(String key, Collection hashKeys) {List results = hMulGet(key, hashKeys);if (CollectionUtils.isEmpty(results)) {return Collections.emptyList();}redisTemplate.opsForHash().delete(key, hashKeys.toArray());return results;}/*** 功能描述: 获取hash列表中该键的各个属性值** @param key key* @return*/public Set<String> getHashFields(String key) {Object o = redisTemplate.opsForHash().keys(key);return (Set<String>) o;}/******3.2获取值结束******//******3.3 删除操作开始******//*** 功能描述: 移除相应的字段名,返回删除的属性的那个值。** @param key   redis的键值* @param field 字段名* @return 返回该字段名所对应的值*/@SuppressWarnings("unchecked")public Object hDelete(String key, String field) {Object result = redisTemplate.opsForHash().get(key, field);if (null != result) {hDel(key, field);return result;}return null;}/*** 功能描述: 删除key里面所有的字段集合,返回删除的成功数目。** @param key      redis键值* @param hashKeys 字段集合* @return*/public Long deleteHashKeys(String key, Object[] hashKeys) {return redisTemplate.opsForHash().delete(key, hashKeys);}/*** 功能描述: 删除key里面所有的字段集合,返回删除的成功数目。** @param key      redis键值* @param hashKeys 字段集合* @return*/public List deleteHashKeysForList(String key, Object[] hashKeys) {List results = hMulGet(key, hashKeys);if (CollectionUtils.isEmpty(results)) {return Collections.emptyList();}redisTemplate.opsForHash().delete(key, hashKeys);return results;}/*** 功能描述: 移除指定列的值** @param key      redis的键值* @param hashKeys 字段名集合* @return*/public List hDeleteForList(String key, Collection<Object> hashKeys) {List results = hMulGet(key, hashKeys);if (CollectionUtils.isEmpty(results)) {return Collections.emptyList();}redisTemplate.opsForHash().delete(key, hashKeys.toArray());return results;}/*** 功能描述: 删除指定的字段集合,是否全部删除成功。** @param key   redis的键值* @param field 字段集合* @return*/public boolean hDel(String key, Object... field) {try {redisTemplate.opsForHash().delete(key, field);return true;} catch (Exception e) {log.error("发生异常", e);return false;}}/******3.3 删除操作结束******//******3.4其他操作开始******//*** 功能描述:查看哈希表 key 中,指定的字段是否存在** @param key   redis的键值* @param field 字段名* @return 查看哈希表 key 中,指定的字段是否存在*/public boolean hExists(String key, String field) {return redisTemplate.opsForHash().hasKey(key, field);}/*** 功能描述: 根据大Key获取所有键值对,建议使用 hSize() 方法。** @param key redis的键值* @return* @deprecated 暂时不再使用*/@Deprecatedpublic Long hLen(String key) {return redisTemplate.opsForHash().size(key);}/*** 功能描述: 根据大Key获取所有键值对** @param key redis的键值* @return*/public Long hSize(String key) {return redisTemplate.opsForHash().size(key);}/*** 功能描述: key里面是否该有字段** @param key   redis的键值* @param field 字段名* @return*/public boolean hasKey(String key, Object field) {try {return redisTemplate.opsForHash().hasKey(key, field);} catch (Exception e) {log.error("发生异常", e);return false;}}/******3.4其他操作结束******//** ------------------------4.list相关操作---------------------------- *//*******4.1 放置值操作开始******//*** 功能描述: 左放置** @param key   redis键值* @param value 要放置的值* @return*/public boolean leftPush(String key, Object value) {try {redisTemplate.opsForList().leftPush(key, value);return true;} catch (Exception e) {log.error("发生异常", e);return false;}}/*** 功能描述: 左批量放置集合形式** @param key  redis键值* @param list 要放置的值集合* @return*/public boolean leftPushAll(String key, Collection list) {try {redisTemplate.opsForList().leftPushAll(key, list);return true;} catch (Exception e) {log.error("发生异常", e);return false;}}/*** 功能描述: 批量放置值,可变参数形式放置** @param key   redis的键值* @param value 放置的值* @return*/public Long lLeftPushAll(String key, Object... value) {return redisTemplate.opsForList().leftPushAll(key, value);}/*** 功能描述:当list存在的时候才加入** @param key   redis的键值* @param value 放置的值* @return*/public Long lLeftPushIfPresent(String key, Object value) {return redisTemplate.opsForList().leftPushIfPresent(key, value);}/*** 功能描述:如果pivot存在,再pivot前面添加** @param key   redis的键值* @param pivot 检测的值* @param value 要放置的值* @return*/public Long lLeftPush(String key, Object pivot, Object value) {return redisTemplate.opsForList().leftPush(key, pivot, value);}/*** 功能描述: 右放置** @param key   redis键值* @param value 要放置的值* @return*/public boolean rightPush(String key, Object value) {try {redisTemplate.opsForList().rightPush(key, value);return true;} catch (Exception e) {log.error("发生异常", e);return false;}}public boolean rightPushAll(String key, Collection values) {try {redisTemplate.opsForList().rightPushAll(key, values);return true;} catch (Exception e) {log.error(e.getMessage(), e);return false;}}/*** 功能描述: 从右边添加,可变参数形式** @param key   redis的键值* @param value 添加的值* @return*/public Long lRightPushAll(String key, Object... value) {return redisTemplate.opsForList().rightPushAll(key, value);}/*** 功能描述: 为已存在的列表添加值,从右添加** @param key   redis的键值* @param value 添加的值* @return*/public Long lRightPushIfPresent(String key, Object value) {return redisTemplate.opsForList().rightPushIfPresent(key, value);}/*** 功能描述:在pivot元素的右边添加值** @param key   redis的键值* @param pivot 检测的值* @param value 要放置的值* @return*/public Long lRightPush(String key, Object pivot, Object value) {return redisTemplate.opsForList().rightPush(key, pivot, value);}/*** 功能描述: 更新指定索引的元素** @param key   redis中的键* @param index 更新的索引* @param value 新值* @return*/public boolean update(String key, int index, Object value) {try {redisTemplate.opsForList().set(key, index, value);return true;} catch (Exception e) {log.error("redisUtil的update异常:", e);return false;}}/*******4.1 放置值操作结束******//*******4.2 获取值操作开始******//*** 功能描述: 通过索引获取列表中的元素** @param key   redis的键值* @param index 索引位置* @return*/public Object lIndex(String key, long index) {return redisTemplate.opsForList().index(key, index);}/*** 功能描述: 获取列表指定范围内的元素** @param key   redis的键值* @param start 开始位置, 0是开始位置* @param end   结束位置, -1返回所有* @return*/public List<Object> lRange(String key, long start, long end) {return redisTemplate.opsForList().range(key, start, end);}/*** 功能描述: 从左到右全部查询集合中的数据信息** @param key redis键值* @return*/public Object range(String key) {try {List<Object> list = redisTemplate.opsForList().range(key, 0, -1);if (!org.springframework.util.CollectionUtils.isEmpty(list)) {return list;}return Collections.emptyList();} catch (Exception e) {log.error(e.getMessage(), e);return Collections.emptyList();}}/*** 功能描述: 从左边出栈,不删除元素。** @param key redis键值* @return*/public Object leftPop(String key) {try {return redisTemplate.opsForList().leftPop(key, 1, TimeUnit.SECONDS);} catch (Exception e) {log.error("发生异常", e);return null;}}/*** 功能描述: 从右边出栈,不删除元素。** @param key redis键值* @return*/public Object rightPop(String key) {try {return redisTemplate.opsForList().rightPop(key, 1, TimeUnit.SECONDS);} catch (Exception e) {log.error("发生异常", e);return null;}}/*******4.2 获取值操作结束******//*******4.3 删除值操作开始******//*** 功能描述:移出并获取列表的第一个元素** @param key redis的键值* @return 删除的元素*/public Object lLeftPop(String key) {return redisTemplate.opsForList().leftPop(key);}/*** 功能描述: 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止** @param key      redis的键值* @param timeout  等待时间* @param timeUnit 时间单位* @return*/public Object lBLeftPop(String key, long timeout, TimeUnit timeUnit) {return redisTemplate.opsForList().leftPop(key, timeout, timeUnit);}/*** 功能描述:移除并获取列表最后一个元素** @param key redis的键值* @return 删除的元素*/public Object lRightPop(String key) {return redisTemplate.opsForList().rightPop(key);}/*** 功能描述:移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止** @param key      redis的键值* @param timeout  等待时间* @param timeUnit 时间单位* @return*/public Object lBRightPop(String key, long timeout, TimeUnit timeUnit) {return redisTemplate.opsForList().rightPop(key, timeout, timeUnit);}/*** 功能描述:删除集合中值等于value得元素** @param key   redis中的键* @param index index=0, 删除所有值等于value的元素; index>0, 从头部开始删除第一个值等于value的元素;*              index<0, 从尾部开始删除第一个值等于value的元素;* @param value 要删除的值* @return*/public Long lRem(String key, long index, Object value) {return redisTemplate.opsForList().remove(key, index, value);}/*** 功能描述:删除所有等于value 的元素** @param key   redis中的键* @param value 要删除的值* @return*/public long lRem(String key, Object value) {try {return redisTemplate.opsForList().remove(key, 0, value);} catch (Exception e) {log.error("发生异常", e);return 0;}}/*******4.3 删除值操作结束******//*******4.5 其他操作开始******//*** 功能描述:移除列表的最后一个元素,并将该元素添加到另一个列表并返回** @param sourceKey      源集合* @param destinationKey 目标集合* @return*/public Object lRightPopAndLeftPush(String sourceKey, String destinationKey) {return redisTemplate.opsForList().rightPopAndLeftPush(sourceKey,destinationKey);}/*** 功能描述:从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它;* 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止** @param sourceKey      源集合* @param destinationKey 目标集合* @param timeout        超时时间* @param timeUnit       时间单位* @return*/public Object lBRightPopAndLeftPush(String sourceKey, String destinationKey,long timeout, TimeUnit timeUnit) {return redisTemplate.opsForList().rightPopAndLeftPush(sourceKey,destinationKey, timeout, timeUnit);}/*** 功能描述:裁剪list** @param key   redis中的键* @param start 开始的索引位置* @param end   结束的索引位置*/public void lTrim(String key, long start, long end) {redisTemplate.opsForList().trim(key, start, end);}/*** 功能描述: 获取列表长度,建议使用 lSize 方法。** @param key redis的键* @return* @deprecated 暂时不再使用*/@Deprecatedpublic Long lLen(String key) {return redisTemplate.opsForList().size(key);}/*** 功能描述: 获取列表长度** @param key redis的键* @return*/public Long lSize(String key) {return redisTemplate.opsForList().size(key);}/*******4.5 其他操作结束******//** --------------------5.set相关操作-------------------------- *//*******5.1 添加放置操作开始******//*** 功能描述: 批量往Set 里面添加元素,可变 参数形式** @param key    redis键值* @param values 要放置的值* @return*/public boolean sAdd(String key, Object... values) {try {redisTemplate.opsForSet().add(key, values);return true;} catch (Exception e) {log.error("发生异常", e);return false;}}/*** 功能描述: 单个往Set 里面添加元素** @param key   redis键值* @param value 要放置的值* @return*/public boolean sAdd(String key, Object value) {try {redisTemplate.opsForSet().add(key, value);return true;} catch (Exception e) {log.error("发生异常", e);return false;}}/*******5.1 添加放置操作结束******//*******5.2 查询操作开始******//*** 功能描述:返回里面的所有元素信息** @param key redis键值* @return*/public Object sMembers(String key) {try {return redisTemplate.opsForSet().members(key);} catch (Exception e) {log.error("发生异常", e);return null;}}/*** 功能描述:获取key里面的所有的元素** @param key redis的键值*/public Set<Object> setMembers(String key) {return redisTemplate.opsForSet().members(key);}/*** 功能描述:随机获取集合中的一个元素** @param key redis的键值* @return*/public Object sRandomMember(String key) {return redisTemplate.opsForSet().randomMember(key);}/*** 功能描述: 随机获取集合中count个元素,可能有重复的。** @param key   redis的键值* @param count 数目* @return*/public List<Object> sRandomMembers(String key, long count) {return redisTemplate.opsForSet().randomMembers(key, count);}/*** 功能描述:随机获取集合中count个元素并且去除重复的,没有重复的。** @param key   redis的键* @param count 去重后的数目* @return*/public Set<Object> sDistinctRandomMembers(String key, long count) {return redisTemplate.opsForSet().distinctRandomMembers(key, count);}/*******5.2 查询操作结束******//*******5.3 删除操作开始******//*** 功能描述: 移除集合里面的单个元素** @param key   redis键值* @param value 要移除的单位元素的值* @return*/public long sRem(String key, String value) {try {return redisTemplate.opsForSet().remove(key, value);} catch (Exception e) {log.error("发生异常", e);return 0;}}/*** 功能描述: 批量移除集合里面的元素,是否全部移除成功。** @param key     redis键值* @param members 要移除的元素的值* @return*/public boolean sRem(String key, Object... members) {try {redisTemplate.opsForSet().remove(key, members);return true;} catch (Exception e) {log.error("发生异常", e);return false;}}/*** 功能描述:set移除元素** @param key    redis键值* @param values 要移除的元素* @return*/public Long sRemMore(String key, Object... values) {return redisTemplate.opsForSet().remove(key, values);}/*******5.3 删除操作结束******//*******5.4 交并差补操作开始******//*** 功能描述:获取两个集合的交集** @param key      第一个主集合* @param otherKey 第二个集合* @return*/public Set<Object> sIntersect(String key, String otherKey) {return redisTemplate.opsForSet().intersect(key, otherKey);}/*** 功能描述:key集合与otherKey集合的交集存储到destKey集合中** @param key      第一个主集合* @param otherKey 第二个集合* @param destKey  将结果放置到目标集合里面* @return*/public Long sIntersectAndStore(String key, String otherKey, String destKey) {return redisTemplate.opsForSet().intersectAndStore(key, otherKey,destKey);}/*** 功能描述:获取两个集合的并集** @param key       第一个主集合* @param otherKeys 第二个集合* @return*/public Set<Object> sUnion(String key, String otherKeys) {return redisTemplate.opsForSet().union(key, otherKeys);}/*** 功能描述:key集合与otherKey集合的并集存储到destKey中** @param key      第一个主集合* @param otherKey 第二个集合* @param destKey  将结果放置到目标集合里面* @return*/public Long sUnionAndStore(String key, String otherKey, String destKey) {return redisTemplate.opsForSet().unionAndStore(key, otherKey, destKey);}/*** 功能描述:获取两个集合的差集** @param key      第一个主集合* @param otherKey 第二个主集合* @return*/public Set<Object> sDifference(String key, String otherKey) {return redisTemplate.opsForSet().difference(key, otherKey);}/*** 功能描述: key集合与otherKey集合的差集存储到destKey中** @param key      第一个主集合* @param otherKey 其他集合* @param destKey  将结果放置到目标集合里面* @return*/public Long sDifference(String key, String otherKey, String destKey) {return redisTemplate.opsForSet().differenceAndStore(key, otherKey,destKey);}/*******5.4 交并差补操作结束******//*******5.5 其他操作开始******//*** 功能描述:是否是集合里面的元素** @param key   redis键值* @param value 要检测的对象* @return*/public boolean isMembers(String key, Object value) {return redisTemplate.opsForSet().isMember(key, value);}/*** 功能描述:返回集合里面的元素数目,推荐使用 sSize方法** @param key redis键值* @return* @deprecated 暂时不再使用*/@Deprecatedpublic Long setSize(String key) {return redisTemplate.opsForSet().size(key);}/*** 功能描述:返回集合里面的元素数目** @param key redis键值* @return*/public Long sSize(String key) {return redisTemplate.opsForSet().size(key);}/*** 功能描述:将元素value从一个集合移到另一个集合** @param key     源集合的key* @param value   要移除的值* @param destKey 目标集合的key* @return*/public Boolean sMove(String key, String value, String destKey) {return redisTemplate.opsForSet().move(key, value, destKey);}/*******5.5 其他操作结束******//**------------------6.zSet相关操作--------------------------------*//*******6.1 添加放置操作开始******//*** 功能描述:添加元素,有序集合是按照元素的score值由小到大排列** @param key   redis的键* @param value 放置的值* @param score 成绩* @return*/public Boolean zAdd(String key, Object value, double score) {return redisTemplate.opsForZSet().add(key, value, score);}/*** 功能描述:增加元素的score值,并返回增加后的值** @param key   redis的键* @param value 放置的值* @param delta 增加成绩* @return*/public Double zIncrementScore(String key, String value, double delta) {return redisTemplate.opsForZSet().incrementScore(key, value, delta);}/*******6.1 添加放置操作结束******//*******6.2 查询操作开始******//*** 功能描述:返回该元素在集合的排名,有序集合是按照元素的score值由小到大排列. 最小的成绩是0** @param key   redis的键* @param value 元素* @return 0表示第一位*/public Long zRank(String key, Object value) {return redisTemplate.opsForZSet().rank(key, value);}/*** 功能描述:返回元素在集合的排名,按元素的score值由大到小排列。 最大的成绩是0** @param key   redis的键* @param value 要检测的元素* @return*/public Long zReverseRank(String key, Object value) {return redisTemplate.opsForZSet().reverseRank(key, value);}/*** 功能描述:获取集合的元素, 从小到大排序** @param key   redis的键* @param start 开始位置* @param end   结束位置, -1查询所有* @return*/public Set<Object> zRange(String key, long start, long end) {return redisTemplate.opsForZSet().range(key, start, end);}/*** 功能描述:获取集合的元素, 从大到小排序** @param key   redis的键* @param start 开始* @param end   结束* @return*/public Set<Object> zReverseRange(String key, long start, long end) {return redisTemplate.opsForZSet().reverseRange(key, start, end);}/*** 功能描述: 获取集合元素, 并且把score值也获取** @param key   redis的键* @param start 开始位置* @param end   结束位置, -1查询所有* @return*/public Set<ZSetOperations.TypedTuple<Object>> zRangeWithScores(String key, long start,long end) {return redisTemplate.opsForZSet().rangeWithScores(key, start, end);}/*** 功能描述: 根据Score值查询集合元素,从小到大排序。不带成绩** @param key redis的键* @param min 成绩最小值* @param max 成绩最大值* @return*/public Set<Object> zRangeByScore(String key, double min, double max) {return redisTemplate.opsForZSet().rangeByScore(key, min, max);}/*** 功能描述:根据Score值查询集合元素, 从小到大排序,带成绩。** @param key redis的键* @param min 最小值* @param max 最大值* @return*/public Set<ZSetOperations.TypedTuple<Object>> zRangeByScoreWithScores(String key,double min, double max) {return redisTemplate.opsForZSet().rangeByScoreWithScores(key, min, max);}/*** 功能描述:根据Score值查询集合元素, 范围性查询,从小到大排序** @param key   redis的键* @param min   成绩最小值* @param max   成绩最大值* @param start 位置开始* @param end   位置结束,-1表示查询全部。* @return*/public Set<ZSetOperations.TypedTuple<Object>> zRangeByScoreWithScores(String key,double min, double max, long start, long end) {return redisTemplate.opsForZSet().rangeByScoreWithScores(key, min, max,start, end);}/*** 功能描述:获取集合的元素, 从大到小排序, 并返回score值** @param key   redis的键* @param start 开始* @param end   结束* @return*/public Set<ZSetOperations.TypedTuple<Object>> zReverseRangeWithScores(String key,long start, long end) {return redisTemplate.opsForZSet().reverseRangeWithScores(key, start,end);}/*** 功能描述:根据Score值查询集合元素, 从大到小排序,没有成绩。** @param key redis的键* @param min 最小成绩* @param max 最大成绩* @return*/public Set<Object> zReverseRangeByScore(String key, double min,double max) {return redisTemplate.opsForZSet().reverseRangeByScore(key, min, max);}/*** 功能描述:根据Score值查询集合元素, 从大到小排序** @param key redis的键* @param min 最小成绩* @param max 最大成绩* @return*/public Set<ZSetOperations.TypedTuple<Object>> zReverseRangeByScoreWithScores(String key, double min, double max) {return redisTemplate.opsForZSet().reverseRangeByScoreWithScores(key,min, max);}/*** 功能描述:根据Score值查询集合元素, 从大到小排序,范围性排序** @param key   redis的键* @param min   最小成绩* @param max   最大成绩* @param start 位置开始* @param end   位置结束,-1表示查询全部。* @return*/public Set<Object> zReverseRangeByScore(String key, double min,double max, long start, long end) {return redisTemplate.opsForZSet().reverseRangeByScore(key, min, max,start, end);}/*** 功能描述:获取集合中value元素的score值** @param key   redis的键* @param value 值* @return*/public Double zScore(String key, Object value) {return redisTemplate.opsForZSet().score(key, value);}/*******6.2 查询操作结束******//*******6.3 删除操作开始******//*** 功能描述: 移除集合里面的元素** @param key    redis的键* @param values 移除 的元素集合* @return*/public Long zRemove(String key, Object... values) {return redisTemplate.opsForZSet().remove(key, values);}/*** 功能描述: 移除指定索引位置的成员** @param key   redis的键* @param start 位置开始* @param end   位置结束,-1表示查询全部。* @return*/public Long zRemoveRange(String key, long start, long end) {return redisTemplate.opsForZSet().removeRange(key, start, end);}/*** 功能描述: 根据指定的score值的范围来移除成员** @param key redis的键* @param min 最小成绩* @param max 最大成绩* @return*/public Long zRemoveRangeByScore(String key, double min, double max) {return redisTemplate.opsForZSet().removeRangeByScore(key, min, max);}/*******6.3 删除操作结束******//*******6.4 交并差补操作开始******//*** 功能描述:获取key和otherKey的并集并存储在destKey中** @param key      第一个主集合* @param otherKey 第二个的集合* @param destKey  目标集合* @return*/public Long zUnionAndStore(String key, String otherKey, String destKey) {return redisTemplate.opsForZSet().unionAndStore(key, otherKey, destKey);}/*** 功能描述: 获取key和其他的并集,并存储在destKey中** @param key       第一个主集合* @param otherKeys 其他的集合* @param destKey   目标集合* @return*/public Long zUnionAndStore(String key, Collection<String> otherKeys,String destKey) {return redisTemplate.opsForZSet().unionAndStore(key, otherKeys, destKey);}/*** 功能描述:获取key和otherKey的交集并存储在destKey中** @param key      第一个主集合* @param otherKey 第二个的集合* @param destKey  目标集合* @return*/public Long zIntersectAndStore(String key, String otherKey,String destKey) {return redisTemplate.opsForZSet().intersectAndStore(key, otherKey,destKey);}/*** 功能描述: 获取key和其他的交集,并存储在destKey中** @param key       第一个主集合* @param otherKeys 其他的集合* @param destKey   目标集合* @return*/public Long zIntersectAndStore(String key, Collection<String> otherKeys,String destKey) {return redisTemplate.opsForZSet().intersectAndStore(key, otherKeys,destKey);}/*******6.4 交并差补操作结束******//*******6.5 其他操作开始******//*** 功能描述:统计score值范围内集合元素数量** @param key redis的键* @param min 最小成绩* @param max 最大成绩* @return*/public Long zCount(String key, double min, double max) {return redisTemplate.opsForZSet().count(key, min, max);}/*** 功能描述: 获取集合的元素数量** @param key redis的键* @return*/public Long zZCard(String key) {return redisTemplate.opsForZSet().zCard(key);}/*******6.5 其他操作结束******/
}

接下来,我们做一个 Redis操作的一个具体的实例。

三. 整合Redis的业务应用

添加的时候,放置到缓存里面, 删除的时候,清空缓存,更新的时候,会更新缓存信息。

查询的时候,从缓存里面查询,包括单个id查询和 全部查询。

三.一 POJO 实体类

在 springboot 数据库里面,有一个 user 表。

只有有简单的属性信息

User.java

@Data
public class User implements Serializable {/*** @param id id编号* @param name 姓名* @param sex 性别* @param age 年龄* @param description 描述*/private Integer id;private String name;private String sex;private Integer age;private String description;
}

三.二 UserMapper 接口和配置

UserMapper.java

public interface UserMapper {void addUser(@Param("user") User user);void updateUser(@Param("user") User user);void deleteById(@Param("id") int id);User findById(@Param("id") int id);List<User> findAll();}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="top.yueshushu.learn.mapper.UserMapper"><insert id="addUser" useGeneratedKeys="true" keyProperty="user.id">insert into user(name,sex,age,description) values(#{user.name},#{user.sex},#{user.age},#{user.description})</insert><update id="updateUser">update user set name=#{user.name,jdbcType=VARCHAR} where id=#{user.id}</update><delete id="deleteById">delete from user where id=#{id}</delete><select id="findById" resultType="top.yueshushu.learn.pojo.User">select * from user where id=#{id}</select><select id="findAll" resultType="top.yueshushu.learn.pojo.User">select * from user</select>
</mapper>

三.三 UserService接口和其实现类

UserService.java

public interface UserService {void addUser(User user);void updateUser(User user);void deleteUser(int id);User findById(int id);List<User> findAll();
}

UserServiceImpl.java

@Service
@Log4j2
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Autowiredprivate RedisUtil redisUtil;private static final String KEY_PRE="user_";@Overridepublic void addUser(User user) {userMapper.addUser(user);log.info("将用户编号为{}放置到缓存里面",user.getId());//放置单个缓存redisUtil.set(KEY_PRE+user.getId(),user);//更新全部的缓存信息resetAllCache();}@Overridepublic void updateUser(User user) {userMapper.updateUser(user);log.info("将用户编号为{}更新到缓存里面",user.getId());//设置新的缓存redisUtil.set(KEY_PRE+user.getId(),user);//更新全部的缓存信息resetAllCache();}@Overridepublic void deleteUser(int id) {userMapper.deleteById(id);log.info("将用户编号为{}从缓存中移除",id);redisUtil.delByKey(KEY_PRE+id);//更新全部的缓存信息resetAllCache();}@Overridepublic User findById(int id) {log.info("先从缓存中查询用户编号为{} 是否存在",id);User user=redisUtil.get(KEY_PRE+id);if(user!=null){log.info(">>>>>>>>>>使用的是缓存中的数据");return user;}log.info(">>>>>>>>>>>从数据库中查询,并放置到缓存中");user= userMapper.findById(id);redisUtil.set(KEY_PRE+id,user);return user;}@Overridepublic List<User> findAll() {log.info("先从缓存中查询用户列表是否存在");List<User> userList= (List<User>) redisUtil.range(KEY_PRE+"ALL");if(!CollectionUtils.isEmpty(userList)){log.info(">>>>>>>>>>使用的是缓存中的数据");return userList;}log.info(">>>>>>>>>>>从数据库中查询,并放置到缓存中");userList= userMapper.findAll();redisUtil.leftPushAll(KEY_PRE+"ALL",userList);return userList;}//重新全部的缓存信息private void resetAllCache() {//先删除redisUtil.delByKey(KEY_PRE+"ALL");//再重新赋值值List<User> userList= userMapper.findAll();redisUtil.leftPushAll(KEY_PRE+"ALL",userList);}
}

添加,修改,删除的时候,都会更新一下缓存的信息。

三.四 缓存测试验证 RedisDBTests

package top.yueshushu.learn;import lombok.extern.log4j.Log4j2;
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.test.context.junit4.SpringJUnit4ClassRunner;
import top.yueshushu.learn.pojo.User;
import top.yueshushu.learn.service.UserService;import java.util.List;/*** @ClassName:RedisDBTests* @Description RedisDBTests 测试使用* @Author yjl* @Date 2021/5/18 17:50* @Version 1.0**/
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
@Log4j2
public class RedisDBTests {@Autowiredprivate UserService userService;@Testpublic void insertTest(){//1. 构建对象User user=new User();user.setName("欢欢");user.setAge(22);user.setSex("女");user.setDescription("一个非常可爱的女孩纸");//2. 添加方法userService.addUser(user);log.info("添加成功,{}",user);findAllTest();}@Testpublic void updateTest(){User user=userService.findById(43);  //id随时更换user.setName("我换新的名字了");userService.updateUser(user);log.info("修改成功{}",user);findAllTest();}@Testpublic void deleteTest(){userService.deleteUser(43); //id随时更换log.info("删除成功了");findAllTest();}@Testpublic void findByIdTest(){User user=userService.findById(43); //id随时更换log.info(user);}@Testpublic void findAllTest(){log.info(">>>>>>>>目前数据库中存在的用户信息:");List<User> userList=userService.findAll();userList.forEach(n->log.info(n));}
}

目前数据库中有的信息:

三.四.一 查询全部进行测试 findAllTest

第一次查询

缓存里面没有,从数据库里面

在客户端进行观察

第二次查询

使用的是缓存里面的数据信息。

三.四.二 添加测试 insertTest

三.四.三 查询Id和修改测试

目前是 43 还存在,直接查询Id findByIdTest

进行修改 updateTest

修改成功后,再进行查询 findByIdTest

三.四.四 删除进行测试 deleteTest

Redis 使用缓存的操作成功。

本章节的代码放置在 github 上:

https://github.com/yuejianli/springboot/tree/develop/SpringBoot_Redis

谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

SpringBoot整合Redis(十九)相关推荐

  1. springboot篇】二十二. springboot整合Redis集群

    springboot整合Redis集群 **中国加油,武汉加油!** 案例准备 1. 新建Springboot项目springboot-redis-sentinel 2. 编写yml 3. Test ...

  2. SpringBoot系列十:SpringBoot整合Redis

    From: https://www.cnblogs.com/leeSmall/p/8728231.html 声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:Sprin ...

  3. 【七】springboot整合redis(超详细)

    springboot篇章整体栏目: [一]springboot整合swagger(超详细 [二]springboot整合swagger(自定义)(超详细) [三]springboot整合token(超 ...

  4. springboot整合redis实现分布式锁思想

    思路 所有响应获取锁的线程都先尝试往redis中创建一个缓存数据,所有线程的key必须相同.使用的是redis的setnx命令.就只有一个线程能够创建成功,创建成功的线程就成功获取锁. 没有获取锁的线 ...

  5. 【SpringBoot】35、SpringBoot整合Redis监听Key过期事件

    在实际的开发项目中,监听 key 的过期事件,应用非常广泛,例如:订单超时未支付,优惠券过期等等 一.说明 本篇文章是继: [SpringBoot]三十四.SpringBoot整合Redis实现序列化 ...

  6. SpringBoot第九篇: springboot整合Redis

    这篇文章主要介绍springboot整合redis,至于没有接触过redis的同学可以看下这篇文章:5分钟带你入门Redis. 引入依赖: 在pom文件中添加redis依赖: <dependen ...

  7. Springboot整合redis(lettuce)

    springboot 整合redis(lettuce) 首先确保电脑上装了redis.最好能用redisDesktop查看一下数据情况 redis是一款非常流行的Nosql数据库.redis的功能非常 ...

  8. 【Java进阶】SpringBoot整合Redis

    SpringBoot整合Redis SpringBoot 操作数据:spring-data jpa jdbc mongodb redis SpringData 也是和 SpringBoot 齐名的项目 ...

  9. SpringBoot整合Redis要注意的那些

    前言 昨天自己在重新学习SpringBoot整合Redis时,遇到了一个问题java.lang.NoClassDefFoundError: org/apache/commons/pool2/impl/ ...

  10. SpringBoot(六):SpringBoot整合Redis

    From: https://blog.csdn.net/plei_yue/article/details/79362372 前言 在本篇文章中将SpringBoot整合Redis,使用的是RedisT ...

最新文章

  1. Java 必须掌握的 12 种 Spring 常用注解!
  2. 零基础自学python看什么书-零基础想要学习Python编程 ,不知道看哪本书?
  3. C++文件头,命名空间,new和delete,内联函数,引用,函数重载,构造函数和析构函数,深拷贝和浅拷贝,explict,this指针
  4. html的!DOCTYPE标签初窥
  5. Exception in thread main java.lang.NoSuchMethodError
  6. HDOJ 2046 骨牌铺方格 【递推】
  7. 谷歌开源的 GAN 库--TFGAN
  8. androidsettitle方法_Android 去掉title bar的3个方法
  9. 如何尽量规避XSS(跨站点脚本)攻击
  10. 报表参数控件和报表内容自动居中设置方法
  11. java怎样才算高级_怎样才算是一名java高手?
  12. Oracel 格式化日期 to_char()
  13. Atitit.月度计划日程表 每月流程表v5
  14. Abaqus帮助文档翻译(一)快速介绍有限元
  15. 网易有道笔试题(2014届,2013.10北邮站)
  16. 深度学习----HOI人物交互算法:ICAN
  17. AdaBoost 人脸检测介绍(5) : AdaBoost算法的误差界限
  18. python docx 设置字体大小_python docx字体设置
  19. WebSphere 安装部署,发布web应用
  20. 2017年终总结——恍恍惚惚又一年

热门文章

  1. 新一代大数据技术架构
  2. 详解光纤光缆、网线、电缆的区别
  3. NPS - 数字化营销 - 净推荐值
  4. 八爪鱼爬虫采集天猫商品数据教程
  5. assert:python断言报错语句
  6. 全自动微信淘宝客推广赚钱方式大揭秘
  7. 三角函数和复指数函数的转化_【导数压轴】当三角函数遇到导数02
  8. <机器学习 房价预测 >对贝壳租房网 信息爬取 及处理。
  9. 万用表怎么测量电池容量_万用表怎么测量12v电瓶(用万用表测电瓶电量怎么测?)...
  10. table实现radio单选效果