SpringBoot系列:Springboot整合redis,实现从缓存中读取数据

您所在的位置:网站首页 前端缓存数据库 SpringBoot系列:Springboot整合redis,实现从缓存中读取数据

SpringBoot系列:Springboot整合redis,实现从缓存中读取数据

2024-07-13 21:21| 来源: 网络整理| 查看: 265

文章目录 生命不息,战斗不止,继续整合redis,奥力给。1、在pom.xml文件中添加依赖2、在application.yml文件中添加redis配置信息3、新建RedisUtils工具类4、编写StudentRedisController类5、启动程序6、测试普通数据7、打开RedisDesktopManager查看数据是否插入成功8、插入前的数据9、在地址栏输入http://localhost:8080/redisAllStudent

生命不息,战斗不止,继续整合redis,奥力给。

  新建项目工程就不再演示,在整合mybatis的时候已经给出了.   链接地址在这里~Springboot整合mybatis   代码在文末给出

1、在pom.xml文件中添加依赖

 基于上篇文章的,其实也就是多了redis的依赖和缓存依赖罢了

org.springframework.boot spring-boot-starter-cache redis.clients jedis 3.1.0 org.springframework.boot spring-boot-starter-data-redis 2、在application.yml文件中添加redis配置信息

这里的host、password就是redis的服务器地址和密码,没有密码的话是可以不用设置了。

#设置redis服务器 redis: host: #redis的服务器地址 password: #设置密码 jedis: pool: max-active: 8 max-wait: -1 max-idle: 500 min-idle: 0 lettuce: shutdown-timeout: 30000 3、新建RedisUtils工具类

在这里插入图片描述

代码如下,借鉴于网上的例子:

@Service public class RedisUtils { @Autowired private RedisTemplate redisTemplate; private static double size = Math.pow(2, 32); /** * 写入缓存 * * @param key * @param offset 位 8Bit=1Byte * @return */ public boolean setBit(String key, long offset, boolean isShow) { boolean result = false; try { ValueOperations operations = redisTemplate.opsForValue(); operations.setBit(key, offset, isShow); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } /** * 写入缓存 * * @param key * @param offset * @return */ public boolean getBit(String key, long offset) { boolean result = false; try { ValueOperations operations = redisTemplate.opsForValue(); result = operations.getBit(key, offset); } catch (Exception e) { e.printStackTrace(); } return result; } /** * 写入缓存 * * @param key * @param value * @return */ public boolean set(final String key, Object value) { boolean result = false; try { ValueOperations operations = redisTemplate.opsForValue(); operations.set(key, value); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } /** * 写入缓存设置时效时间 * * @param key * @param value * @return */ public boolean set(final String key, Object value, Long expireTime) { boolean result = false; try { ValueOperations operations = redisTemplate.opsForValue(); operations.set(key, value); redisTemplate.expire(key, expireTime, TimeUnit.SECONDS); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } /** * 批量删除对应的value * * @param keys */ public void remove(final String... keys) { for (String key : keys) { remove(key); } } /** * 删除对应的value * * @param key */ public void remove(final String key) { if (exists(key)) { redisTemplate.delete(key); } } /** * 判断缓存中是否有对应的value * * @param key * @return */ public boolean exists(final String key) { return redisTemplate.hasKey(key); } /** * 读取缓存 * * @param key * @return */ public Object get(final String key) { Object result = null; ValueOperations operations = redisTemplate.opsForValue(); result = operations.get(key); return result; } /** * 哈希 添加 * * @param key * @param hashKey * @param value */ public void hmSet(String key, Object hashKey, Object value) { HashOperations hash = redisTemplate.opsForHash(); hash.put(key, hashKey, value); } /** * 哈希获取数据 * * @param key * @param hashKey * @return */ public Object hmGet(String key, Object hashKey) { HashOperations hash = redisTemplate.opsForHash(); return hash.get(key, hashKey); } /** * 列表添加 * * @param k * @param v */ public void lPush(String k, Object v) { ListOperations list = redisTemplate.opsForList(); list.rightPush(k, v); } /** * 列表获取 * * @param k * @param l * @param l1 * @return */ public List lRange(String k, long l, long l1) { ListOperations list = redisTemplate.opsForList(); return list.range(k, l, l1); } /** * 集合添加 * * @param key * @param value */ public void add(String key, Object value) { SetOperations set = redisTemplate.opsForSet(); set.add(key, value); } /** * 集合获取 * * @param key * @return */ public Set setMembers(String key) { SetOperations set = redisTemplate.opsForSet(); return sembers(key); } /** * 有序集合添加 * * @param key * @param value * @param scoure */ public void zAdd(String key, Object value, double scoure) { ZSetOperations zset = redisTemplate.opsForZSet(); zset.add(key, value, scoure); } /** * 有序集合获取 * * @param key * @param scoure * @param scoure1 * @return */ public Set rangeByScore(String key, double scoure, double scoure1) { ZSetOperations zset = redisTemplate.opsForZSet(); redisTemplate.opsForValue(); return zset.rangeByScore(key, scoure, scoure1); } //第一次加载的时候将数据加载到redis中 public void saveDataToRedis(String name) { double index = Math.abs(name.hashCode() % size); long indexLong = new Double(index).longValue(); boolean availableUsers = setBit("availableUsers", indexLong, true); } //第一次加载的时候将数据加载到redis中 public boolean getDataToRedis(String name) { double index = Math.abs(name.hashCode() % size); long indexLong = new Double(index).longValue(); return getBit("availableUsers", indexLong); } /** * 有序集合获取排名 * * @param key 集合名称 * @param value 值 */ public Long zRank(String key, Object value) { ZSetOperations zset = redisTemplate.opsForZSet(); return zset.rank(key,value); } /** * 有序集合获取排名 * * @param key */ public Set zRankWithScore(String key, long start,long end) { ZSetOperations zset = redisTemplate.opsForZSet(); Set ret = zset.rangeWithScores(key,start,end); return ret; } /** * 有序集合添加 * * @param key * @param value */ public Double zSetScore(String key, Object value) { ZSetOperations zset = redisTemplate.opsForZSet(); return zset.score(key,value); } /** * 有序集合添加分数 * * @param key * @param value * @param scoure */ public void incrementScore(String key, Object value, double scoure) { ZSetOperations zset = redisTemplate.opsForZSet(); zset.incrementScore(key, value, scoure); } /** * 有序集合获取排名 * * @param key */ public Set reverseZRankWithScore(String key, long start,long end) { ZSetOperations zset = redisTemplate.opsForZSet(); Set ret = zset.reverseRangeByScoreWithScores(key,start,end); return ret; } /** * 有序集合获取排名 * * @param key */ public Set reverseZRankWithRank(String key, long start, long end) { ZSetOperations zset = redisTemplate.opsForZSet(); Set ret = zset.reverseRangeWithScores(key, start, end); return ret; } } 4、编写StudentRedisController类

  里面就是本人测试了redis缓存数据写入读取是否成功,在这里我将学生类的信息缓存到redis数据库是用的json格式,所以这里记得导入fastjson依赖

com.alibaba fastjson 1.2.73

  

StudentRedisController代码如下:

package top.weidaboy.controller; import com.alibaba.fastjson.JSON; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import top.weidaboy.entities.Student; import top.weidaboy.service.IStudentService; import top.weidaboy.utils.RedisUtils; import java.util.List; /** * string数据类型 * 应用场景: 秒杀商品/点赞 * * hash数据类型 * 实际应用场景:电商网站中的商品详细信息 * * list数据类型 * 应用场景: 商品的评论表 * * set数据类型 * 应用场景: 微信朋友查看权限 /独立IP投票限制 * * zset数据类型 * 应用场景: 商品的销售排行榜 */ @RestController public class StudentRedisController { @Autowired private RedisUtils redisUtils; @Autowired private IStudentService studentService; @GetMapping("setAndget/{k}&{v}") public String setAndget(@PathVariable("k")String k , @PathVariable("v")String v){ redisUtils.set(k,v); return (String)redisUtils.get(k); } @GetMapping("findReidsStudent/{id}") public String setAndget(@PathVariable("id")Integer id){ Student studentById = null; //第一步先去判断缓存中是否存在这个学生,如果不存在就从数据库拿 String stukey = (String) redisUtils.get("stu"+id); if(stukey == null){ System.out.println("正在从数据库单独提取对应ID学生信息"); //第二步从数据库中提取对应的学生信息 studentById = studentService.findStudentById(id); if(studentById != null) redisUtils.set("stu"+id,studentById.toString()); else return "noStudent"; return (String) redisUtils.get("stu"+id); } System.out.println("正在从redis单独提取对应ID学生信息"); return (String) redisUtils.get("stu"+id); } @GetMapping("redisAllStudent") public String redisAllStudent(){ //第一步,先是获取到缓存数据中学生列表信息 String stuListCacheKey = (String) redisUtils.get("stuListCache"); //第二步,判断缓存数据中是否有值,没有值的情况下就从数据库中拿值。 if(stuListCacheKey == null){ System.out.println("从数据库中初始化所有学生数据...."); List allStudents = studentService.findAllStudents(); //第三步,如果遍历到的数据信息不为空,则刷新redis缓存 if(allStudents != null){ //添加学生列表 //将学生了列表信息转换为json格式 redisUtils.set("stuListCache", JSON.toJSONString(allStudents)); return (String) redisUtils.get("stuListCache"); } return "noStudent"; } //第四步 如果不为空,直接返回json格式的学生信息 System.out.println("正在从redis数据库中获取所有学生数据...."); return (String) redisUtils.get("stuListCache"); } } 5、启动程序

  在程序启动前,先去启动类添加@EnableCaching //开启缓存机制    开启缓存机制

6、测试普通数据

在地址栏输入http://localhost:8080/setAndget/k=test&v=testRedis 页面返回: 在这里插入图片描述

7、打开RedisDesktopManager查看数据是否插入成功

在这里插入图片描述

  以上测试就是简单的整合了redis,确认了我的Springboot项目能往redis数据库中添加数据,接下来就要测试是否支持缓存数据的读取,以及当redis无用户想要查询数据时候,使用mybatis向数据库发出数据查询操作,并显示数据出来,下一次查询同样数据,直接向redis缓存中读取数据。

8、插入前的数据

在这里插入图片描述

9、在地址栏输入http://localhost:8080/redisAllStudent

  页面返回数据: 在这里插入图片描述   console控制台打印数据:可以知道,第一次是从数据库提取的数据的,redis数据库是还没有学生列表信息的 在这里插入图片描述   再看看redis数据库里面是否有刚刚插入的数据信息: 在这里插入图片描述 成功插入!

  那么再次刷新该页面,控制台打印显示信息,我们能明显感受到页面刷新的速度比第一次快了很多,数据能正常显示。将程序重启,redis数据库上的数据只要持久化,我们照样能直接访问redis数据库的数据,而不用去访问我们数据库的信息了。 在这里插入图片描述

查询单个学生信息也是一样的 在地址栏输入自己要查询的学生学号: http://localhost:8080/findReidsStudent/1 在这里插入图片描述 控制台信息: 在这里插入图片描述

  简单总结一下,学习不总结,就等于白学,虽然内容排版还是稚嫩,但是总胜过啥也不做都好,继续加油把!代码已经共享,有需要的小伙伴注意修改就可以使用,不足之处多请交流!!!

----------------------------Vinda的Github代码------------------------



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3