SpringBoot(七)(springboot七牛云)

  本篇文章为你整理了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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: