前期文章中关于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的key redisTemplate.setKeySerializer(new StringRedisSerializer()); // 使用StringRedisSerializer来序列化和反序列化Redis的Hash key redisTemplate.setHashKeySerializer(new StringRedisSerializer()); // Hash value采用Json序列化 redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); return redisTemplate; } @Override public 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); } } @Autowired private 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泛型类型 */ @Deprecated public <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; } }