前言
本章从String常用命令到实战应用场景需求设计开发,能够让对redis陌生的你迅速掌握了解,熟悉的你迅速巩固相关知识
一、特性说明
(一)String 是 Redis 最基本的类型,一个key对应一个value;
(二)String类型是二进制安全的。意思是 redis 的String可以包含任何数据。比如jpg图片或者序列化对象;
(三)String类型是Redis最基本的数据类型,一个键最大能存储512MB;
二进制安全是指,如果在传输数据时,保证二进制数据的信息安全,也就是不被篡改、破译,如果被攻击,能够及时检测出来;
二进制安全特点:
编码、解码发生在客户端,执行效率高;
不需要频繁的编解码,不会出现乱码;
复制代码
二、常用命令
(一)SET
命令格式: SET key value
功能:存入字符串键值
demo说明:
(二)GET
命令格式: get key
功能:获取一个字符串键值
demo说明:
(三)MSET
命令格式: MSET key value [key value ]
功能:批量存储字符串键值
demo说明:
(四)MGET
命令格式: mget key value [key value ]
功能:批量获取字符串键值
demo说明:
(五)SETNX
命令格式: setnx key value
功能:存入一个不存在的字符串键值
demo说明:存入一个键为test444,第一次成功,第二次已存在则返回失败
(六)DEL
命令格式: setnx key value
功能:存入一个不存在的字符串键值
demo说明:
(七)EXPIRE
命令格式: setnx key value
功能:存入一个不存在的字符串键值
demo说明:
(八)INCR
命令格式: incr key
功能:将key中的存储值加一,首次不存在则会创建一个值为0的key
demo说明:
(九)DECR
命令格式: decr key
功能:将key中的存储值减一,首次不存在则会创建一个值为0的key
demo说明:
(十)INCRBY
命令格式: incrby key increment
功能:将key中的存储值加上increment,首次不存在则会创建一个值为0的key
demo说明:
(十一)DECRBY
命令格式: incrby key increment
功能:将key中的存储值减去increment,首次不存在则会创建一个值为0的key
demo说明:
三、应用场景
总结一下生产常用应用场景,主要分为下列几种
(一)普通数据缓存
说明:日常存入mysql的一下配置数据,可以加载到redis中
1、需求
saas服务每个商家都可以在后台动态填写自己支付配置,每次查询后需要将其缓存下来
2、设计
- 获取配置时,首先获取一下缓存,若缓存没有数据,则查询mysql。有则直接返回配置数据
- 查询mysql拿到配置数据,将数据缓存redis后,再返回配置
- 缓存键设计为 paysetting:payment:{服务商id}
3、开发
//下面写了主要逻辑,没有处理异常逻辑 需要小伙伴自己补充
public PaymentDto getPaymentSetting() throws Exception{
ObjectMapper objectMapper = new ObjectMapper();
//查询缓存
String key = "paysetting:payment:1";
//查询缓存
PaymentDto paymentDto = objectMapper.readValue((String) redisTemplate.opsForValue().get(key), PaymentDto.class);
if(ObjectUtils.isEmpty(paymentDto)){
//查询数据库
PaymentDto data = getData();
//缓存
redisTemplate.opsForValue().set(key,objectMapper.writeValueAsString(data),3000,TimeUnit.SECONDS);
return data;
}
//返回数据
return paymentDto;
}
//这里假设从数据库获取信息
private PaymentDto getData(){
PaymentDto paymentDto = new PaymentDto();
paymentDto.setAppId("98765365830261325");
paymentDto.setAppSecret("fodkcjeuhaytwgvbdmi873tg4doo");
return paymentDto;
}
复制代码
(二)对象实例缓存
说明:业务需要的常用对象实例,也可以将其缓存起来。就像spring框架启动会把单例非懒加载的对象提前实例化缓存进JVM
(三)计数器
说明:一些实时性要求高、频繁写入的业务场景对mysql等数据库性能压榨,这时候可以使用redis来缓解。如文章点赞数、评论数之类,或者接口限流等M
1、需求
某些开放接口需要根据不同的套餐流量限制客户每天访问次数
2、设计
- 获取套餐配置,得到客户每天能访问接口的最大次数
- 从缓存获取今日客户已访问该接口的次数,与最大次数对比,若等于则返回提示“今日已达访问上限”。否则该接口记录次数加一
- 缓存键设计为 {接口标识}:{year-month-day}:{服务商id}
3、开发
//下面写了主要逻辑,没有处理异常逻辑 需要小伙伴自己补充
public void limitInterface() throws Exception{
//获取套餐配置,得到客户每天能访问接口的最大次数
Integer limitNum = getLimitNum();
//key值
String key = "findData:2021-11-26:100";
//查询缓存 缓存键设计为 {接口标识}:{year-month-day}:{服务商id}
String count = (String) redisTemplate.opsForValue().get(key);
Integer countNum = Integer.valueOf(count);
if(countNum < limitNum){
//接口记录次数加一
redisTemplate.opsForValue().increment(key);
//继续执行业务逻辑
}else{
System.out.println("今日已达访问上限");
}
}
public Integer getLimitNum(){
//从缓存里面取,缓存没有再从数据库里面取(从数据库里面取出来后要更新到缓存)
return 100;
}
复制代码
(四)分布式锁
说明:使用redis的setnx命令可以实现只有一个客户端成功设置一个键值,从而实现分布式锁。
(五)session共享
说明:多台机器想要实现session共享,就需要寻找一个公共存储数据的地方,或者说能够实现数据的同步。显然,redis就可以是一个公共存储数据的地方。
(六)分布式ID生成。
说明:为了保证id的唯一性,可以让redis统一生成一批id,然后取出来使用