第8章 Redis

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缓存取出数据返回。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,200评论 2 89
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,188评论 19 139
  • #v课会·第3季·小学30天思维导图实战营# 打卡天数:8/30 打卡时间:2018.6.18 打卡主题:《思维导...
    雨竹刘莉萍阅读 1,382评论 0 0
  • 活着就为了幸福,而幸福,是我们的追求,我们崇尚这样的生活,在人生的旅途上我们寻找着,追逐着。向往着,挣扎着,然而幸...
    A祥汇绿城喜刚强1769040阅读 1,081评论 0 0
  • 看到朋友圈在传《别再熬夜了》,年纪轻轻过劳的朋友不在少数,熬夜也大有人在。要说到“过劳死”这个沉重的话题,多年前一...
    茉莉大大阅读 775评论 0 0

友情链接更多精彩内容