spring boot中引入redis(redis来自docker)

不迈出实践永远都不会知道结果,就像我如果不当面告诉你我喜欢你,我就不知道你不喜欢我一样,哈哈

到dockerhub上面下载docker,似乎要翻墙登录才能下载,请大家自备梯子。下载链接 https://hub.docker.com/editions/community/docker-ce-desktop-windows?tab=description
在日常的开发中,为了方便化,怎么快速怎么来,我们需要安装可视化工具,方便快速的进行镜像的下载,docker的管理。

我的电脑是win10家庭版,不能直接安装docker for windows,只能下载docker toolbox 然后进行安装。
http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/

下载完软件之后,安装就行了。出现了两个问题,第一是github的问题,由于docker去请求版本是请求的 api.github.com,会出现说镜像版本out of date。所以最好的办法就是去下载一个iso,https://github.com/boot2docker/boot2docker/releases, 放在C:\Users\junlin.docker\machine\cache,打开的时候断网就好了。直接断网如果觉得不优雅的话可以考虑用别的一大堆办法。
卸载自动安装的visual box,自己手动下载一个最新的,我的办法是点开那个自动安装的,会有安装更新的提示,然后直接下载那一个就行了,在安装新的之前,必要的措施是卸载掉那一个旧的。

出现大鲸鱼
在这里插入图片描述

下面说一下我的个人设计,项目无状态化,分布式存储,分布式缓存,分布式消息中间件。

在docker hub 里面搜索我需要的docker image,我分别需要
zookeeper-redis
zookeeper-hbase
和rabbitmq的容器

用来分别完成上面的工作。打开可视化工具进行搜索。打开 Kitematic (Alpha) ,然后我是家庭版的系统所以选择visualbox打开,输入dockerhub的账号密码就可以登录然后进行想要的image的搜索了。
在这里插入图片描述
用 Kitematic (Alpha) 打开的dockerhub的界面。

打开redis的镜像
在这里插入图片描述

这里我重新安装了docker for windows,以下内容适合于安装了docker for windows,如果是安装的docker toolbox的朋友,下面内容仅供参考。

redis主要是用于缓存各种临时数据,在分布式环境下,帮助服务无状态化

设置本机的10000端口与容器中的6379端口对应起来,这样就可以使用本机的10000号端口访问容器中的6379端口提供的redis服务了。完整的打开方式:

docker run --name redis-test -p 6379:6379 -d --restart=always redis:latest redis-server --appendonly yes --requirepass "your passwd"

在spring boot引入redis

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.1.1.RELEASE</version>
</dependency>

然后在spring boot的配置文件中加上对redis的配置

#redis相关
spring.redis.host=127.0.0.1
spring.redis.port=10000
spring.redis.password=kexuejia123
spring.redis.database=0

创建一个redis数据库访问对象(DAO)

@Repository
public class RedisDao {
    @Autowired
    private StringRedisTemplate template;

    public  void setKey(String key,String value){
        ValueOperations<String, String> ops = template.opsForValue();
        ops.set(key,value);
    }

    public String getValue(String key){
        ValueOperations<String, String> ops = this.template.opsForValue();
        return ops.get(key);
    }
}

修改原来的controller:

@RequestMapping(value = Path.LOGIN, method = RequestMethod.POST)
    @ResponseBody
    public Map<String, Object> userLogin(@RequestParam("phone") final String phone,
                                         @RequestParam("password") final String password,
                                         @RequestParam("ip") final String ip){
        Map<String, Object> ans = new HashMap<>();
        // TODO: 2018/12/18 验证该phone是否已经登录
        String token = redisService.getTokenFromRedis(phone);
        if (token != ""){
            ans.put("code", 300);
            ans.put("info", "用户已经登录,请半小时后重新尝试");
            return ans;
        }
        UserInfoDto dto = userInfoService.getUser(phone);
        if (!dto.isRegister()){
            dto.setPassword(password);
            UserInfoDto dto1 = userInfoService.checkPassword(dto);
            if (dto1.isVoladate()){
                ans.put("code", 200);
                ans.put("info", "成功");
                String key = jwtService.getJwtsString(ip);
                ans.put("key", key);
                // TODO: 2018/12/18 将key放入redis
                redisService.insertTokenTORedis(key,phone);
                return ans;
            }
        }
        ans.put("code", 400);
        ans.put("info", "用户名或密码错误");
        return ans;
    }

然后编写RedisService


public interface RedisService {
    boolean insertTokenTORedis(String key, String phone);
    String getTokenFromRedis(String key);
}
//实现
@Service
public class RedisServiceImpl implements RedisService {

    private RedisDao redisDao;

    public RedisServiceImpl(RedisDao dao){
        this.redisDao = dao;
    }


    @Override
    public boolean insertTokenTORedis(String key, String phone) {
        try {
            redisDao.setKey(phone, key);
            return true;
        }catch (Exception e){
            return false;
        }
    }

    @Override
    public String getTokenFromRedis(String key) {
        String check = redisDao.getValue(key);
        if (check == null){
            return "";
        }
        return check;
    }
}

用postman请求,查看效果
在这里插入图片描述
在docker中的redis
在这里插入图片描述
再次发起请求,返回结果

{
    "code": 300,
    "info": "用户已经登录,请半小时后重新尝试"
}

猜你喜欢

转载自blog.csdn.net/xielinrui123/article/details/85044363
今日推荐