SpringBoot基础架构篇3(Redis)

show me the code and talk to me,作的出来更要说的明白
我是布尔bl,你的支持是我分享的动力!java

1 引入

数据库达到瓶颈,有什么解决方法。 Redis 能够很好解决这个问题。那让咱们来学习如何在 SpringBoot 使用 Redis。mysql

2 确保 redis 开启

安装步骤省略。。。具体能够参考网上教程。git

2.1 测试

telnet IP地址 端口(默认6379复制代码

2.2 开启方法

若是上面方法没有返回,须要手动开启github

  1. 找到 redis.conf 文件,配置容许访问的ip
find / -name redis.conf
复制代码
  1. 打开 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.保存退出redis

:wq
复制代码

4 . 设置本地防火墙spring

若是有防火墙: iptables(Linux上经常使用的防火墙软件)sql

iptables -I INPUT 4 -p tcp -m state --state NEW -m tcp --dport  6379 -j ACCEPT

service iptables save #保存iptables规则
复制代码

5 . 阿里云云主机数据库

若是redis放在了阿里云,须要添加安全组规则,自行百度json

  1. 最后测试
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 源码

github.com/buerbl/lear…

6 深刻一层

redis 缓存能够减轻数据库压力,有什么方法能够减轻 redis 压力呢?

答案是固然有。咱们可使用 Guava作本地缓存,减轻 redis 压力,同时加快反问速度。

固然加本地缓存也状况。单机环境下,加本地缓存比较简单,可是分布式环境下,加本地缓存,当咱们的缓存更新的时候,咱们须要额外处理其余机器的本地缓存,否则数据就一致了。咱们利用 redis的pub/sub 机制,对其余机器的本地缓存进行删除。

关注微信公众号,随时移动端阅读

公众号.jpg
相关文章
相关标签/搜索