SpringBoot基础架构篇3(Redis)
show me the code and talk to me,做的出来更要说的明白
我是布尔bl,你的支持是我分享的动力!
1 引入
数据库达到瓶颈,有什么解决方法。 Redis 可以很好解决这个问题。那让我们来学习如何在 SpringBoot 使用 Redis。
2 确保 redis 开启
安装步骤省略。。。具体可以参考网上教程。
2.1 测试
telnet IP地址 端口(默认6379)
2.2 开启方法
如果上面方法没有返回,需要手动开启
- 找到 redis.conf 文件,配置允许访问的ip
find / -name redis.conf
- 打开 redis.conf
找到 bind 127.0.0.1
改为 #bind 127.0.0.1
找到 protected-mode yes
改为 protected-mode no(redis3.2版本以后)
找到daemonize yes
改为 daemonize no
3.保存退出
:wq
4 . 设置本地防火墙
如果有防火墙: iptables(Linux上常用的防火墙软件)
iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT
service iptables save #保存iptables规则
5 . 阿里云云主机
如果redis放在了阿里云,需要添加安全组规则,自行百度
- 最后测试
telnet IP地址 端口(默认6379)
成功得到返回
3 redis 作用
我们知道 redis 可以辅助 mysql,那我们应该怎样使用这个辅助呢?我这里说的是常见的情况。当我们的数据库达到瓶颈了,这个是前提。同时是读多于写的情况,我们就可以使用 redis 了。
如今前后端交互通过 JSON 交流。基于这点,我们一般把数据转成 json ,然后再转成字符的数据格式存在 redis 里面。这里 json 是不能直接存在 redis 里面的。 因为 redis 没有 json 的数据结构。
当我们取出数据的时候,数据是一堆 json 的字符串,因此我们需要将数据转成对象,然后通 过springboot 转成 json 。
4 redis常用命令
redis 有五种数据结构
- String 字符串
- List 集合
- Set 集合
- Hash 集合
- SortedSet 集合
常见的 String 字符串使用(增查改删)
set a 'a'
get a
set a 'b'
del a
4 搭建环境
4.1 项目结构
├─java
│ └─com
│ └─example
│ └─lsbredistest
│ └─controller
│ └─entity
└─resources
├─static
└─templates
4.2 application.yml
首先我们需要配置 redis 连接的用户名密码
### redis 缓存配置
spring:
redis:
database: 0
host: ip
port: 6379
password: 123456
4.3 RedisController
核心代码
@RestController
@RequestMapping("/lsbredis")
public class RedisController {
@Resource
private StringRedisTemplate stringRedisTemplate;
@RequestMapping("/test")
public void test(){
// key : a value: a
// 增
stringRedisTemplate.opsForValue().set("a","a");
// 查
String a = stringRedisTemplate.opsForValue().get("a");
System.out.println("a的值:"+a);
// 改
stringRedisTemplate.opsForValue().set("a","b");
// 缓存一个对象
List<User> list = new ArrayList<>();
list.add(new User(1l, "c1",1, "s1"));
list.add(new User(2l, "c2",2, "s2"));
list.add(new User(3l, "c3",3, "s3"));
Gson gson = new Gson();
String toJson = gson.toJson(list);
stringRedisTemplate.opsForValue().set("user",toJson);
}
}
注入配置
不知有没有发现我们没有配置 redis 的注入。究竟 redis 的如何自动注入的?通过查找代码,我们可以发现 redis 已经通过 Springboot 自己在内部设置了。
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory)
throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
上面的代码就是 Redis 的注入配置。省去了我们再去编写代码。赞!
5 源码
https://github.com/buerbl/learnSpringboot/tree/master/lsb-redistest
6 深入一层
redis 缓存可以减轻数据库压力,有什么方法可以减轻 redis 压力呢?
答案是当然有。我们可以使用 Guava做本地缓存,减轻 redis 压力,同时加快反问速度。
当然加本地缓存也情况。单机环境下,加本地缓存比较简单,但是分布式环境下,加本地缓存,当我们的缓存更新的时候,我们需要额外处理其他机器的本地缓存,不然数据就一致了。我们利用 redis的pub/sub 机制,对其他机器的本地缓存进行删除。
关注微信公众号,随时移动端阅读
原文地址:https://www.cnblogs.com/chenzhuantou/p/12171532.html
- Protocol Buffers的应用
- WordPress 显示数据库查询次数、查询时间及内存占用的代码
- WCF服务在高负载下可能会变慢
- WordPress 后台管理菜单名称重命名的方法
- 从Akismet 黑名单中洗白的方法
- 移除除管理员之外的其他用户的WordPress 更新升级提示
- 为 WordPress 后台管理菜单自定义排序
- WordPress 添加个性化的博客宠物(妹纸篇)
- WordPress 添加个性化的博客宠物(汉纸篇)
- WordPress 退出(登出)的时候跳转到首页
- WordPress免插件仅代码实现面包屑导航
- 开源的作业调度框架 - Quartz.NET
- Windows Server 2003网络负载均衡的实现
- 使用 ETW 对 .NET 应用程序进行性能诊断
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 详解Laravel服务容器的绑定与解析
- 修改Laravel自带的认证系统的User类的命名空间的步骤
- PHP使用递归按层级查找数据的方法
- Laravel6.2中用于用户登录的新密码确认流程详解
- PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
- 浅谈PHP array_search 和 in_array 函数效率问题
- 仿抖音短视频APP源码,实现简单的换头像并保存
- php实现JWT(json web token)鉴权实例详解
- laravel实现上传图片,并且制作缩略图,按照日期存放的代码
- 在Laravel中使用MongoDB的方法示例
- 基于thinkphp6.0的success、error实现方法
- Yii框架模拟组件调用注入示例
- 解决laravel 表单提交-POST 异常的问题
- laravel5.0在linux下解决.htaccess无效和去除index.php的问题
- laravel返回统一格式错误码问题