Spring Boot 整合Redis
Spring Boot 整合 Redis
导入依赖
<!-- springboot 整合 redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--guawa 工具类 -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.0.1-jre</version>
</dependency>
配置文件
spring:
redis:
database: 0
# Redis 服务器地址 写你的 ip
host: 0.0.0.0
# Redis 服务器连接端口
port: 6379
# Redis 服务器连接密码(默认为空)
password:
# 连接池最大连接数(使用负值表示没有限制 类似于 mysql 的连接池
jedis:
pool:
max-active: 200
# 连接池最大阻塞等待时间(使用负值表示没有限制) 表示连接池的链接拿完了 现在去申请需要等待的时间
max-wait: -1
# 连接池中的最大空闲连接
max-idle: 10
# 连接池中的最小空闲连接
min-idle: 0
# 连接超时时间(毫秒) 去链接 redis 服务端
timeout: 6000
配置 RedisTemplate
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
// 设置工厂链接
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 设置自定义序列化方式
setSerializeConfig(redisTemplate, redisConnectionFactory);
return redisTemplate;
}
<span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">setSerializeConfig</span><span class="hljs-params">(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory redisConnectionFactory)</span> {
<span class="hljs-comment">//对字符串采取普通的序列化方式 适用于key 因为我们一般采取简单字符串作为key</span>
<span class="hljs-type">StringRedisSerializer</span> <span class="hljs-variable">stringRedisSerializer</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">StringRedisSerializer</span>();
<span class="hljs-comment">//普通的string类型的key采用 普通序列化方式</span>
redisTemplate.setKeySerializer(stringRedisSerializer);
<span class="hljs-comment">//普通hash类型的key也使用 普通序列化方式</span>
redisTemplate.setHashKeySerializer(stringRedisSerializer);
<span class="hljs-comment">//解决查询缓存转换异常的问题 大家不能理解就直接用就可以了 这是springboot自带的jackson序列化类,但是会有一定问题</span>
<span class="hljs-type">Jackson2JsonRedisSerializer</span> <span class="hljs-variable">jackson2JsonRedisSerializer</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Jackson2JsonRedisSerializer</span>(Object.class);
<span class="hljs-type">ObjectMapper</span> <span class="hljs-variable">om</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">ObjectMapper</span>();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
<span class="hljs-comment">//普通的值采用jackson方式自动序列化</span>
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
<span class="hljs-comment">//hash类型的值也采用jackson方式序列化</span>
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
<span class="hljs-comment">//属性设置完成afterPropertiesSet就会被调用,可以对设置不成功的做一些默认处理</span>
redisTemplate.afterPropertiesSet();
}
}
Redis 工具类
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Component
@Slf4j
public class RedisUtils {
<span class="hljs-meta">@Autowired</span>
<span class="hljs-keyword">private</span> RedisTemplate<String,Object> redisTemplate;
<span class="hljs-comment">/**
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@return</span> 获得值
* redis有五种数据类型 opsForValue表示是操作字符串类型
*/</span>
<span class="hljs-keyword">public</span> Object <span class="hljs-title function_">get</span><span class="hljs-params">(String key)</span>{
<span class="hljs-type">return</span> <span class="hljs-variable">key</span> <span class="hljs-operator">=</span>= <span class="hljs-literal">null</span> ? <span class="hljs-literal">null</span> : redisTemplate.opsForValue().get(key);
}
<span class="hljs-comment">//本来只可以放入string类型,但是我们配置了自动序列化所以这儿可以传入object</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">boolean</span> <span class="hljs-title function_">set</span><span class="hljs-params">(String key,Object value)</span>{
<span class="hljs-keyword">try</span>{
redisTemplate.opsForValue().set(key,value);
<span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
}<span class="hljs-keyword">catch</span> (Exception e){
log.error(<span class="hljs-string">"redis set value exception:{}"</span>,e);
<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
}
}
<span class="hljs-comment">/**
* 原子操作
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@param</span> value
* <span class="hljs-doctag">@param</span> expire 过期时间 秒
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">boolean</span> <span class="hljs-title function_">setex</span><span class="hljs-params">(String key,Object value,<span class="hljs-type">long</span> expire)</span>{
<span class="hljs-keyword">try</span>{<span class="hljs-comment">//TimeUnit.SECONDS指定类型为秒</span>
redisTemplate.opsForValue().set(key,value,expire, TimeUnit.SECONDS);
<span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
}<span class="hljs-keyword">catch</span> (Exception e){
log.error(<span class="hljs-string">"redis set value and expire exception:{}"</span>,e);
<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
}
}
<span class="hljs-comment">/**
* 非原子操作
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@param</span> expire
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">boolean</span> <span class="hljs-title function_">expire</span><span class="hljs-params">(String key,<span class="hljs-type">long</span> expire)</span>{
<span class="hljs-keyword">try</span>{<span class="hljs-comment">//这儿没有ops什么的是因为每种数据类型都能设置过期时间</span>
redisTemplate.expire(key,expire,TimeUnit.SECONDS);
<span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
}<span class="hljs-keyword">catch</span> (Exception e){
log.error(<span class="hljs-string">"redis set key expire exception:{}"</span>,e);
<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
}
}
<span class="hljs-comment">/**
*
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@return</span> 获取key的过期时间
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">long</span> <span class="hljs-title function_">ttl</span><span class="hljs-params">(String key)</span>{
<span class="hljs-keyword">return</span> redisTemplate.getExpire(key);
}
<span class="hljs-comment">/**
*
* <span class="hljs-doctag">@param</span> keys 删除key 可变参数
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">del</span><span class="hljs-params">(String ...keys)</span>{
<span class="hljs-keyword">if</span>(keys!=<span class="hljs-literal">null</span>&&keys.length><span class="hljs-number">0</span>) {
redisTemplate.delete((Collection<String>) CollectionUtils.arrayToList(keys));
}
}
<span class="hljs-comment">/**
*
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@param</span> step 传入正数 就是加多少 传入负数就是减多少
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">long</span> <span class="hljs-title function_">incrBy</span><span class="hljs-params">(String key,<span class="hljs-type">long</span> step)</span>{
<span class="hljs-keyword">return</span> redisTemplate.opsForValue().increment(key,step);
}
<span class="hljs-comment">/**
*
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@param</span> value
* <span class="hljs-doctag">@return</span> 如果该key存在就返回false 设置不成功 key不存在就返回ture设置成功
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">boolean</span> <span class="hljs-title function_">setnx</span><span class="hljs-params">(String key,Object value)</span>{
<span class="hljs-keyword">return</span> redisTemplate.opsForValue().setIfAbsent(key,value);
}
<span class="hljs-comment">/**
* 原子操作
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@param</span> value
* <span class="hljs-doctag">@param</span> expire 在上面方法加上过期时间设置
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">boolean</span> <span class="hljs-title function_">setnxAndExpire</span><span class="hljs-params">(String key,Object value,<span class="hljs-type">long</span> expire)</span>{
<span class="hljs-keyword">return</span> redisTemplate.opsForValue().setIfAbsent(key,value,expire,TimeUnit.SECONDS);
}
<span class="hljs-comment">/**
*
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@param</span> value
* <span class="hljs-doctag">@return</span> 如果该key存在就返回之前的value 不存在就返回null
*/</span>
<span class="hljs-keyword">public</span> Object <span class="hljs-title function_">getAndSet</span><span class="hljs-params">(String key,Object value)</span>{
<span class="hljs-keyword">return</span> redisTemplate.opsForValue().getAndSet(key,value);
}
<span class="hljs-comment">/**
*
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@return</span> 判断key是否存在
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">boolean</span> <span class="hljs-title function_">hasKey</span><span class="hljs-params">(String key)</span>{
<span class="hljs-keyword">return</span> redisTemplate.hasKey(key);
}
<span class="hljs-comment">/***list的长度**/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">long</span> <span class="hljs-title function_">llen</span><span class="hljs-params">(String key)</span>{
<span class="hljs-keyword">return</span> redisTemplate.opsForList().size(key);
}
<span class="hljs-comment">/**
* 获取key中index位置的值,负数就反过来数,-1为最后一个
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@param</span> index
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> Object <span class="hljs-title function_">lgetByIndex</span><span class="hljs-params">(String key,<span class="hljs-type">long</span> index)</span>{
<span class="hljs-keyword">try</span> {
<span class="hljs-keyword">return</span> redisTemplate.opsForList().index(key, index);
} <span class="hljs-keyword">catch</span> (Exception e) {
log.error(<span class="hljs-string">"redis lgetByIndex error,key:{},index:{}exception:{}"</span>,key,index,e);
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
}
}
<span class="hljs-comment">/**
* 将list放入缓存
* <span class="hljs-doctag">@param</span> key 键
* <span class="hljs-doctag">@param</span> value 值
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">boolean</span> <span class="hljs-title function_">lrpush</span><span class="hljs-params">(String key, Object value)</span> {
<span class="hljs-keyword">try</span> {
redisTemplate.opsForList().rightPush(key, value);
<span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
} <span class="hljs-keyword">catch</span> (Exception e) {
log.error(<span class="hljs-string">"redis lrpush error,key:{},value:{}exception:{}"</span>,key,value,e);
<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
}
}
<span class="hljs-comment">/**
* 将list放入缓存
* <span class="hljs-doctag">@param</span> key 键
* <span class="hljs-doctag">@param</span> value 值
* <span class="hljs-doctag">@param</span> time 时间(秒)
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">boolean</span> <span class="hljs-title function_">lrpush</span><span class="hljs-params">(String key, Object value, <span class="hljs-type">long</span> time)</span> {
<span class="hljs-keyword">try</span> {
redisTemplate.opsForList().rightPush(key, value);
<span class="hljs-keyword">if</span> (time > <span class="hljs-number">0</span>)
expire(key, time);
<span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
} <span class="hljs-keyword">catch</span> (Exception e) {
log.error(<span class="hljs-string">"redis lrpush error,key:{},value:{},timeL{},exception:{}"</span>,key,value,time,e);
<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
}
}
<span class="hljs-comment">/**
* 将list放入缓存
* <span class="hljs-doctag">@param</span> key 键
* <span class="hljs-doctag">@param</span> value 值
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">boolean</span> <span class="hljs-title function_">lrpush</span><span class="hljs-params">(String key, List<Object> value)</span> {
<span class="hljs-keyword">try</span> {
redisTemplate.opsForList().rightPushAll(key, value);
<span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
} <span class="hljs-keyword">catch</span> (Exception e) {
log.error(<span class="hljs-string">"redis lrpush error,key:{},value:{},exception:{}"</span>,key,value,e);
<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
}
}
<span class="hljs-comment">/**
* 将list放入缓存
*
* <span class="hljs-doctag">@param</span> key 键
* <span class="hljs-doctag">@param</span> value 值
* <span class="hljs-doctag">@param</span> time 时间(秒)
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">boolean</span> <span class="hljs-title function_">lrpush</span><span class="hljs-params">(String key, List<Object> value, <span class="hljs-type">long</span> time)</span> {
<span class="hljs-keyword">try</span> {
redisTemplate.opsForList().rightPushAll(key, value);
<span class="hljs-keyword">if</span> (time > <span class="hljs-number">0</span>)
expire(key, time);
<span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
} <span class="hljs-keyword">catch</span> (Exception e) {
log.error(<span class="hljs-string">"redis lrpush error,key:{},value:{},time:{},exception:{}"</span>,key,value,time,e);
<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
}
}
<span class="hljs-comment">/**
* 根据索引修改list中的某条数据
* <span class="hljs-doctag">@param</span> key 键
* <span class="hljs-doctag">@param</span> index 索引
* <span class="hljs-doctag">@param</span> value 值
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">boolean</span> <span class="hljs-title function_">lUpdateByIndex</span><span class="hljs-params">(String key, <span class="hljs-type">long</span> index, Object value)</span> {
<span class="hljs-keyword">try</span> {
redisTemplate.opsForList().set(key, index, value);
<span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
} <span class="hljs-keyword">catch</span> (Exception e) {
log.error(<span class="hljs-string">"redis lUpdateByIndex error,key:{},index:{},value:{},exception:{}"</span>,key,index,value,e);
<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
}
}
<span class="hljs-comment">/**
* 移除N个值为value
* <span class="hljs-doctag">@param</span> key 键
* <span class="hljs-doctag">@param</span> count 移除多少个
* <span class="hljs-doctag">@param</span> value 值
* <span class="hljs-doctag">@return</span> 移除的个数
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">long</span> <span class="hljs-title function_">lrem</span><span class="hljs-params">(String key, <span class="hljs-type">long</span> count, Object value)</span> {
<span class="hljs-keyword">try</span> {
<span class="hljs-type">Long</span> <span class="hljs-variable">remove</span> <span class="hljs-operator">=</span> redisTemplate.opsForList().remove(key, count, value);
<span class="hljs-keyword">return</span> remove;
} <span class="hljs-keyword">catch</span> (Exception e) {
log.error(<span class="hljs-string">"redis lrem error,key:{},count:{},value:{},exception:{}"</span>,key,count,value,e);
<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
}
}
<span class="hljs-comment">/*****hash数据类型方法 opsForHash表示是操作字符串类型*****/</span>
<span class="hljs-comment">/**
* <span class="hljs-doctag">@param</span> key 健
* <span class="hljs-doctag">@param</span> field 属性
* <span class="hljs-doctag">@param</span> value 值
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">boolean</span> <span class="hljs-title function_">hset</span><span class="hljs-params">(String key, String field, Object value)</span> {
<span class="hljs-keyword">try</span> {
redisTemplate.opsForHash().put(key, field, value);
<span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
}<span class="hljs-keyword">catch</span> (Exception e){
log.error(<span class="hljs-string">"redis hset eror,key:{},field:{},value:{}"</span>,key,field,value);
<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
}
}
<span class="hljs-comment">/**
*
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@param</span> field
* <span class="hljs-doctag">@param</span> value
* <span class="hljs-doctag">@param</span> seconds(秒) 过期时间
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">boolean</span> <span class="hljs-title function_">hset</span><span class="hljs-params">(String key, String field, Object value,<span class="hljs-type">long</span> seconds)</span> {
<span class="hljs-keyword">try</span> {
redisTemplate.opsForHash().put(key, field, value);
expire(key,seconds);<span class="hljs-comment">//调用通用方法设置过期时间</span>
<span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
}<span class="hljs-keyword">catch</span> (Exception e){
log.error(<span class="hljs-string">"redis hset and expire eror,key:{},field:{},value:{},exception:{}"</span>,key,field,value,e);
<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
}
}
<span class="hljs-comment">/**
* 获取key中field属性的值
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@param</span> field
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> Object <span class="hljs-title function_">hget</span><span class="hljs-params">(String key,String field)</span>{
<span class="hljs-keyword">return</span> redisTemplate.opsForHash().get(key,field);
}
<span class="hljs-comment">/**
* 获取key中多个属性的键值对,这儿使用map来接收
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@param</span> fields
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> Map<String,Object> <span class="hljs-title function_">hmget</span><span class="hljs-params">(String key, String...fields)</span>{
Map<String,Object> map = <span class="hljs-keyword">new</span> <span class="hljs-title class_">HashMap</span><>();
<span class="hljs-keyword">for</span> (String field :fields){
map.put(field,hget(key,field));
}
<span class="hljs-keyword">return</span> map;
}
<span class="hljs-comment">/**
* <span class="hljs-doctag">@param</span> key 获得该key下的所有键值对
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> Map<Object, Object> <span class="hljs-title function_">hmget</span><span class="hljs-params">(String key)</span>{
<span class="hljs-keyword">return</span> redisTemplate.opsForHash().entries(key);
}
<span class="hljs-comment">/**
* <span class="hljs-doctag">@param</span> key 获得该key下的所有键值对
* <span class="hljs-doctag">@return</span>
*/</span>
@Autowired
private JacksonUtil jacksonUtil;
//map----json 字符串 ----> 对象
public <T>T hmgetObject(String key,Class<T> tClass){
Map<Object, Object> hmget = hmget(key);
if(CollectionUtils.isEmpty(hmget)) return null;
// 查询到了 先把数据转成 json 字符串
String s = jacksonUtil.writeAsString(hmget);
// 再把 json 字符串转回对象
return jacksonUtil.readValue(s,tClass);
}
<span class="hljs-comment">/**
* <span class="hljs-doctag">@param</span> key 键
* <span class="hljs-doctag">@param</span> map 对应多个键值
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">boolean</span> <span class="hljs-title function_">hmset</span><span class="hljs-params">(String key,Map<Object,Object> map)</span>{
<span class="hljs-keyword">try</span> {
redisTemplate.opsForHash().putAll(key, map);
<span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
}<span class="hljs-keyword">catch</span> (Exception e){
log.error(<span class="hljs-string">"redis hmset eror,key:{},value:{},exception:{}"</span>,key,map,e);
<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
}
}
<span class="hljs-keyword">public</span> <span class="hljs-type">boolean</span> <span class="hljs-title function_">hmset</span><span class="hljs-params">(String key,Object object)</span>{
<span class="hljs-keyword">try</span> {
<span class="hljs-type">String</span> <span class="hljs-variable">s</span> <span class="hljs-operator">=</span> jacksonUtil.writeAsString(object);
Map<String, String> map = jacksonUtil.readValueMap(s);
redisTemplate.opsForHash().putAll(key, map);
<span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
}<span class="hljs-keyword">catch</span> (Exception e){
log.error(<span class="hljs-string">"redis hmset eror,key:{},object:{},exception:{}"</span>,key,object,e);
<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
}
}
<span class="hljs-comment">/**
* <span class="hljs-doctag">@param</span> key 键
* <span class="hljs-doctag">@param</span> map 对应多个键值
* <span class="hljs-doctag">@param</span> seconds 过期时间(秒)
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">boolean</span> <span class="hljs-title function_">hmset</span><span class="hljs-params">(String key,Map<String,Object> map,<span class="hljs-type">long</span> seconds)</span>{
<span class="hljs-keyword">try</span> {
redisTemplate.opsForHash().putAll(key, map);
expire(key,seconds);
<span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>;
}<span class="hljs-keyword">catch</span> (Exception e){
log.error(<span class="hljs-string">"redis hmset eror,key:{},value:{},expireTime,exception:{}"</span>,key,map,seconds,e);
<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
}
}
<span class="hljs-comment">/**
*删除key中的属性
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@param</span> fields
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">hdel</span><span class="hljs-params">(String key,Object...fields)</span>{
redisTemplate.opsForHash().delete(key,fields);
}
<span class="hljs-comment">/**
* 判断key中是否存在某属性
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@param</span> field
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">boolean</span> <span class="hljs-title function_">hHashKey</span><span class="hljs-params">(String key,String field)</span>{
<span class="hljs-keyword">return</span> redisTemplate.opsForHash().hasKey(key,field);
}
<span class="hljs-comment">/**
* 对key中filed的value增加多少 如果是减少就传入负数
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@param</span> field
* <span class="hljs-doctag">@param</span> step 正数增加,负数减少
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">double</span> <span class="hljs-title function_">hincr</span><span class="hljs-params">(String key,String field,<span class="hljs-type">double</span> step)</span>{
<span class="hljs-keyword">return</span> redisTemplate.opsForHash().increment(key,field,step);
}
<span class="hljs-comment">/**
* key中多少个
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">long</span> <span class="hljs-title function_">hlen</span><span class="hljs-params">(String key)</span>{
<span class="hljs-keyword">return</span> redisTemplate.opsForHash().size(key);
}
<span class="hljs-comment">/******其他方法用到在增加********/</span>
<span class="hljs-comment">/***set集合***/</span>
<span class="hljs-comment">/**
* 获取key中所有元素
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> Set<Object> <span class="hljs-title function_">sgetAll</span><span class="hljs-params">(String key)</span>{
<span class="hljs-keyword">try</span> {
<span class="hljs-keyword">return</span> redisTemplate.opsForSet().members(key);
}<span class="hljs-keyword">catch</span> (Exception e){
log.error(<span class="hljs-string">"redis sgetAll error,key:{},exception:{}"</span>,key,e);
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
}
}
<span class="hljs-comment">/**
* 判断value是否在key中
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@param</span> value
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">boolean</span> <span class="hljs-title function_">sexists</span><span class="hljs-params">(String key,Object value)</span>{
<span class="hljs-keyword">try</span> {
<span class="hljs-keyword">return</span> redisTemplate.opsForSet().isMember(key,value);
}<span class="hljs-keyword">catch</span> (Exception e){
log.error(<span class="hljs-string">"redis sexists error,key:{},value:{},exception:{}"</span>,key,value,e);
<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
}
}
<span class="hljs-comment">/**
* 插入多个元素
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@param</span> values
* <span class="hljs-doctag">@return</span> 成功的个数
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">long</span> <span class="hljs-title function_">sset</span><span class="hljs-params">(String key ,Object...values)</span>{
<span class="hljs-keyword">try</span> {
<span class="hljs-keyword">return</span> redisTemplate.opsForSet().add(key,values);
}<span class="hljs-keyword">catch</span> (Exception e){
log.error(<span class="hljs-string">"redis sset error,key:{},value:{},values:{},exception:{}"</span>,key,values,e);
<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
}
}
<span class="hljs-comment">/**
* 添加元素并设置过期时间 (非原子操作)
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@param</span> time
* <span class="hljs-doctag">@param</span> values
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">long</span> <span class="hljs-title function_">sset</span><span class="hljs-params">(String key ,<span class="hljs-type">long</span> time,Object...values)</span>{
<span class="hljs-keyword">try</span> {
<span class="hljs-type">long</span> <span class="hljs-variable">count</span> <span class="hljs-operator">=</span> redisTemplate.opsForSet().add(key,values);
expire(key,time);
<span class="hljs-keyword">return</span> count;
}<span class="hljs-keyword">catch</span> (Exception e){
log.error(<span class="hljs-string">"redis sset error,key:{},value:{},values:{},exception:{}"</span>,key,values,e);
<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
}
}
<span class="hljs-comment">/**
* 获取set的长度
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">long</span> <span class="hljs-title function_">sgetSize</span><span class="hljs-params">(String key)</span>{
<span class="hljs-keyword">try</span> {
<span class="hljs-keyword">return</span> redisTemplate.opsForSet().size(key);
}<span class="hljs-keyword">catch</span> (Exception e){
log.error(<span class="hljs-string">"redis sgetSize error,key:{},exception:{}"</span>,key,e);
<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
}
}
<span class="hljs-comment">/**
* 移除值为value的
* <span class="hljs-doctag">@param</span> key 键
* <span class="hljs-doctag">@param</span> values 值 可以是多个
* <span class="hljs-doctag">@return</span> 移除的个数
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">long</span> <span class="hljs-title function_">sRemove</span><span class="hljs-params">(String key, Object... values)</span> {
<span class="hljs-keyword">try</span> {
<span class="hljs-type">Long</span> <span class="hljs-variable">count</span> <span class="hljs-operator">=</span> redisTemplate.opsForSet().remove(key, values);
<span class="hljs-keyword">return</span> count;
} <span class="hljs-keyword">catch</span> (Exception e) {
log.error(<span class="hljs-string">"redis sRemove error,key:{},values:{},exception:{}"</span>,key,values,e);
<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
}
}
<span class="hljs-comment">/**
* 随机取count个元素 count为正数就取不重复的 负数就有可能重复
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@param</span> count
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> List<Object> <span class="hljs-title function_">sRandom</span><span class="hljs-params">(String key,<span class="hljs-type">long</span> count)</span> {
<span class="hljs-keyword">try</span> {
<span class="hljs-keyword">return</span> redisTemplate.opsForSet().randomMembers(key,count);
} <span class="hljs-keyword">catch</span> (Exception e) {
log.error(<span class="hljs-string">"redis sRandom error,key:{},count:{},exception:{}"</span>,key,count,e);
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
}
}
<span class="hljs-comment">/****zset工具类***/</span>
<span class="hljs-comment">/**
* 添加元素
* <span class="hljs-doctag">@param</span> key
* <span class="hljs-doctag">@param</span> member
* <span class="hljs-doctag">@param</span> score
* <span class="hljs-doctag">@return</span>
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-type">boolean</span> <span class="hljs-title function_">zadd</span><span class="hljs-params">(String key,Object member,<span class="hljs-type">double</span> score)</span>{
<span class="hljs-keyword">try</span> {
<span class="hljs-keyword">return</span> redisTemplate.opsForZSet().add(key,member,score);
} <span class="hljs-keyword">catch</span> (Exception e) {
log.error(<span class="hljs-string">"redis zadd error,key:{},value:{},score:{},exception:{}"</span>,key,member,score,e);
<span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
}
}
<span class="hljs-keyword">public</span> Set<String> <span class="hljs-title function_">zrange</span><span class="hljs-params">(String key,<span class="hljs-type">int</span> start,<span class="hljs-type">int</span> end)</span>{
<span class="hljs-keyword">try</span> {
Set<Object> range = redisTemplate.opsForZSet().
range(key, start, end);
<span class="hljs-keyword">if</span>(range==<span class="hljs-literal">null</span>||range.size()==<span class="hljs-number">0</span>) <span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
<span class="hljs-keyword">return</span> range.stream().
map(o->(String)o).collect(Collectors.toSet());
} <span class="hljs-keyword">catch</span> (Exception e) {
log.error(<span class="hljs-string">"redis zrange error,key:{},start:{},end:{},exception:{}"</span>,
key,start,end,e);
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
}
}
/*** 这个有点多,就不一一写了 大家用到什么去补全剩下的 API
- Set< V > range(K key, long start, long end); 下标范围取
- Long remove(K key, Object… values); 删除元素
*Double incrementScore(K key, V value, double delta); 增加分数 - Long rank(K key, Object o); 当前元素的位置
*Long reverseRank(K key, Object o); 反过来的位置
*Set< TypedTuple< V >> rangeWithScores(K key, long start, long end); 下标取出来带分数 - Set< V > rangeByScore(K key, double min, double max); 根据分数取
- Set< TypedTuple< V >> rangeByScoreWithScores(K key, double min, double max); 根据分数取 并携带分数
- Set< TypedTuple< V >> rangeByScoreWithScores(K key, double min, double max, long offset, long count); 翻页
*Long count(K key, double min, double max); 统计分数段的个数
*Long size(K key); 个数 底层就是 card - Long zCard(K key); 个数
- Double score(K key, Object o); 查看某个元素的分数
- Long removeRange(K key, long start, long end); 根据下标删除某个范围
- Long removeRangeByScore(K key, double min, double max); 删除某个分数段
- 等等
**/
}