1.springboot2.2.2整合redis教程很多,为此编写了比较完整的redis工具类,符合企业级开发使用的工具类

2.springboot与redis maven相关的依赖

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
<!--redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

3.application.yml中加入redis相关的配置

server:
port: 8080
servlet:
context-path: /project/v101
session:
timeout: 3600s
tomcat:
uri-encoding: utf-8 spring:
# 对象属性值,为 null,则不显示属性名
jackson:
default-property-inclusion: non_null
datasource:
name: demo
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=GMT%2B8
# driver-class-name: com.mysql.jdbc.Driver
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
druid:
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 30000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 自定义属性,用于druid监控界面的账号、密码配置
servlet:
username: root
password: root
http:
log-request-details: true servlet:
multipart:
max-file-size: 20MB
max-request-size: 30MB
file-size-threshold: 0
enabled: true
 # redis配置
redis:
host: localhost
port: 6379
password: 123456
database: 0 mybatis-plus:
global-config:
db-config:
logic-delete-value: 1 # 逻辑已删除值(默认为 0)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 1)
mapper-locations: classpath:mapper/**/*Mapper.xml
# config-location: classpath:mybatis-config.xml
# MyBaits 别名包扫描路径,通过该属性可以给包中的类注册别名
type-aliases-package: com.houtang.saas.pms.domain.entity
configuration:
# 开启驼峰匹配
map-underscore-to-camel-case: true
# 这个配置使全局的映射器启用或禁用缓存。系统默认值是true
cache-enabled: true
# 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。系统默认值是true
lazy-loading-enabled: true
# 允许或不允许多种结果集从一个单独的语句中返回(需要适合的驱动)。系统默认值是true
multiple-result-sets-enabled: true
# 使用列标签代替列名。不同的驱动在这方便表现不同。参考驱动文档或充分测试两种方法来决定所使用的驱动
use-column-label: true
# 允许 JDBC 支持生成的键。需要适合的驱动。如果设置为 true 则这个设置强制生成的键被使用,尽管一些驱动拒绝兼容但仍然有效(比如Derby)
use-generated-keys: false
# 配置默认的执行器。SIMPLE 执行器没有什么特别之处。REUSE 执行器重用预处理语句。BATCH 执行器重用语句和批量更新
default-executor-type: simple
# 设置超时时间,它决定驱动等待一个数据库响应的时间
default-statement-timeout: 25000 pagehelper:
helper-dialect: mysql
reasonable: true
support-methods-arguments: true
params: count=countSql

4.编写自定义redis配置类(由于springboot 整合的redisTemplate<Object,Object> 只能操作Object对象,通过源码可以看出,SpringBoot自动帮我们在容器中生成了一个RedisTemplate和一个StringRedisTemplate,使用时需要写很多类型转换代码,用起来不切实际需求)

/**
* redis配置类
*
* @author : ywb
* @createdDate : 2019/12/31
* @updatedDate
*/
@Configuration
public class RedisConfig { /**
* 自定义 redisTemplate<String, Object>
*
* @param redisConnectionFactory
* @return
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory); ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
// 不转换值为 null 的对象
// om.setSerializationInclusion(JsonInclude.Include.NON_NULL); Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
jackson2JsonRedisSerializer.setObjectMapper(om); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); // key 采用 string 的序列化方式
template.setKeySerializer(stringRedisSerializer);
// value 采用 jackson 的序列化方式
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash 的 key 采用 string 的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// hash 的 value 采用 jackson 的序列化方式
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}

5.拦截器使用实例(拦截请求时,获取redis中的token信息,对redis中指定键对应的数据设置失效时间)

/**
* 请求拦截器
* @author : ywb
* @createdDate : 2019/12/31
* @updatedDate
*/
@Component
public class RequestInterceptor implements HandlerInterceptor { private static Log LOGGER = LogFactory.getLog(RequestInterceptor.class); @Autowired
private RedisUtils redisUtils; /**
* 请求之前执行
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取token
String token = request.getHeader("token");
DataCheck.isTrue(StringUtils.isBlank(token), ResultMessage.NO_TOKEN.getMsg());
// String timestamp = request.getHeader("timestamp");
// //获取生成的随机数
// String random = request.getHeader("random");
// //获取加密后的签名信息
// String sign = request.getHeader("sign");
// //组合token+timestamp+random
//// String pwd = token.concat(timestamp).concat(random);
// //SHA-256哈希加密算法
// String pwd = token;
// MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
// byte[] hash = messageDigest.digest(pwd.getBytes("UTF-8"));
// //通过SHA-256哈希加密算法生成签名信息
// String newSign = Hex.encodeHexString(hash);
//查询redis存储的用户信息
String redisUser = Constant.REDIS_USERID.replace("@uuid", token);
if (!StringUtils.isBlank(redisUser) && redisUtils.exists(redisUser)) {
//更新登录有效时间(续命)
redisUtils.expire(redisUser, Constant.REDIS_USERID_TIMEOUT);
return true;
} else {
throw new DataValidationException(ResultMessage.REQUEST_ERROR.getMsg());
}
} /**
* 请求之后生成视图之前执行
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } /**
* 最后执行,一般用于释放资源
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }
}

6.编写比较完整的redis工具类RedisUtils

/**
* Redis工具类<br>
* <b>使用方法:</b>直接在类中使用@Autowired方法注入即可
* @author : ywb
* @createdDate : 2019/12/31
* @updatedDate
*/
@Slf4j
@Component
public final class RedisUtils { /**
* 从 spring 容器中注入自定义的 redisTemplate
*/
@Autowired
private RedisTemplate<String, Object> redisTemplate; /**
* 对 redis 中指定键对应的数据设置失效时间
*
* @param key 键
* @param time 时间(秒),time要大于0
* @return
*/
public boolean expire(String key, long time) {
boolean result = false; try {
if (StringUtils.isNotBlank(key) && time > 0) {
result = this.redisTemplate.expire(key, time, TimeUnit.SECONDS);
}
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
} return result;
} /**
* 从 redis 中根据指定的 key 获取已设置的过期时间
*
* @param key 键,不能为null
* @return 时间(秒),返回0代表为永久有效
*/
public long getExpire(String key) {
long time = 0L; try {
if (StringUtils.isNotBlank(key)) {
time = this.redisTemplate.getExpire(key, TimeUnit.SECONDS);
}
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
}
return time;
} /**
* 判断 redis 中是否存在指定的 key
*
* @param key 键,不能为null
* @return true表示存在,false表示不存在
*/
public boolean exists(String key) {
boolean result = false; try {
if (StringUtils.isNotBlank(key)) {
result = this.redisTemplate.hasKey(key);
}
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
}
return result;
} /**
* 从 redis 中移除指定 key 对应的数据
*
* @param keys 可以传一个值或多个
*/
@SuppressWarnings("unchecked")
public long remove(String... keys) {
long count = 0L; if (keys != null && keys.length > 0) {
if (keys.length == 1) {
boolean result = this.redisTemplate.delete(keys[0]); if (result) {
count = keys.length;
}
} else {
count = this.redisTemplate.delete(CollectionUtils.arrayToList(keys));
}
}
return count;
} // ============================ String =============================
/**
* 从 redis 中获取指定 key 对应的 string 数据
*
* @param key 键,不能为null
* @return key 对应的字符串数据
*/
public <T> T get(String key) {
T t = null; try {
if (StringUtils.isNotBlank(key)) {
t = (T) this.redisTemplate.opsForValue().get(key);
}
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
}
return t;
} /**
* 从 redis 中获取指定 key 对应的 string 数据,并转换为 T 类型
*
* @param key 键,不能为null
* @param clazz 类型,从 redis 获取后的对象直接转换为 T 类型
* @return key 对应的数据
*/
public <T> T get(String key, Class<T> clazz) {
T t = null; try {
if (StringUtils.isNotBlank(key)) {
String str = (String) this.redisTemplate.opsForValue().get(key); t = this.stringToBean(str, clazz);
}
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return null;
} return t;
} /**
* 判断 redis 中指定 key 的数据对应偏移位置的 bit 位是否为 1
*
* @param key 键,不能为null
* @param offset 偏移位置
* @return true表示存在,false表示不存在
*/
public boolean getBit(String key, long offset) {
boolean result = false; try {
if (StringUtils.isNotBlank(key)) {
result = this.redisTemplate.opsForValue().getBit(key, offset);
}
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
} return result;
} /**
* 将指定的 key, value 放到 redis 中
*
* @param key 键,不能为null
* @param value 值,不能为null
* @return true表示成功,false表示失败
*/
public <T> boolean set(String key, T value) {
boolean result = false; try {
if (StringUtils.isNotBlank(key)) {
this.redisTemplate.opsForValue().set(key, value); result = true;
}
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
} return result;
} /**
* 将指定的 key, value 放到 redis 中,并设置过期时间
*
* @param key 键,不能为null
* @param value 值,不能为null
* @param time 时间(秒),time要大于0,如果time小于等于0,将设置无限期
* @return true表示成功,false表示失败
*/
public <T> boolean set(String key, T value, long time) {
try {
if (time > 0) {
this.redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);
} else {
this.set(key, value);
}
return true;
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return false;
}
} /**
* 将 redis 中指定 key 对应数据的偏移位置的 bit 位设置为 0/1
*
* @param key 键,不能为null
* @param offset 偏移位置
* @param flag true表示设置为1,false表示设置为0
* @return true表示成功,false表示失败
*/
public boolean setBit(String key, long offset, boolean flag) {
boolean result = false; try {
if (StringUtils.isNotBlank(key)) {
this.redisTemplate.opsForValue().setBit(key, offset, flag); result = true;
}
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
} return result;
} /**
* 对 redis 中指定 key 的数据递增,并返回递增后的值
*
* @param key 键,不能为null
* @param delta 要增加几(大于0)
* @return
*/
public long incr(String key, long delta) {
if (delta < 0) {
throw new RuntimeException("递增因子必须大于0。");
} return this.redisTemplate.opsForValue().increment(key, delta);
} /**
* 对 redis 中指定 key 的数据递减,并返回递减后的值
*
* @param key 键,不能为null
* @param delta 要减少几(大于0)
* @return
*/
public long decr(String key, long delta) {
if (delta < 0) {
throw new RuntimeException("递减因子必须大于0。");
} return this.redisTemplate.opsForValue().decrement(key, delta);
} // ================================ hashmap================================= /**
* 判断 redis 中指定 key 对应的 hash 表中是否有 hashKey
*
* @param key 键,不能为null
* @param hashKey hash表中的键,不能为null
* @return true表示存在,false表示不存在
*/
public boolean hexists(String key, String hashKey) {
return this.redisTemplate.opsForHash().hasKey(key, hashKey);
} /**
* 从 redis 中获取指定 key 对应的 hash 表中的指定 hashKey 所对应的值
*
* @param key 键,不能为null
* @param hashKey hash表中的键,不能为null
* @return 值
*/
@SuppressWarnings("unchecked")
public <T> T hget(String key, String hashKey) {
return (T) this.redisTemplate.opsForHash().get(key, hashKey);
} /**
* 向 redis 中指定 key 对应的 hash 表(如果 hash 表不存在则自动创建)中放入 hashKey,value 数据
*
* @param key 键,不能为null
* @param hashKey hash表中的键,不能为null
* @param value 值,不能为null
* @return true表示成功,false表示失败
*/
public <T> boolean hset(String key, String hashKey, T value) {
try {
this.redisTemplate.opsForHash().put(key, hashKey, value);
return true;
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return false;
}
} /**
* 向 redis 中指定 key 对应的 hash 表(如果 hash 表不存在则自动创建)中放入 hashKey,value 数据,并设置过期时间
*
* @param key 键,不能为null
* @param hashKey hash表中的键,不能为null
* @param value 值,不能为null
* @param time 过期时间(秒),注意:如果已存在的hash表有时间,这里将会替换原有的时间
* @return true表示成功,false表示失败
*/
public <T> boolean hset(String key, String hashKey, T value, long time) {
try {
this.redisTemplate.opsForHash().put(key, hashKey, value);
if (time > 0) {
this.expire(key, time);
}
return true;
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return false;
}
} /**
* 删除 redis 中指定 key 对应的 hash 表中等于 hashKeys 的数据
*
* @param key 键,不能为null
* @param hashKeys hash表中的键,可以使多个,不能为null
*/
public <T> void hdel(String key, T... hashKeys) {
this.redisTemplate.opsForHash().delete(key, hashKeys);
} /**
* 从 redis 中获取指定 key 对应的 hash 表,并返回相应的 map 对象
*
* @param key 键,不能为null
* @return map对象,包含所有的键值对
*/
public Map<?, ?> hmget(String key) {
return this.redisTemplate.opsForHash().entries(key);
} /**
* 向 redis 中放入指定 key,并设置对应的数据类型为 map
*
* @param key 键,不能为null
* @param map 多个键值对应的map,不能为null
* @return true表示成功,false表示失败
*/
public boolean hmset(String key, Map<String, ?> map) {
try {
this.redisTemplate.opsForHash().putAll(key, map);
return true;
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return false;
}
} /**
* 向 redis 中放入指定 key,并设置对应的数据类型为 map 以及过期时间
*
* @param key 键,不能为null
* @param map 对应多个键值,不能为null
* @param time 时间(秒),time要大于0,如果time小于等于0,将设置无限期
* @return true表示成功,false表示失败
*/
public boolean hmset(String key, Map<String, ?> map, long time) {
try {
this.redisTemplate.opsForHash().putAll(key, map);
if (time > 0) {
this.expire(key, time);
}
return true;
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return false;
}
} /**
* 对 redis 中指定 key 对应的 hash 表(如果 hash 表不存在则自动创建)递增,并返回新增后的值
*
* @param key 键,不能为null
* @param item 项,不能为null
* @param delta 要增加几(大于0)
* @return 新增后的值
*/
public double hincr(String key, String item, double delta) {
if (delta < 0) {
throw new RuntimeException("递增因子必须大于0。");
} return this.redisTemplate.opsForHash().increment(key, item, delta);
} /**
* 对 redis 中指定 key 对应的 hash 表(如果 hash 表不存在则自动创建)递增,并返回新增后的值
*
* @param key 键,不能为null
* @param item 项,不能为null
* @param delta 要减少几(大于0)
* @return
*/
public double hdecr(String key, String item, double delta) {
if (delta < 0) {
throw new RuntimeException("递增因子必须大于0。");
} return this.redisTemplate.opsForHash().increment(key, item, -delta);
} /**
* 从 redis 中移除指定 key 对应 hash 表中键为 values 的数据
*
* @param key 键,不能为null
* @param values 值,不能为null
* @return 移除的个数
*/
public <T> long hremove(String key, T... values) {
try {
Long count = this.redisTemplate.opsForHash().delete(key, values);
return count;
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return 0;
}
} // ============================set============================= /**
* 判断 redis 中是否存在指定 key 对应的 set 对象
*
* @param key 键,不能为null
* @param value 值,不能为null
* @return true表示存在,false表示不存在
*/
public <T> boolean sexists(String key, T value) {
try {
return this.redisTemplate.opsForSet().isMember(key, value);
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return false;
}
} /**
* 从 redis 中根据指定 key 对应的值,并返回 set 对象
*
* @param key 键,不能为null
* @return
*/
public Set<?> sget(String key) {
try {
return this.redisTemplate.opsForSet().members(key);
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return null;
}
} /**
* 向 redis 中放入指定 key 和数据,并设置其数据类型为 set
*
* @param key 键,不能为null
* @param values 值,不能为null
* @return 成功个数
*/
public <T> long sset(String key, T... values) {
try {
return this.redisTemplate.opsForSet().add(key, values);
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return 0;
}
} /**
* 向 redis 中放入指定 key 和数据,并设置其数据类型为 set 以及过期时间
*
* @param key 键,不能为null
* @param time 过期时间(秒),注意:如果已存在的hash表有时间,这里将会替换原有的时间
* @param values 值,不能为null
* @return 成功个数
*/
public <T> long sset(String key, long time, T... values) {
try {
Long count = this.redisTemplate.opsForSet().add(key, values);
if (time > 0) {
expire(key, time);
}
return count;
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return 0;
}
} /**
* 获取 redis 中指定 key 对应 set 的大小
*
* @param key 键,不能为null
* @return
*/
public long ssize(String key) {
try {
return this.redisTemplate.opsForSet().size(key);
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return 0;
}
} /**
* 从 redis 中移除指定 key 对应 set 中键为 values 的数据
*
* @param key 键,不能为null
* @param values 值,不能为null
* @return 移除的个数
*/
public <T> long sremove(String key, T... values) {
try {
Long count = this.redisTemplate.opsForSet().remove(key, values);
return count;
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return 0;
}
} // =============================== list ================================= /**
* 从 redis 中获取指定 key 对应 list 的大小
*
* @param key 键,不能为null
* @return
*/
public long lsize(String key) {
try {
return this.redisTemplate.opsForList().size(key);
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return 0;
}
} /**
* 从 redis 中获取指定 key 对应 list 中 index 位置的值
*
* @param key 键,不能为null
* @param index 当index>=0时,0为表头,1为第二个元素,依次类推;当index<0时,-1为表尾,-2为倒数第二个元素,依次类推
* @return
*/
@SuppressWarnings("unchecked")
public <T> T lindex(String key, long index) {
try {
return (T) this.redisTemplate.opsForList().index(key, index);
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return null;
}
} /**
* 从 redis 中获取指定 key 对应 list 指定范围的值(start~end设置为0~-1将返回所有值)
*
* @param key 键,不能为null
* @param start 起始位置,0表示起始位置
* @param end 结束位置,-1表示结束位置
* @return
*/
public List<?> lget(String key, long start, long end) {
try {
return this.redisTemplate.opsForList().range(key, start, end);
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return null;
}
} /**
* 向 redis 中放入指定 key,并设置数组类型为 list,将 value 加入到 list 尾部
*
* @param key 键,不能为null
* @param value 值,不能为null
* @return
*/
public <T> boolean lset(String key, T value) {
try {
this.redisTemplate.opsForList().rightPush(key, value);
return true;
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return false;
}
} /**
* 向 redis 中放入指定 key,并设置数组类型为 list,将 value 加入到 list 尾部,同时设置过期时间
*
* @param key 键,不能为null
* @param value 值,不能为null
* @param time 时间(秒),time要大于0,如果time小于等于0,将设置无限期
* @return
*/
public <T> boolean lset(String key, T value, long time) {
try {
this.redisTemplate.opsForList().rightPush(key, value);
if (time > 0) {
this.expire(key, time);
}
return true;
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return false;
}
} /**
* 向 redis 中放入指定 key,并设置数组类型为 list,并以 value 填入 list
*
* @param key 键,不能为null
* @param value 值,不能为null
* @return
*/
public boolean lset(String key, List value) {
try {
this.redisTemplate.opsForList().rightPushAll(key, value);
return true;
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return false;
}
} /**
* 向 redis 中放入指定 key,并设置数组类型为 list,并以 value 填入 list,同时设置过期时间
*
* @param key 键,不能为null
* @param value 值,不能为null
* @param time 时间(秒),time要大于0,如果time小于等于0,将设置无限期
* @return
*/
public boolean lset(String key, List value, long time) {
try {
this.redisTemplate.opsForList().rightPushAll(key, value);
if (time > 0) {
this.expire(key, time);
}
return true;
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return false;
}
} /**
* 将 redis 中指定 key 对应的 list 数据中指定 index 位置的数据更新为 value
*
* @param key 键,不能为null
* @param index 索引
* @param value 值,不能为null
* @return
*/
public <T> boolean lupdate(String key, long index, T value) {
try {
this.redisTemplate.opsForList().set(key, index, value);
return true;
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return false;
}
} /**
* 从 redis 中指定 key 对应的 list 中移除 n 个值为 value 的数据
*
* @param key 键,不能为null
* @param count 移除多少个
* @param value 值,不能为null
* @return 移除的个数
*/
public <T> long lremove(String key, long count, T value) {
try {
Long remove = this.redisTemplate.opsForList().remove(key, count, value);
return remove;
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
return 0;
}
} /**
* 根据指定的类型转换字符串/JSON字符串为相应的对象
*
* @param value 字符串/JSON字符串
* @param clazz 类型
* @param <T> 任意类型
* @return
*/
@SuppressWarnings("unchecked")
public <T> T stringToBean(String value, Class<T> clazz) {
if (value == null || value.length() <= 0 || clazz == null) {
return null;
} if (clazz == byte.class || clazz == Byte.class) {
return (T) Byte.valueOf(value);
} else if (clazz == int.class || clazz == Integer.class) {
return (T) Integer.valueOf(value);
} else if (clazz == long.class || clazz == Long.class) {
return (T) Long.valueOf(value);
} else if (clazz == double.class || clazz == Double.class) {
return (T) Double.valueOf(value);
} else if (clazz == float.class || clazz == Float.class) {
return (T) Float.valueOf(value);
} else if (clazz == String.class) {
return (T) value;
} else {
return JSONUtil.toBean(value, clazz);
}
} /**
* 将 bean 转换为字符串/JSON字符串
*
* @param value 任意类型对象
* @return 字符串/JSON字符串
*/
public <T> String beanToString(T value) {
if (value == null) {
return null;
} Class<?> clazz = value.getClass();
if (clazz == byte.class || clazz == Byte.class) {
return "" + value;
} else if (clazz == int.class || clazz == Integer.class) {
return "" + value;
} else if (clazz == long.class || clazz == Long.class) {
return "" + value;
} else if (clazz == double.class || clazz == Double.class) {
return "" + value;
} else if (clazz == float.class || clazz == Float.class) {
return "" + value;
} else if (clazz == String.class) {
return (String) value;
} else {
return JSONUtil.toJsonStr(value);
}
}

springboot2.2.2企业级项目整合redis与redis 工具类大全的更多相关文章

  1. SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后端篇(五): 数据表设计、使用 jwt、redis、sms 工具类完善注册登录逻辑

    (1) 相关博文地址: SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 前端篇(一):搭建基本环境:https://www.cnblogs.com/l-y-h/p ...

  2. Redis操作Set工具类封装,Java Redis Set命令封装

    Redis操作Set工具类封装,Java Redis Set命令封装 >>>>>>>>>>>>>>>>& ...

  3. Redis操作List工具类封装,Java Redis List命令封装

    Redis操作List工具类封装,Java Redis List命令封装 >>>>>>>>>>>>>>>> ...

  4. Redis操作Hash工具类封装,Redis工具类封装

    Redis操作Hash工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>> ...

  5. Redis操作字符串工具类封装,Redis工具类封装

    Redis操作字符串工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>>& ...

  6. 项目经验分享——Java常用工具类集合 转

    http://blog.csdn.net/xyw591238/article/details/51678525 写在前面     本文涉及的工具类部分是自己编写,另一部分是在项目里收集的.工具类涉及数 ...

  7. spring项目中 通过自定义applicationContext工具类获取到applicationContext上下文对象

    spring项目在服务器启动的时候 spring容器中就已经被创建好了各种对象,在我们需要使用的时候可以进行调用. 工具类代码如下 import org.springframework.beans.B ...

  8. Redis,JedisPool工具类

    Redis,JedisPool工具类 1.JedisPool 详细配置解释代码 2.Jedis工具类 导入相关依赖: commons-pool2-2.3.jar jedis-2.7.0.jar 1.J ...

  9. Redis 与Spring-data-redis 整合后封装的工具类

    此工具类方法是使用了redis 与spring 整合后,才可以使用的工具类,将 spring-data-redis 一些我们开发中常用的方法进行了封装,方便我们日常开发中进行调用: package c ...

随机推荐

  1. 从一知半解到揭晓Java高级语法—泛型

    目录 前言 探讨 泛型解决了什么问题? 扩展 引入泛型 什么是泛型? 泛型类 泛型接口 泛型方法 类型擦除 擦除的问题 边界 通配符 上界通配符 下界通配符 通配符和向上转型 泛型约束 实践总结 泛型 ...

  2. Vue 侦听器 watch

    1. 侦听器 watch Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性 当属性发生改变时,自动触发属性对应的侦听器. 当需要在数据变化时执行异步或开销较大的操作时,这 ...

  3. 本机ping不通虚拟机,但虚拟机可以ping通本机时怎么解决

    在各自网络都连接的情况下,本机ping不通虚拟机,但虚拟机可以ping通本机时解决方案: 1.linux虚拟机中连接方式选择NAT模式 2.本地启动VMnet8,然后选择VMnet8的属性,手动输入和 ...

  4. 你想了解的分布式文件系统HDFS,看这一篇就够了

    1.分布式文件系统 计算机集群结构 分布式文件系统把文件分布存储到多个节点(计算机)上,成千上万的计算机节点构成计算机集群. 分布式文件系统使用的计算机集群,其配置都是由普通硬件构成的,与用多个处理器 ...

  5. Win10安装Tensorflow-gpu遇到Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问

    最近因为上课需要安装Anaconda和Tensorflow,安装Anaconda后再使用 Tensorflow官网提供的pip安装Tensorflow-GPU方法会出现如下错误: 解决方法:在安装命令 ...

  6. Kubernetes中的存储(六)

    一.ConfigMap 1,介绍 ConfigMap 功能在 Kuberbetes 1.2 版本中引入,许多应用程序会从配置文件.命令行参数或环境变量中读取配置信息.ConfigMap API 给我们 ...

  7. command三国杀开发日记20200915

    一句话进展 完善了程序结构,分离.c和.h 搭建了6个阶段函数 实现了玩家摸牌 封装实现了日志打印函数 日志打印 想要区分日志等级,包括DEBUG.INFO.WARN.ERRRO.PANIC,提供统一 ...

  8. StringBuilder 比 String 快?空嘴白牙的,证据呢!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 聊的是八股的文,干的是搬砖的活! 面我的题开发都用不到,你为什么要问?可能这是大部分 ...

  9. MySQL的共享锁阻塞会话案例浅析输入日志标题

        这是问题是一个网友遇到的问题:一个UPDATE语句产生的共享锁阻塞了其他会话的案例,对于这个案例,我进一步分析.总结和衍化了相关问题.下面分析如有不对的地方,敬请指正.下面是初始化环境和数据的 ...

  10. NX二次开发-使用NXOPEN C#手工搭建开发环境配置

    新建类库 进来后编译代码,成功 添加NXOPEN的库到项目中 不同NX版本,可能dll所在位置不一样,NX11以上版本在NXBIN这里,NX11以下版本大概在UGII. 添加头文件 using NXO ...