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

    相关文章

      网友评论

        本文标题:第8章 Redis

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