本篇文章为你整理了SpringBoot(七)(springboot七牛云)的详细内容,包含有springboot七大组件 springboot七牛云 springboot七日签到补签 SpringBoot(七),希望能帮助你了解 SpringBoot(七)。
get key
如果key还没有,获取为(nil),代表key没有被使用,如果key存在,可以获取对应key的值
exists key
判断某个key是否存在,返回Integer值1 代表存在,如果 exists car2 则返回0,不存在
getrange key 起始位置 结束位置
获取指定区间内的值,类似between。。。and的关系,起始位置为0,结束位置为-1 就是返回所有
setnx key value
只有在 key 不存在时,才会设置 key 的值,如果已经存在了,不覆盖,设置不了;
setnx key value
如果返回0 代表没有设置成功,key对应值已经存在,如果返回1代表设置成功;这个就是redis的分布式锁命令,很重要;
msetnx key1 val1 key2 val2 .....
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在
lindex key index
按照索引下标获得元素(从左到右,左下标从0开始,如果是-1代表最后一个,-2代表倒数第二个)
lrem key 个数 具体的值
从左往右删除指定个数等于具体值的元素,返回的值为实际删除的数量,个数0,表示删除全部给定的值
如果值全移除,对应的键也就消失了;
链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了;
1.3 集合-set
srandmember key 某个整数
如果写的值是负数,比如-3 ,表示需要取出3个,但是可能会有重复值。
1.5 有序集合-zset
在set基础上,加一个score值。之前set是k1 v1 v2 v3,现在zset是k1 score1 v1 score2 v2;
zrange key 0 -1 [withscores]
zrange zset1 0 -1 ,结果为所有的值,不带分数;如:zrange zset1 0 -1 ,结果为所有的值,不带分数
zrangebyscore zset1 10 50 limit 2 2
limit 结果的起始下标,获取的个数;limit 含义是限制获取的条数,相当于mysql的分页;
groupId org.springframework.boot /groupId
artifactId spring-boot-starter-data-redis /artifactId
/dependency
2.2 redis配置
#端口号
server:
port: 8096
# redis配置
spring:
redis:
host: 127.0.0.1 #如果是redis远程服务器,此处redis服务器ip地址
port: 6379 #默认端口
# database: 0 #指定redis数据库,默认是0
# password: # 密码有就写,没有就省略
2.3 SpringBoot框架自动配置的redisTemplate
2.3.1 清空数据库
//自动装配 SpringBoot框架自动配置的redisTemplate
@Autowired
private RedisTemplate Object,Object redisTemplate;
//基于SpringBoot框架自动配置的redisTemplate,操作redis缓存
//获取连接
RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
//清空数据库中的所有数据
log.info("清空数据库中的所有数据");
connection.flushDb();
2.3.2 添加数据
//程序中,添加数据据到redis
log.info("------ 基于SpringBoot框架自动配置的redisTemplate 添加数据 ------");
redisTemplate.opsForValue().set("kh96_class_name","KGC_KH96");
redisTemplate.opsForValue().set("student_num",19);
2.3.3 获取数据
//程序中,从redis获取数据
log.info("------ 基于SpringBoot框架自动配置的redisTemplate 获取数据 ------");
log.info("****** 根据 班级的key:{},获取班级名称:{} ******","kh96_class_name",redisTemplate.opsForValue().get("kh96_class_name"));
log.info("****** 根据 班级的key:{},获取班级人数:{} ******","student_num",redisTemplate.opsForValue().get("student_num"));
2.3.4 修改值 (出现错误)
//程序中,基于SpringBoot框架自动配置的redisTemplate,操作redis缓存,存在问题
//场景:对班级人数进行增减操作,比如将班级人数,增加10
log.info("------ 基于SpringBoot框架自动配置的redisTemplate 操作数据 ------");
redisTemplate.opsForValue().increment("student_num",10);
//直接报错,会报500异常: redis.clients.jedis.exceptions.JedisDataException: ERR value is not an integer or out of range
//原因,通过系统默认的 redisTemplate,存放key和value值时,会自动使用Object类的序列化和反序列化,导致redis中真实存放的数据不是原始值,而是序列化后的值
数据结果:
2.4 自定义redisTemplate
2.4.1 fastjson 依赖
dependency
groupId com.alibaba /groupId
artifactId fastjson /artifactId
version 1.2.62 /version
/dependency
2.4.2 自定义redisTemplate 配置类
//Redis自定义配置类,实现一个自定义序列化方式的 redisTemplate,提缓缓掉默认自动配置的 redisTemplate,实现String类型任意类型的value
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate String, Object redisTemplate(RedisConnectionFactory redisConnectionFactory) {
// 自定义redisTemplate的模板对象
RedisTemplate String, Object template = new RedisTemplate ();
// 设置连接工厂
template.setConnectionFactory(redisConnectionFactory);
//由于要通过程序操作远程的redis数据库,必须支持序列化,才可以让程序中的数据,在网络中传输
//定义String类型的序列化方式
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// 定义fastjson序列化方式,可以序列化任何对象
FastJsonRedisSerializer Object fastJsonRedisSerializer = new FastJsonRedisSerializer (Object.class);
// 需改为新的序列化方式
template.setKeySerializer(stringRedisSerializer);
template.setValueSerializer(fastJsonRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
template.setHashValueSerializer(fastJsonRedisSerializer);
// 初始化为新的模板
template.afterPropertiesSet();
return template;
2.4.3 使用自定义redisTemplate 重新操作数据
//自动装配自定义 redisTemplate
@Autowired
private RedisTemplate String,Object redisTemplate;
//其他代码不变
操作结果:
2.5 自定义redisUtils工具类
2.5.1 自定义redisUtils工具类
--- RedisUtil 工具类
2.5.2 使用自定义redisTemplate和redisUtils工具类
@GetMapping("/testRedisUtils")
public String testSpringBootRedisUtils(){
//基于自定义的redisTemplate 和 RedisUtils 工具类,操作redis缓存
//程序中,添加数据据到redis
log.info("------ 基于自定义的redisTemplate 和 RedisUtils 工具类 添加数据 ------");
redisUtils.set("kh96_class_name_utils","KGC_KH96");
redisUtils.set("student_num_utils",19);
//程序中,从redis获取数据
log.info("------ 基于自定义的redisTemplate 和 RedisUtils 工具类 获取数据 ------");
log.info("****** 根据 班级的key:{},获取班级名称:{} ******","kh96_class_name_utils",redisUtils.get("kh96_class_name_utils"));
log.info("****** 根据 班级的key:{},获取班级人数:{} ******","student_num_utils",redisUtils.get("student_num_utils"));
//程序中,基于SpringBoot框架自动配置的redisTemplate,操作redis缓存
//场景:对班级人数进行增减操作,比如姜班级人数,增加10
log.info("------ 基于自定义的redisTemplate 和 RedisUtils 工具类 操作数据 ------");
redisUtils.incr("student_num_utils",10);
return "工具类 RedisUtils 操作 redis 成功!";
2.5.3 程序中如何存放对象到 redis
核心思想:一般都是姜对象转换为json字符串,存入redis,获取对象数据,就先获取json字符串,再转换为对应对象即可;
@GetMapping("/testRedisUtils")
public String testSpringBootRedisUtils(){
//程序中如何存放对象到 redis
//核心思想:一般都是姜对象转换为json字符串,存入redis,获取对象数据,就先获取json字符串,再转换为对应对象即可
//模拟用户登录成功后,将用户信息存入redis中,方便后续从redis中获取用户信息
User loginUser = User.builder().userId(1001).userName("KH96").userTel("135012030404").build();
//直接将对象存入redis即可
log.info("------ 基于自定义的redisTemplate 和 RedisUtils 工具类 存储对象 ------");
//自动把实体,通过fastjson的序列化方式,转发为JSON字符串存储
redisUtils.set(loginUser.getUserId().toString(),loginUser);
//模拟获取登录用户信息,直接从redis获取存入的JSON字符串,转换为目标用户对象
User realUser = JSON.parseObject(redisUtils.get(loginUser.getUserId().toString()).toString(),User.class);
log.info("------ 基于自定义的redisTemplate 和 RedisUtils 工具类获取对象:{} ",realUser);
return "工具类 RedisUtils 操作 redis 成功!";
数据结果:
3.1 题目要求
实现商品评论点赞功能,要限制次数
1)功能:商品评论点赞,只能有一个接口,第一次请求是增加点赞,第二次请求就是取消点赞
2)限制:使用redis增加操作限制,点赞不能太频繁,比如:限制5s内最多点击4次,如果没有超出限制,可以正常操作,如果超出限制,返回提示:操作过于频繁,请稍后重试!
统一使用map做返回结果,内容必须包含:code:状态码,自定义,msg: success/fail,data:返回的数据内容
比如:获取验证码返回:
"code": 200,
"msg": "success",
"data": "手机号:xxxx,验证码:xxxx"
3.2 代码
/**
* @author : huayu
* @date : 19/10/2022
* @param : []
* @return : java.util.Map java.lang.String,java.lang.Object
* @description : 点赞操作
* 第一次请求是增加点赞,第二次请求就是取消点赞
* 限制5s内最多点击4次,如果没有超出限制,可以正常操作,如果超出限制,返回提示:操作过于频繁,请稍后重试!
@GetMapping("/praise")
public Map String,Object praise(){
Map String,Object reMsg = new HashMap ();
reMsg.put("code","200");
reMsg.put("msg","success");
//判断是不是第一次点击
if(redisUtils.get("praiseFlag") == null){
//第一点击, 设置 praiseFlag
redisUtils.set("praiseFlag",0);
//判断 是否有五秒限制
if(redisUtils.get("time") == null){
//第一次点击,或已经超过5秒
//添加 记录点击 次数
redisUtils.set("time",1,5);
}else {
//5秒内的操作
//判断 5秒中点击的次数 等于 4
if((Integer)redisUtils.get("time") == 4){
reMsg.put("code","500");
reMsg.put("msg","fail");
reMsg.put("data","操作过于频繁,请稍后重试!");
//返回信息
return reMsg;
}else {
//5秒内的 点击次数没有大于4次
redisUtils.incr("time",1);
//判断上一次是点赞还是取消点赞
if((Integer)redisUtils.get("praiseFlag") == 1){
//取消点赞操作
redisUtils.set("praiseFlag",0);
reMsg.put("data", "取消点赞成功!");
}else {
//点赞操作
redisUtils.set("praiseFlag",1);
reMsg.put("data", "点赞成功!");
//返回信息
return reMsg;
3.3 测试结果
3.3.1 第一次点击(五秒内)
3.3.2 第二次点击(五秒内)
3.3.3 第三次点击(五秒内)
3.3.4 第四次点击(五秒内)
3.3.5 第五次点击(五秒内)
4、浏览记录 练习
4.1 请求方法
@Autowired
RedisTemplate String,Object redisTemplate;
// 浏览记录,最新的浏览记录放在上面,最多展示10个,使用zset做,搜索关键字的score值使用日期毫秒,倒叙
@GetMapping("/addtHistory")
public RequestResult Set Object addtHistory(String uId,String pId){
//获取zset操作对象
ZSetOperations String, Object opsForZSet = redisTemplate.opsForZSet();
//放入记录
opsForZSet.add(uId,pId,System.currentTimeMillis());
Set Object historySet = null;
//获取记录数量
int historiesCount = opsForZSet.size(uId).intValue();
//判断否有10个记录
if(historiesCount = 10) {
historySet = opsForZSet.reverseRange(uId,0, 9);
return ResultBuildUtil.success(historySet);
}else {
historySet = opsForZSet.rangeByScore(uId, 0, historiesCount);
return ResultBuildUtil.success(historySet);
4.2 测试结果:
以上就是SpringBoot(七)(springboot七牛云)的详细内容,想要了解更多 SpringBoot(七)的内容,请持续关注盛行IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。