SpringBoot整合Redis使用教程

SpringBoot整合Redis使用教程redis 在 springboot 中的简单使用

作者平台:

| CSDN:https://blog.csdn.net/_

| 掘金:https://juejin.cn/user/0686

| 知乎:https://www.zhihu.com/people/1024-paper-96

| GitHub:https://github.com/JiangXia-1024?tab=repositories

| 微信公众号:1024笔记

本文大约5260字,预计阅读时长11分钟

前言

Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:

1、基于内存运行,性能高效

2、支持分布式,理论上可以无限扩展

3、key-value存储系统

4、开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

5、单进程单线程模型

6、丰富的数据类型

7、操作具有原子性

8、持久化

9、高并发读写

Redis越来越受欢迎,也有越来越多的公司加入了Redis的使用大军中,今天就简单说说Springboot如何集成Redis。

本文的代码的前提是SpringBoot开发Restful风格的接口实现CRUD功能项目的代码,具体可以参考之前的文章,代码源码下载地址在文章的最后!

正文

SpringBoot集成Redis的第一步首先需要在本地下载安装好Redis,关于Redis的安装和使用可以参考之前的文章:分布式缓存中间件Redis入门。

如果已经在准备好所有的上述步骤之后,我们需要在pom文件中加入redis依赖,如下:

<!--集成redis依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 

加入Redis的依赖之后,还需要在配置文件application.yml中加入redis的相关配置,具体如下:

#redis配置 redis: #redis数据库索引(默认为0) database: 0 #redis服务器地址 host: 127.0.0.1 #redis端口 post: 6379 #Redis服务器连接密码(默认为空) password: pool: # 连接池最大连接数(使用负值表示没有限制) max-active: 200 # 连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1 # 连接池中的最大空闲连接 max-idle: 10 # 连接池中的最小空闲连接 min-idle: 0 # 连接超时时间毫秒 timeout: 1000 

接着就是真正的代码部分,需要写一个redis的工具类用于处理redis的数据,比如判断是否存在某个key,设置缓存时间等等,这些其实redis都已经有了具体的对应方法,这里是对其进行一个简单的封装处理,具体代码如下:

@Service public class RedisUtil { @Autowired private RedisTemplate redisTemplate; / * 写入缓存 * @param key * @param value * @return */ public boolean set(final String key, Object value) { boolean result = false; try { ValueOperations<Serializable, Object> 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 ,TimeUnit timeUnit) { boolean result = false; try { ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); operations.set(key, value); redisTemplate.expire(key, expireTime, timeUnit); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } / * 批量删除对应的value * @param keys */ public void remove(final String... keys) { for (String key : keys) { remove(key); } } / * 批量删除key * @param pattern */ public void removePattern(final String pattern) { Set<Serializable> keys = redisTemplate.keys(pattern); if (keys.size() > 0){ redisTemplate.delete(keys); } } / * 删除对应的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<Serializable, Object> 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<String, Object, Object> hash = redisTemplate.opsForHash(); hash.put(key,hashKey,value); } / * 哈希获取数据 * @param key * @param hashKey * @return */ public Object hmGet(String key, Object hashKey){ HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); return hash.get(key,hashKey); } / * 列表添加 * @param k * @param v */ public void lPush(String k,Object v){ ListOperations<String, Object> list = redisTemplate.opsForList(); list.rightPush(k,v); } / * 列表获取 * @param k * @param l * @param l1 * @return */ public List<Object> lRange(String k, long l, long l1){ ListOperations<String, Object> list = redisTemplate.opsForList(); return list.range(k,l,l1); } / * 集合添加 * @param key * @param value */ public void add(String key,Object value){ SetOperations<String, Object> set = redisTemplate.opsForSet(); set.add(key,value); } / * 集合获取 * @param key * @return */ public Set<Object> setMembers(String key){ SetOperations<String, Object> set = redisTemplate.opsForSet(); return set.members(key); } / * 有序集合添加 * @param key * @param value * @param scoure */ public void zAdd(String key,Object value,double scoure){ ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); zset.add(key,value,scoure); } / * 有序集合获取 * @param key * @param scoure * @param scoure1 * @return */ public Set<Object> rangeByScore(String key,double scoure,double scoure1){ ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); return zset.rangeByScore(key, scoure, scoure1); } } 

最后就是改造一下之前的一个controller接口方法,是一个根据用户名查询用户信息的接口,具体如下:

 //根据用户名查询数据 @RequestMapping(value = "/user", method = RequestMethod.GET) public User findByUserName(@RequestParam(value = "userName", required = true) String userName) { System.out.println("根据用户名查询数据:"); //判断缓存是否存在 boolean hasKey = redisUtil.exists(userName); if(hasKey){ logger.info("==========通过redis缓存获取信息================"); //获取缓存 Object object = redisUtil.get(userName); return (User) object; }else{ //查询数据库,并且存入缓存 logger.info("==========通过数据库查询信息并且存入redis================"); User user = userService.findUserByName(userName); //数据插入缓存(set中的参数含义:key值,user对象,缓存存在时间10(long类型),时间单位) redisUtil.set(userName,user,10L, TimeUnit.MINUTES); return user; } } 

测试

接着就是测试验证部分,首先启动Redis,然后使用RedisDesktopManagerRedis工具可以发现本地的Redis数据库中是没有任何数据:

图片

图片

然后我们在浏览器中输入链接地址,调用上面的根据用户名查询用户信息的接口,

图片

可以发现控制台打印了以下的日志内容:

图片

然后重新刷新redis数据库,发现数据已经存进来了:

图片

再在浏览器中刷新页面,重新调用一遍上述接口,查看控制台的日志信息如下,可以发现这次调用接口数据查询是通过Redis缓存信息进行查询,不再是连接本地MySQL数据库进行数据查询了。

图片

总结

通过以上步骤则就能够简单的进行Springboot整合Redis进行开发了,Redis的使用其实比较简单,主要的一些操作部分就在RedisUtil这个类中。

有任何问题欢迎交流讨论,一起学习!

最后本文的源码在:

https://github.com/JiangXia-1024/SpringBootWorkSpace

相关推荐:

  • Springboot+Vue整合笔记【超详细】
  • Spring Boot开发图片上传并添加水印接口
  • SpringBoot整合ElasticSearch实战
  • SpringBoot开发Restful风格的接口实现CRUD功能
  • SpringBoot整合JPA进行数据访问
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231362.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm没有卸载干净怎么办_pycharm怎么保存为py文件

    pycharm没有卸载干净怎么办_pycharm怎么保存为py文件卸载pycharm的时候提示有文件正在被占用,解决方案是任务管理器

    2022年8月28日
    6
  • Esp8266进阶之路⑨ 【小实战上篇】Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。(带Demo)「建议收藏」

    Esp8266进阶之路⑨ 【小实战上篇】Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。(带Demo)「建议收藏」本系列博客学习由非官方人员半颗心脏潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。1、Esp8266之搭建开发环境,开始一个“hellowworld”串口打印。2、Esp8266之利用GPIO开始使用按钮点亮你的“第一盏灯”。3、Esp8266之利用“软件定时器”定时0.5秒闪烁点亮一盏LED。4、Esp8266之了解P

    2022年5月28日
    35
  • html二级菜单的创建[通俗易懂]

    html二级菜单的创建[通俗易懂]二级菜单用的是无序列表嵌套,:hover鼠标悬浮其上方发生的事<!DOCTYPEhtml><html> <head> <metacharset=”utf-8″/> <title></title> <styletype=”text/css”> *{margin:0; …

    2022年6月9日
    28
  • AngularJS学习

    AngularJS学习AngularJS什么是AngularJS?AngularJS使得开发现代的单一页面应用程序(SPAs:SinglePageApplications)变得更加容易。AngularJS把应用程序数据绑定到HTML元素。AngularJS可以克隆和重复HTML元素。AngularJS可以隐藏和显示HTML元素。AngularJS可以在HTML元素”背后”添加代码

    2022年7月25日
    7
  • 寻找最长回文子串

    寻找最长回文子串最长回文子串的问题描述:给出一个字符串S,求S的最长回文子串的长度。样例:字符串”PATZJUJZTACCBCC”的最长回文子串为“ATZJUJZTA”,长度为9。先看暴力解法:枚举子串的两个端点i和j,判断在i,区间内的子串是否回文。从复杂度上来看,枚举端点需要O(n2),判断回文需要O(n),因此总复杂度是O(n3)。介绍动态规划的方法,使用动态规划可以达到…

    2022年5月22日
    41
  • hackbar 使用教程_hackbar简单安装使用教程

    hackbar 使用教程_hackbar简单安装使用教程安装hackbar:在火狐的附加组件中搜索“hackbar”,将它添加到火狐浏览器中,重启后Firefox后安装完成,按F9键打开我们就会看到在地址栏下面会出现一个大框框就是hackbar了框框很大碍事怎么办?简单啊F9试试首先先介绍横向第一排的下拉框:INT、HEX、OCT、Alphabet、AlNum分别代表了整数、十六进制、八进制、字母表、所有。假设你的输入框中有a这个字符,然后你将…

    2022年6月4日
    648

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号