首页 > 数据库 >redis笔记一

redis笔记一

时间:2023-02-27 19:56:04浏览次数:34  
标签:return String 笔记 redis value param key exp

配置starter,当前boot版本2.5.3

1、引入依赖pom.xml:

<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>

2、配置yml

spring
  redis:
  database: 0
  host: 127.0.0.1
  port: 6379
  password: lizhenfeng
  lettuce:
  pool:
  max-active: 20
  max-wait: -1
  max-idle: 10
  min-idle: 0
  # 哨兵设置
  #sentinel:
  #master:
  #nodes:
  timeout: 3000

3、创建redis配置类,没想到这个的作用...如果说是设置序列化,emmm,对象序列化一直是失败,很恼火,然后直接使用了字符串

/**
* 2022年11月27日01:21:22 redis配置
*
* @author Administrator
*/
@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {

RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();

redisTemplate.setConnectionFactory(redisConnectionFactory);
GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer =
new GenericJackson2JsonRedisSerializer();
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

// 设置value的序列化规则和 key的序列化规则
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setValueSerializer(stringRedisSerializer);

redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);

redisTemplate.setDefaultSerializer(genericJackson2JsonRedisSerializer);
redisTemplate.setEnableDefaultSerializer(true);

redisTemplate.afterPropertiesSet();

return redisTemplate;
}

}

4、创建RedisService和实现类RedisServiceImpl,不知是从哪位大神那里拿来的了,很多方法没用到没改,最后自己加了两个方法,因为list存直接存报转换异常,然后对象存也有缓存异常,心累就没改,直接是把list里面的对象转成字符串进行设值,emmm,没有试过直接将list转成字符串存,但是估计不报错的把握应该不小

/**
* redis接口
*
* @author Administrator
*/
public interface RedisService {
/** 缓存的有效时长 **/

long TIME_ONE_SECOND = 1;
long TIME_ONE_MINUTE = 60 * TIME_ONE_SECOND;
long TIME_ONE_HOUR = 60 * TIME_ONE_MINUTE;
long TIME_ONE_DAY = 24 * TIME_ONE_HOUR;
long TIME_ONE_MONTH = 30 * TIME_ONE_DAY;

/**
* 获取缓存剩余时间
*
* @param keys
* @return 秒
*/
long getExpire(String... keys);

/**
* 缓存数据 并 设置有效期
*
* @param value
* @param exp
* @param unit
* @param keys
* @param <V>
* @return
*/
<V> boolean setByKey(V value, long exp, TimeUnit unit, String... keys);

/**
* 缓存数据 并 设置有效期(默认时间单位为秒)
*
* @param value
* @param exp
* @param keys
* @param <V>
* @return
*/
<V> boolean setByKey(V value, long exp, String... keys);

/**
* 缓存数据(默认存储一个月)
*
* @param value
* @param keys
* @param <V>
* @return
*/
<V> boolean setByKey(V value, String... keys);

/**
* incr key 原子递增
*
* @param key
* @param value
* @return
*/
long increment(String key, long value);

/**
* incr key 原子递增
*
* @param key
* @param value
* @param exp
* @return
*/
long increment(String key, long value, long exp);

/**
* rpush = right push (rpush key value) 添加元素到List集合的尾部(默认存储时间单位为秒)
*
* @param key
* @param value 一个元素 或 一个List集合
* @param exp
* @param <V>
* @return
*/
<V> boolean rpush(String key, V value, long exp);

/**
* lpush = left push (lpush key value) 添加元素到List集合的头部(默认存储时间单位为秒)
*
* @param key
* @param value 一个元素 或 一个List集合
* @param exp
* @param <V>
* @return
*/
<V> boolean lpush(String key, V value, long exp);

/**
* lrange = list range (lrange key 0 -1 即获取全部列表数据) 获取List集合数据
*
* @param key
* @param <V>
* @return
*/
<V> V lrange(String key);

/**
* sadd key value 添加元素到Set集合(默认存储时间单位为秒)
*
* @param key
* @param value 一个元素 或 一个Set集合
* @param exp
* @param <V>
* @return
*/
<V> boolean sadd(String key, V value, long exp);

/**
* smembers key 获取Set集合数据
*
* @param key
* @param <V>
* @return
*/
<V> V smembers(String key);

/**
* zadd key score value (score为有序索引序列) 添加元素到ZSet集合(有序)(默认存储时间单位为秒)
*
* @param key
* @param value 一个元素 或 一个Set集合
* @param exp
* @param <V>
* @return
*/
<V> boolean zadd(String key, V value, long exp);

/**
* zrange key 0 -1 获取ZSet集合数据
*
* @param key
* @param <V>
* @return
*/
<V> V zrange(String key);

/**
* 获取Redis缓存数据
*
* @param keys
* @param <V>
* @return
*/
<V> V getByKey(String... keys);

/**
* 删除Redis缓存数据
*
* @param keys
* @return
*/
boolean delByKey(String... keys);

/**
* 通过 Redis 发布订阅消息
*
* @param channel
* @param message
*/
void convertAndSend(String channel, Object message);

/**
* 自定义存list集合
*
* @param list
* @param key
*/
void setListCustom(List<?> list, String key);

/**
* 自定义取list集合
*
* @param key
* @param clazz
* @return
*/
List getListCustom(String key, Class clazz);
}
/**
* 2022年11月27日14:06:52 redis实现类
*
* @author Administrator
*/
@Slf4j
@Service
public class RedisServiceImpl implements RedisService {

private RedisTemplate<String, Object> redisTemplate;

/**
* 拼接缓存数据的key
*
* @param keys
* @return
*/
private String getMemKey(String... keys) {
if (keys == null || keys.length == 0) {
return null;
}
if (keys.length == 1) {
return keys[0];
}
StringBuffer memKey = new StringBuffer();
Arrays.stream(keys).forEach(key -> {
memKey.append(":");
memKey.append(key);
});
return memKey.toString().replaceFirst(":", "");
}

/**
* 设置缓存有效期
*
* @param key
* @param exp 默认一个月
* @param unit 默认为秒
* @return
*/
private boolean expireByKey(String key, long exp, TimeUnit unit) {
if (exp == 0) {
exp = RedisService.TIME_ONE_MONTH;
}
if (unit == null) {
unit = TimeUnit.SECONDS;
}
return this.redisTemplate.expire(key, exp, unit);
}

@Override
public long getExpire(String... keys) {
String memKey = this.getMemKey(keys);
Long expire = this.redisTemplate.getExpire(memKey);
log.info("获取缓存数据剩余有效期:key-{}, value-{}", memKey, expire);
return expire == null ? 0 : expire;
}

@Override
public <V> boolean setByKey(V value, long exp, TimeUnit unit, String... keys) {
String memKey = this.getMemKey(keys);
this.redisTemplate.opsForValue().set(memKey, value);
return this.expireByKey(memKey, exp, unit);
}

@Override
public <V> boolean setByKey(V value, long exp, String... keys) {
return setByKey(value, exp, TimeUnit.SECONDS, keys);
}

@Override
public <V> boolean setByKey(V value, String... keys) {
return setByKey(value, 0, keys);
}

@Override
public long increment(String key, long value) {
// 永不过期
return this.redisTemplate.opsForValue().increment(key, value);
}

@Override
public long increment(String key, long value, long exp) {
long afterIncrementValue = this.redisTemplate.opsForValue().increment(key, value);
this.expireByKey(key, exp, TimeUnit.SECONDS);
return afterIncrementValue;
}

@Override
public <V> boolean rpush(String key, V value, long exp) {
this.redisTemplate.opsForList().rightPush(key, value);
return this.expireByKey(key, exp, TimeUnit.SECONDS);
}

@Override
public <V> boolean lpush(String key, V value, long exp) {
this.redisTemplate.opsForList().leftPush(key, value);
return this.expireByKey(key, exp, TimeUnit.SECONDS);
}

@Override
public <V> V lrange(String key) {
log.debug("获取缓存数据:key-{}", key);
return (V)this.redisTemplate.opsForList().range(key, 0, -1);
}

@Override
public <V> boolean sadd(String key, V value, long exp) {
this.redisTemplate.opsForSet().add(key, value);
return this.expireByKey(key, exp, TimeUnit.SECONDS);
}

@Override
public <V> V smembers(String key) {
log.debug("获取缓存数据:key-{}", key);
return (V)this.redisTemplate.opsForSet().members(key);
}

@Override
public <V> boolean zadd(String key, V value, long exp) {
this.redisTemplate.opsForZSet().add(key, value, Math.random());
return this.expireByKey(key, exp, TimeUnit.SECONDS);
}

@Override
public <V> V zrange(String key) {
log.debug("获取缓存数据:key-{}", key);
return (V)this.redisTemplate.opsForZSet().range(key, 0, -1);
}

@Override
@SuppressWarnings("unchecked")
public <V> V getByKey(String... keys) {
String memKey = this.getMemKey(keys);
V value = (V)this.redisTemplate.opsForValue().get(memKey);
log.info("获取缓存数据:key-{}, value-{}", memKey, JSON.toJSONString(value));
return value;
}

@Override
public boolean delByKey(String... keys) {
return this.redisTemplate.opsForValue().getOperations().delete(this.getMemKey(keys));
}

@Override
public void convertAndSend(String channel, Object message) {
this.redisTemplate.convertAndSend(channel, message);
}

@Override
public void setListCustom(List<?> list, String key) {
if (!CollectionUtils.isEmpty(list) && list.size() > 0) {
list.forEach(v -> {
this.rpush(key, JSONObject.toJSONString(v), 0);
});
}
}

@Override
public List getListCustom(String key, Class clazz) {
List list = new ArrayList<>();
List<String> ls = this.lrange(key);
ls.forEach(s -> {
list.add(JSONObject.parseObject(s, clazz));
});
return list;
}

@Autowired
public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}

}

5、使用

private RedisService redisService;
@Autowired
public void setRedisService(RedisService redisService) {
this.redisService = redisService;
}

@Override
public SysVariable getByKey(String sysVariableKey) {
SysVariable sysVariable = this.redisService.getByKey(sysVariableKey);
if (sysVariable == null) {
sysVariable = this.sysVariableMapper.getByKey(sysVariableKey);
this.redisService.setByKey(sysVariable, sysVariableKey);
}
return sysVariable;
}
@Override
public List<UserInfo> structLoginInfo(Long roleId) {
String key = roleId == null ? "structLoginInfo" : "structLoginInfo_" + roleId;
List<UserInfo> userInfoList;
if (roleId != null) {
// 根据roleId构建
}
   // 目测第一次会有空指针异常,但是时间紧迫不想重启redis服务了
userInfoList = (List<UserInfo>)this.redisService.getListCustom(key, UserInfo.class);
if (CollectionUtils.isEmpty(userInfoList) || userInfoList.size() == 0) {
userInfoList = this.personMapper.structLoginInfo();
this.redisService.setListCustom(userInfoList, key);
return userInfoList;
}
return userInfoList;
}

标签:return,String,笔记,redis,value,param,key,exp
From: https://www.cnblogs.com/lizhenfeng/p/17161654.html

相关文章

  • 2022-10-26-CS231N-课后思考后笔记
    layout:posttitle:CS231N-课后思考后笔记subtitle:CS231N-课后思考后笔记description:CS231N-课后思考后笔记date:2022-10-26categories:deep......
  • 理论:第四章:Redis支持的数据类型以及使用场景,持久化,哨兵机制,缓存雪崩,缓存穿透,双删策略
    简单介绍一个redis?redis是内存中的数据结构存储系统,一个key-value类型的非关系型数据库,可持久化的数据库,相对于关系型数据库(数据主要存在硬盘中),性能高,因此我们一般用redis......
  • 未记录的 笔记 2023-02-27 在豪哥聊天框里面
      这个路径没有在路由表看到既然没有看到就是没有经过数据库 没有经过数据库就是不会进过滤器那2个skil(1L)方法,那么就是手动在后端代码前面加sbgl就行  后......
  • IaaS--云虚拟机(三)(何恺铎《深入浅出云计算》笔记整理)
     云虚拟机收费之省钱办法。 【包年包月】包年包月就是我们要提前预估好自己虚拟机的使用时间,比如半年、一年甚至三年,并提前支付相关款项的一种购买方式。这样的购买......
  • 大物笔记
    大学物理质点力学圆周运动$$角速度:\omega=\frac{d\theta}{dt}$$$$v=R\omega$$$$向心加速度a_n=v\omega=\frac{v^2}{R}=R\omega^2$$牛顿运动定理$$加速......
  • springboot中redis使用和工具
    application.properties#Redis相关配置spring.data.redis.host=localhost#端口spring.data.redis.port=6379#reids数据库索引spring.data.redis.database=0Red......
  • 【算法笔记】Day of Week
    DayofWeek时间限制:1Sec  内存限制:32MB提交:2252  解决:692 题目描述WenowusetheGregorianstyleofdatinginRussia.Theleapyearsareyearswith......
  • Redis 缓存穿透,击穿,雪崩 并发 之 读写数据编码实战
     什么是缓存穿透  缓存穿透是指查询一个缓存中和数据库中都不存在的数据,导致每次查询这条数据都会透过缓存,直接查库,最后返回空。当用户使用这条不存在的数据疯狂......
  • 工数下笔记
    工科数学分析下第六章向量代数和空间解析几何$$向量平行条件:\frac{x_2}{x_1}=\frac{y_2}{y_1}=\frac{z_2}{z_1}$$方向角$$设向量\vec{a}与三个坐标轴正方向的夹角......
  • Spring学习笔记
    1.Spring作为轻量级框架的两大核心:IOC、AOP、事务处理(基于AOP)。2.经过学习要会什么?  核心概念IOC、DI >>>>整合mybatis>>>>AOP概念及操作>>>>事务实用开发3.架构......