第8章 Redis

作者: 王林 | 来源:发表于2018-11-12 13:33 被阅读0次

8.1 缓存

前端发来请求,服务器从数据库读取数据返回给前端,一个完整的交互流程就完成了。但是如果有一个请求,在一段时间内每次从数据库取回的结果都一样,这个请求并发量增大之后,每次都连接数据库查询就对数据库造成了很多无谓的性能消耗,这种情况下就适合用缓存解决。第一次请求将数据库查询的结果缓存起来,在一段时间内只要是同样的请求就直接返回结果,这样就不需要再去查询数据库,降低数据库压力。缓存过期之后则查询数据库,然后再缓存结果。

什么样的请求适合用缓存,什么情况不适合用缓存呢?这就需要根据具体情况分析,基本规则是请求频繁且结果变化不频繁的适合用缓存。比如对实时性结果要求高的情况就不适合,或者每个用户的返回结果都不一样时也不适合。发送短信验证码很适合用缓存,因为短信验证码一般要求60秒内不允许重新发送,可以把手机号码和验证码缓存起来,请求先从缓存里查找,如果缓存中存在该手机号则直接取出结果对比,不存在则调用发送短信的接口发送验证码然后缓存。

8.2 云数据库Redis

创建Redis实例

管理控制台 > 产品与服务 > 云数据库Redis版 > 创建实例

6-18.jpg 6-19.jpg

连接Redis

创建完实例之后在实例信息里找到连接信息一栏,设置白名单之后就可以看到连接信息。阿里云Redis默认只允许VPC内访问,所以我们登录到服务器上操作。登录服务器并确保服务器安全组规则里已经添加6379端口,通过命令连接:

redis-cli -h r-*.redis.rds.aliyuncs.com -a password

Redis基础

Redis是一个基于内存Key-Value的数据库,Key值是字符串,Value值可以是字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

DEL key01# 删除一个键

EXPIRE key01 60# key01缓存60秒

PUT key01 string01#设置键key01的值是字符串类型

GET key01#获取key01的值

HMSET key02 name "Jack" age 18#设置键key02的值是Hash类型

HGET key02 age#获取key02的字段age的值

LPUSH key03 redis;LPUSH key03 mongo#key03的值是List类型

LRANGE key03 0 10#获取key03制定范围内的元素

SADD key04 redis;SADD key04 redis#key04值是Set类型

SMEMBERS key04#获取key04集合中的所有元素

Redis集成

在我们的starter项目里集成Redis,在pom.xml添加依赖

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

新增RedisHelper:

package cn.mx.starter.util;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.springframework.stereotype.Component;

import redis.clients.jedis.Jedis;

@Component
public class RedisHelper {

    private Jedis jedis;
    
    @PostConstruct
    public void init() {
        jedis = new Jedis("r-*.redis.rds.aliyuncs.com", 6379);
        jedis.auth("password");
        jedis.connect();
    }
    
    @PreDestroy
    public void destroy() {
        jedis.close();
    }
    
    public Jedis getJedis() {
        return jedis;
    }

}

在IndexController里演示如何调用Jedis:

@Autowired
RedisHelper redisHelper;

@GetMapping("/users/cache")
private String cache() {
    Jedis jedis = redisHelper.getJedis();
    String name = jedis.get("user");
    if (name != null) {
        return name;
    }
    User user = userRepository.findById(1L).orElse(null);
    if (user != null) {
        name = user.getName();
        jedis.set("user", name);
        jedis.expire("name", 60);
    }
    return name;
}

将项目打包并上传到服务器59.110.173.162上,并确保服务器安全组规则里已经添加6379端口,重新加载项目,访问 http://dev.mxxx.cn/users/cache,接口从数据库查询数据,把user作为Key和他的name作为Value存入Redis,在60秒内访问该链接则直接从Redis缓存取出数据返回。

相关文章

  • Redis-5.x

    第1章 关系型与非关系型 第2章 Redis重要特性 AK47 第3章 redis应用场景 第4章 Redis安装...

  • Redis-V2版

    第1章 关系型与非关系型 第2章 Redis重要特性 AK47 第3章 redis应用场景 第4章 Redis安装...

  • 淘宝技术架构文档:Redis+多线程+kafka+Nginx+数

    Redis实战核心篇 第1章 初识Redis 第2章 使用Redis构建Web应用 第二部分核心概念 第3章 Re...

  • Redis集群搭建

    第1集 Redis集群搭建这回事 简介:Redis集群搭建实战,赠送Redis图文搭建教程 安装redis处理步骤...

  • Redis 第10章 Redis Cluster

    第10章 Redis Cluster 引入集群问题:容量不够,redis如何进行扩容?并发写操作, redis...

  • 《Redis设计与实现》

    《Redis设计与实现》 作者 黄健宏 1.1 Redis版本说明 第 2 章【简单动态字符串】、第4-5章【字典...

  • Redis

    第1章 Redis介绍 1.1 Redis是什么 Redis是一种基于键值对的NoSQL数据库,与很多键值对数据库...

  • Redis

    第1章 Redis介绍 1.1 Redis是什么 Redis是一种基于键值对的NoSQL数据库,与很多键值对数据库...

  • Redis的Linux系统优化

    文章转载自《Redis开发与运维》第12章 通常来看,Redis开发和运维人员更加关注的是Redis本身的一些配置...

  • Redis好书推荐

    Redis从入门到深入学习,推荐几本好书: 《Redis入门指南(第2版)》 电子书下载:http://vdisk...

网友评论

    本文标题:第8章 Redis

    本文链接:https://www.haomeiwen.com/subject/xanqfqtx.html