前期文章中关于RedisOperateUtil工具类使用时需要强制类型转换,针对List等操作不方便,为此特意更新RedisOperateUtil工具类,前文链接:https://blog.csdn.net/liwenyang1992/article/details/111771097?spm=1001.2014.3001.5501

通过Docker搭建Redis环境并启动,命令如下:

#docker启动redis服务
docker run -itd --name redis -p 6379:6379 redis
#使用redis-cli连接redis
docker exec -it redis redis-cli

application.properties配置如下:

server.port=8080
server.servlet.context-path=/redis############################################################
# REDIS 配置
############################################################
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
spring.redis.lettuce.pool.max-active=18
spring.redis.lettuce.pool.max-wait=-1
spring.redis.lettuce.pool.max-idle=10
spring.redis.lettuce.pool.min-idle=2
spring.redis.lettuce.shutdown-timeout=100ms
spring.redis.timeout=100
spring.cache.cache-names=myCache
#是否启用连接池,如果依赖中有common-pools2依赖自动会启用
spring.redis.lettuce.pool.enabled=true

pom.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.2</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.lwy.it</groupId><artifactId>spring-redis</artifactId><version>0.0.1-SNAPSHOT</version><name>spring-redis</name><description>Demo project for Spring Boot Redis</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- RedisTemplate底层使用commons-pool2来作为连接池--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build>
</project>

由于SpringBoot 2.0版本之后spring-boot-starter-data-redis的底层默认使用了Lettuce来操作redis,早期的版本使用的是Jedis,使用Lettuce获取连接都是通过LettuceConnectionFactory这个工厂类来获取的,默认情况下Lettuce使用的是一个线程安全的共享的本地连接来操作Redis,如果你不希望使用本地连接可以设置shareNativeConnection这个参数为false。备注:RedisTemplate底层使用commons-pool2来作为连接池。

备注:默认情况下RedisTemplate是不使用连接池的,并且性能还是不错的。

RedisConfiguration配置如下:

package com.lwy.it.configuration;import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.interceptor.CacheErrorHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;/*** 使用Jackson2JsonRedisSerializer序列化和反序列化*/
@Configuration
public class RedisConfiguration extends CachingConfigurerSupport {@Bean("redisTemplate")public RedisTemplate redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {RedisTemplate redisTemplate = new RedisTemplate();// 启用连接共享lettuceConnectionFactory.setShareNativeConnection(true);// 配置连接工厂redisTemplate.setConnectionFactory(lettuceConnectionFactory);// 使用Jackson2JsonRedisSerializer来序列化和反序列化Redis的value值Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper objectMapper = new ObjectMapper();// 指定药序列化的域,field,get和set,以及修饰符范围// ANY任何级别的字段都可以自动识别objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);// 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会抛出异常objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);// value采用Json序列化redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);// 使用StringRedisSerializer来序列化和反序列化Redis的keyredisTemplate.setKeySerializer(new StringRedisSerializer());// 使用StringRedisSerializer来序列化和反序列化Redis的Hash keyredisTemplate.setHashKeySerializer(new StringRedisSerializer());// Hash value采用Json序列化redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);return redisTemplate;}@Overridepublic CacheErrorHandler errorHandler() {return new RedisCacheErrorHandler();}}

核心Redis操作工具类RedisOperateUtil如下,主要包括Redis键(Key)、字符串(String)、哈希(Hash)、列表(List)、集合(Set)等常用的操作。

package com.lwy.it.util;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.QueryTimeoutException;
import org.springframework.data.redis.RedisConnectionFailureException;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.SetOperations;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.TimeUnit;@Component
public final class RedisOperateUtil {private static Logger LOGGER = LoggerFactory.getLogger(RedisOperateUtil.class);// 默认最长时效时间(秒)private static long EXPIRED_TIME = 604800L;private void setDefaultExpiredTime(final String key) {Long ttl = this.ttl(key, TimeUnit.SECONDS);if (!Objects.isNull(ttl) && ttl.equals(-1L)) {this.expire(key, EXPIRED_TIME, TimeUnit.SECONDS);}}@Autowiredprivate RedisOperations redisTemplate;/*** DEL key** @param key Redis Key* @return 是否删除成功*/public Boolean del(final String key) {Boolean result = null;try {result = redisTemplate.delete(key);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** DEL key key** @param keys Redis Keys* @return 删除的数量*/public Long del(final Set<String> keys) {Long result = null;try {result = redisTemplate.delete(keys);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** EXISTS key** @param key Redis Key* @return 是否存在key*/public Boolean exists(final String key) {Boolean result = null;try {result = redisTemplate.hasKey(key);} catch (RedisConnectionFailureException exception) {LOGGER.error(exception.getMessage(), exception);} catch (QueryTimeoutException exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** EXISTS key1 key2** @param keys Redis Keys* @return 指定为参数的键中存在的键数,多次提及和存在的键被多次计算。*/public Long exists(final Set<String> keys) {Long result = null;try {result = redisTemplate.countExistingKeys(keys);} catch (RedisConnectionFailureException exception) {LOGGER.error(exception.getMessage(), exception);} catch (QueryTimeoutException exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** EXPIRE key seconds** @param key     Redis Key* @param timeout 超时时间* @param unit    时间粒度单位* @return 在管道/事务中使用时为 null*/public Boolean expire(final String key, final long timeout, TimeUnit unit) {Boolean result = null;try {result = redisTemplate.expire(key, timeout, unit);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** TTL key** @param key      Redis Key* @param timeUnit 时间粒度单位* @return 按照给定时间粒度单位,返回过期时间,时间粒度单位为空时默认为秒*/public Long ttl(final String key, TimeUnit timeUnit) {if (Objects.isNull(timeUnit)) {timeUnit = TimeUnit.SECONDS;}Long result = null;try {result = redisTemplate.getExpire(key, timeUnit);} catch (RedisConnectionFailureException exception) {LOGGER.error(exception.getMessage(), exception);} catch (QueryTimeoutException exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** TTL key** @param key Redis Key* @return 按照给定时间粒度单位,返回过期时间,时间粒度单位为空时默认为秒*/public Long ttl(final String key) {return this.ttl(key, TimeUnit.SECONDS);}/*** SET key value** @param key   Redis Key* @param value 存储的value* @param <V>   value泛型类型*/public <V> void set(final String key, final V value) {this.setex(key, value, EXPIRED_TIME, TimeUnit.SECONDS);}/*** GET key** @param key Redis Key* @param <V> value泛型类型* @return 返回存储的value*/public <V> V get(final String key) {ValueOperations<String, V> operations = redisTemplate.opsForValue();V result = null;try {result = operations.get(key);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** GETSET key value** @param key   Redis Key* @param value 存储的value* @param <V>   value泛型类型* @return 指定key的值,并返回key的旧值*/public <V> V getset(final String key, final V value) {ValueOperations<String, V> operations = redisTemplate.opsForValue();V result = null;try {result = operations.getAndSet(key, value);this.setDefaultExpiredTime(key);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** MSET key value [key value ...]* 缺少过期时间,不建议使用** @param map 不能为空* @param <V> value泛型类型*/@Deprecatedpublic <V> void mset(final Map<String, V> map) {if (!CollectionUtils.isEmpty(map)) {ValueOperations<String, V> operations = redisTemplate.opsForValue();try {operations.multiSet(map);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}} else {LOGGER.warn("Parameters map is null or empty");}}/*** MGET key [key ...]* 建议使用LinkedHashSet** @param keys 不重复Redis Key集合,不能为空* @param <V>  value泛型类型* @return 结果List集合*/public <V> List<V> mget(final Set<String> keys) {List<V> result = Collections.emptyList();if (!CollectionUtils.isEmpty(keys)) {ValueOperations<String, V> operations = redisTemplate.opsForValue();try {result = operations.multiGet(keys);} catch (RedisConnectionFailureException exception) {LOGGER.error(exception.getMessage(), exception);} catch (QueryTimeoutException exception) {LOGGER.error(exception.getMessage(), exception);}}return result;}/*** SETEX key seconds value** @param key     Redis Key* @param value   Redis Value* @param timeout 超时时间* @param unit    单位* @param <V>     value泛型类型*/public <V> void setex(final String key, final V value, final long timeout, TimeUnit unit) {if (Objects.isNull(unit)) {unit = TimeUnit.SECONDS;}ValueOperations<String, V> operations = redisTemplate.opsForValue();try {operations.set(key, value, timeout, unit);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}}/*** SETNX key value** @param key     Redis Key* @param value   Redis Value* @param timeout 超时时间* @param unit    单位* @param <V>     value泛型类型* @return 设置成功,返回true。设置失败,返回false。*/public <V> Boolean setnx(final String key, final V value, final long timeout, TimeUnit unit) {if (Objects.isNull(unit)) {unit = TimeUnit.SECONDS;}ValueOperations<String, V> operations = redisTemplate.opsForValue();Boolean result = null;try {result = operations.setIfAbsent(key, value, timeout, unit);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** INCR key* 如果key不存在,那么key的值会先被初始化为0,然后再执行INCR操作。* 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。** @param key Redis Key* @return 加上1之后,key的值。*/public Long incr(final String key) {return this.incrby(key, 1L);}/*** INCRBY key increment** @param key   Redis Key* @param delta 指定的增量值* @return 加上指定的增量值之后,key的值。*/public Long incrby(final String key, final long delta) {Long result = null;ValueOperations<String, Long> operations = redisTemplate.opsForValue();try {result = operations.increment(key, delta);this.setDefaultExpiredTime(key);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** DECRBY key** @param key Redis Key* @return 减去1之后,key的值。*/public Long decr(final String key) {return this.decrby(key, 1L);}/*** Redis Decrby命令将key所储存的值减去指定的减量值。* 如果key不存在,那么key的值会先被初始化为0,然后再执行DECRBY操作。* 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。** @param key   Redis Key* @param delta 指定减量值* @return 减去指定减量值之后,key的值。*/public Long decrby(final String key, final long delta) {ValueOperations<String, Long> operations = redisTemplate.opsForValue();Long result = null;try {result = operations.decrement(key, delta);this.setDefaultExpiredTime(key);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** HDEL key field [field ...]** @param key      Redis Key* @param hashKeys Hash Keys* @return 被成功删除字段的数量,不包括被忽略的字段。*/public Long hdel(final String key, final String... hashKeys) {Long result = null;try {result = redisTemplate.opsForHash().delete(key, hashKeys);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** HEXISTS key field** @param key     Redis Key* @param hashKey Hash Key* @return 如果哈希表含有给定字段,返回teue。如果哈希表不含有给定字段,或key不存在,返回false。*/public Boolean hexists(final String key, final String hashKey) {Boolean result = null;try {result = redisTemplate.opsForHash().hasKey(key, hashKey);} catch (RedisConnectionFailureException exception) {LOGGER.error(exception.getMessage(), exception);} catch (QueryTimeoutException exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** HGET key field** @param key     Redis Key* @param hashKey Hash Key* @param <V>     value泛型类型* @return 返回给定字段的值。如果给定的字段或key不存在时,返回null。*/public <V> V hget(final String key, final String hashKey) {HashOperations<String, String, V> operations = redisTemplate.opsForHash();V result = null;try {result = operations.get(key, hashKey);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** HGETALL key** @param key Redis Key* @param <V> value泛型类型* @return 以列表形式返回哈希表的字段及字段值。若key不存在,返回空列表。*/public <V> Map<String, V> hgetall(final String key) {HashOperations<String, String, V> operations = redisTemplate.opsForHash();Map<String, V> result = null;try {result = operations.entries(key);} catch (RedisConnectionFailureException exception) {LOGGER.error(exception.getMessage(), exception);} catch (QueryTimeoutException exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** HKEYS key** @param key Redis Key* @return 包含哈希表中所有域(field)列表。当key不存在时,返回一个空列表。*/public Set<String> hkeys(final String key) {Set<String> result = null;try {result = redisTemplate.opsForHash().keys(key);} catch (RedisConnectionFailureException exception) {LOGGER.error(exception.getMessage(), exception);} catch (QueryTimeoutException exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** HLEN key** @param key Redis Key* @return 获取哈希表中字段的数量*/public Long hlen(final String key) {Long result = null;try {result = redisTemplate.opsForHash().size(key);} catch (RedisConnectionFailureException exception) {LOGGER.error(exception.getMessage(), exception);} catch (QueryTimeoutException exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** HMGET key field [field ...]* 建议使用LinkedHashSet** @param key      Redis Key* @param hashKeys Hash Key* @param <V>      value泛型类型* @return 一个包含多个给定字段关联值的表,表值的排列顺序和指定字段的请求顺序一样。*/public <V> List<V> hmget(final String key, final Set<String> hashKeys) {HashOperations<String, String, V> operations = redisTemplate.opsForHash();List<V> result = null;try {result = operations.multiGet(key, hashKeys);} catch (RedisConnectionFailureException exception) {LOGGER.error(exception.getMessage(), exception);} catch (QueryTimeoutException exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** HSET key field value** @param key     Redis Key* @param hashKey Hash Key* @param value   存储的值* @param <V>     value泛型类型*/public <V> void hset(final String key, final String hashKey, final V value) {try {redisTemplate.opsForHash().put(key, hashKey, value);this.setDefaultExpiredTime(key);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}}/*** HMSET key field value [field value ...]** @param key Redis Key* @param map Redis Key Value* @param <V> value泛型类型*/public <V> void hmset(final String key, final Map<String, V> map) {if (!CollectionUtils.isEmpty(map)) {try {redisTemplate.opsForHash().putAll(key, map);this.setDefaultExpiredTime(key);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}}}/*** HSETNX key field value* 只有在字段 field 不存在时,设置哈希表字段的值。** @param key     Redis Key* @param hashKey Hash Key* @param value   存储的值* @param <V>     value泛型类型* @return 设置成功,返回true。如果给定字段已经存在且没有操作被执行,返回false。*/public <V> Boolean hsetnx(final String key, final String hashKey, final V value) {Boolean result = null;try {result = redisTemplate.opsForHash().putIfAbsent(key, hashKey, value);this.setDefaultExpiredTime(key);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** HVALS key** @param key Redis Key* @param <V> value泛型类型* @return 一个包含哈希表中所有值的列表。当key不存在时,返回一个空表。*/public <V> List<V> hvals(String key) {List<V> result = null;try {result = redisTemplate.opsForHash().values(key);} catch (RedisConnectionFailureException exception) {LOGGER.error(exception.getMessage(), exception);} catch (QueryTimeoutException exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** BLPOP key timeout** @param key     Redis Key* @param timeout 超时时间* @param unit    单位* @param <V>     value泛型类型* @return 被弹出元素的值*/public <V> V blpop(final String key, final long timeout, TimeUnit unit) {if (Objects.isNull(unit)) {unit = TimeUnit.SECONDS;}ListOperations<String, V> operations = redisTemplate.opsForList();V result = null;try {result = operations.leftPop(key, timeout, unit);} catch (RedisConnectionFailureException exception) {LOGGER.error(exception.getMessage(), exception);} catch (QueryTimeoutException exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** BRPOP key timeout** @param key     Redis Key* @param timeout 超时时间* @param unit    单位* @param <V>     value泛型类型* @return 被弹出元素的值*/public <V> V brpop(final String key, final long timeout, TimeUnit unit) {if (Objects.isNull(unit)) {unit = TimeUnit.SECONDS;}ListOperations<String, V> operations = redisTemplate.opsForList();V result = null;try {result = operations.rightPop(key, timeout, unit);} catch (RedisConnectionFailureException exception) {LOGGER.error(exception.getMessage(), exception);} catch (QueryTimeoutException exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** LINDEX key index** @param key   Redis Key* @param index 索引* @param <V>   value泛型类型* @return 通过索引获取列表中的元素*/public <V> V lindex(final String key, final long index) {ListOperations<String, V> operations = redisTemplate.opsForList();V result = null;try {result = operations.index(key, index);} catch (RedisConnectionFailureException exception) {LOGGER.error(exception.getMessage(), exception);} catch (QueryTimeoutException exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** LLEN key** @param key Redis Key* @return 列表长度*/public Long llen(final String key) {Long result = null;try {result = redisTemplate.opsForList().size(key);} catch (RedisConnectionFailureException exception) {LOGGER.error(exception.getMessage(), exception);} catch (QueryTimeoutException exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** LPOP key** @param key Redis Key* @param <V> value泛型类型* @return 移出并获取列表的第一个元素*/public <V> V lpop(final String key) {ListOperations<String, V> operations = redisTemplate.opsForList();V result = null;try {result = operations.leftPop(key);} catch (RedisConnectionFailureException exception) {LOGGER.error(exception.getMessage(), exception);} catch (QueryTimeoutException exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** LPUSH key value** @param key   Redis Key* @param value 存储的值* @param <V>   value泛型类型* @return 执行LPUSH命令后,列表的长度*/public <V> Long lpush(final String key, final V value) {ListOperations<String, V> operations = redisTemplate.opsForList();Long result = null;try {result = operations.leftPush(key, value);this.setDefaultExpiredTime(key);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** LPUSH key value [value ...]** @param key    Redis Key* @param values 存储的列表值* @param <V>    value泛型类型* @return 执行LPUSH命令后,列表的长度*/public <V> Long lpush(final String key, final Collection<V> values) {ListOperations<String, V> operations = redisTemplate.opsForList();Long result = null;try {result = operations.leftPushAll(key, values);this.setDefaultExpiredTime(key);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** LRANGE key start stop** @param key   Redis Key* @param start 开始索引* @param end   结束索引* @param <V>   value泛型类型* @return 列表指定范围内的元素*/public <V> List<V> lrange(final String key, final long start, final long end) {ListOperations<String, V> operations = redisTemplate.opsForList();List<V> result = null;try {result = operations.range(key, start, end);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** LSET key index value** @param key   Redis Key* @param index 索引* @param value 存储的值* @param <V>   value泛型类型*/public <V> void lset(final String key, final long index, final V value) {ListOperations<String, V> operations = redisTemplate.opsForList();try {operations.set(key, index, value);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}}/*** RPOP key** @param key Redis Key* @param <V> value泛型类型* @return 被移除的元素*/public <V> V rpop(final String key) {ListOperations<String, V> operations = redisTemplate.opsForList();V result = null;try {result = operations.rightPop(key);} catch (RedisConnectionFailureException exception) {LOGGER.error(exception.getMessage(), exception);} catch (QueryTimeoutException exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** RPUSH key value** @param key   Redis Key* @param value 存储的值* @param <V>   value泛型类型* @return 执行RPUSH操作后,列表的长度*/public <V> Long rpush(final String key, final V value) {ListOperations<String, V> operations = redisTemplate.opsForList();Long result = null;try {result = operations.rightPush(key, value);this.setDefaultExpiredTime(key);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** RPUSH key value [value ...]** @param key    Redis Key* @param values 存储的列表值* @param <V>    value泛型类型* @return 执行RPUSH操作后,列表的长度*/public <V> Long rpush(final String key, Collection<V> values) {ListOperations<String, V> operations = redisTemplate.opsForList();Long result = null;try {result = operations.rightPushAll(key, values);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** SADD key member [member ...]** @param key    Redis Key* @param values 存储的列表值* @param <V>    value泛型类型* @return 被添加到集合中的新元素的数量,不包括被忽略的元素。*/public <V> Long sadd(final String key, final V... values) {SetOperations<String, V> operations = redisTemplate.opsForSet();Long result = null;try {result = operations.add(key, values);this.setDefaultExpiredTime(key);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** SCARD key** @param key Redis Key* @param <V> value泛型类型* @return 集合的数量。当集合key不存在时,返回0。*/public <V> Long scard(final String key) {Long result = null;try {result = redisTemplate.opsForSet().size(key);} catch (RedisConnectionFailureException exception) {LOGGER.error(exception.getMessage(), exception);} catch (QueryTimeoutException exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** SISMEMBER key member** @param key    Redis Key* @param object 成员元素* @return 如果成员元素是集合的成员,返回true。如果成员元素不是集合的成员,或key不存在,返回false。*/public Boolean sismember(final String key, final Object object) {Boolean result = null;try {result = redisTemplate.opsForSet().isMember(key, object);} catch (RedisConnectionFailureException exception) {LOGGER.error(exception.getMessage(), exception);} catch (QueryTimeoutException exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** SMEMBERS key** @param key Redis Key* @param <V> value泛型类型* @return 集合中的所有成员。*/public <V> Set<V> smembers(final String key) {SetOperations<String, V> operations = redisTemplate.opsForSet();Set<V> result = null;try {result = operations.members(key);} catch (RedisConnectionFailureException exception) {LOGGER.error(exception.getMessage(), exception);} catch (QueryTimeoutException exception) {LOGGER.error(exception.getMessage(), exception);}return result;}/*** SREM key member [member ...]** @param key    Redis Key* @param values 删除的值* @return 被成功移除的元素的数量,不包括被忽略的元素。*/public Long srem(final String key, final Object... values) {Long result = null;try {result = redisTemplate.opsForSet().remove(key, values);} catch (Exception exception) {LOGGER.error(exception.getMessage(), exception);}return result;}
}

Redis操作工具类相关推荐

  1. redis-4.0.10集群安装(3台机器,6个node),以及在Spring项目中的集成,redis操作工具类

    1 Redis安装 redis高可用的三种常见的集群方式:redis sentinel .redis cluster(多主机+分布式).redis sharding.接下来主要介绍redis sent ...

  2. IT忍者神龟之Redis操作工具类封装

    Redis操作字符串工具类封装,Redis工具类封装 Java代码   package com.lqy.spring.redis; import redis.clients.jedis.Jedis; ...

  3. 基于jedis的Redis工具类

    本文来记录下基于 jedis 的 Redis 工具类 文章目录 核心代码 核心代码 以下为核心代码 /*** 基于jedis的redis操作工具类* @author www* @time 2021/8 ...

  4. SpringBoot Redis工具类封装

    SpringBoot整合Redis的博客很多,但是很多都不是我想要的结果.因为我只需要整合完成后,可以操作Redis就可以了,并不需要配合缓存相关的注解使用(如@Cacheable).看了很多博客后, ...

  5. Redis工具类封装RedisUtils(两种)

    RedisTemplate工具类1 本文参考:https://blog.it-follower.com/posts/2563248908.html SpringBoot项目集成Redis相当简单,只需 ...

  6. 分享一个超全的基于jedis的redis工具类

    以下为部分代码,完整的代码和redis应用实例,请移步到码云. 码云地址:  spring-boot-redis-case: 基于redisUtils的各种redis应用实例 ps:try-final ...

  7. 字符串工具类、数组工具类、集合工具类、转型操作工具类、编码与解码操作工具类...

    package hjp.smart4j.framework.util;import org.apache.commons.lang3.StringUtils;/*** 字符串工具类*/ public ...

  8. XML文档操作工具类

    1 /// <summary> 2 /// XML文档操作工具类 3 /// </summary> 4 public class XmlUtil 5 { 6 #region X ...

  9. Redis工具类的封装

    Redis工具类的封装 <dependency><groupId>redis.clients</groupId><artifactId>jedis< ...

最新文章

  1. 如何构建 SaaS 网站的高转化?
  2. music算法_“要热爱 请深爱”系列(5)浅谈模拟退火算法
  3. java用途与python_python与java用途区别有哪些
  4. C# 淘宝商品微信返利助手开发-(六)返利助手开发(4)如何通过淘口令解析的出来的地址获得返利信息
  5. 细菌基因组基本概念(一)
  6. 6-3cifar10数据集介绍-读取-处理
  7. Spring4.x()-Spring的Jdbc事务-注解
  8. Spring : Spring 切面优先级
  9. Linux之df命令
  10. 这么说吧,NIO很简单,其实就是个牛逼IO
  11. WEB自动化(Python+selenium)的API
  12. 后端系统开发之技术方案写作
  13. 目前国内最热门的四款远程桌面控制软件
  14. 网上商城系统源码 B2C电子商务系统源码
  15. 什么是 Widevine 数字版权管理 (DRM),它为什么重要
  16. Ds918 ds3615 ds3617区别_都2019年了,还问GET和POST的区别【深度好文】
  17. e4a浏览框本地HTML,E4A浏览器
  18. Linux基础知识详解
  19. Docker 4.2:Docker 公有镜像仓库 - 阿里云容器镜像服务
  20. Sniffer报文放送

热门文章

  1. 那些优雅的数据结构(1) : BloomFilter——大规模数据处理利器
  2. 深度学习目标检测:YOLOv5实现车辆检测(含车辆检测数据集+训练代码)
  3. CHECKMARX安全漏洞检测防止XSS(Cross Site Scripting)跨站脚本攻击
  4. Redis并发问题(雪崩、击穿、穿透)
  5. 使用Betaflight Configurator飞控刷写固件时各步骤的含义
  6. 怎么样在迅捷CAD编辑器的图中输入文字
  7. 谷歌浏览器书签栏书签丢失问题
  8. 实锤!长沙智博美术培训学校
  9. 易语言超级列表框怎么设置文本颜色_条码打印软件如何设置条码和数字之间的间距...
  10. 什么是消防设施操作员,就业前景如何