Java项目中使用Redis缓存解析、与MySQL和MongoDB对比

1、Redis

先缓存中取数据,如果换成没有就去数据库取数据,然后数据也存入缓存中。(service层实现)

如果进行修改和删除数据,缓存同步:

  删除缓存,处理数据,数据放入缓存;

1)常用命令

连接操作命令:quit关闭连接;auth:简单密码验证;help cmd:查看帮助

持久化:save:数据同步保存到磁盘;bgsave:数据异步保存到磁盘;shutdown:同步保存到磁盘,然后关闭服务;

远程服务控制:info:提供服务器信息统计;monitor:实时转储收到的请求;

对value的操作:exists(key)确定key存在;del(key)删除key;type(key):返回key的类型;

String: set(key,value)给数据库中key的String赋予值value; get(key):返回数据库中名称为key的value;

2)缓存目的

1、热点数据,经常访问的放入缓存,降低数据库的IO,方便告诉查询,加快整个系统的响应速度,提高并发能力;

2、查询耗时数据,提高响应速度;

3)数据插入redis缓存中

redis是key-value进行存储,不能直接存储对象,先进行序列化后或者转换为JSON格式进行存储

1:序列化

Serializable接口、Json序列化

SerializeUtil

实现序列化类,实现Serializable接口;

对redis操作接口的实现类,RedisCacheStorageImpl2.

2:转换为jsonString存入redis

pom文件导入序列化依赖;

redis.properties文件配置及spring文件配置;

写一个RedisUtil来获取和释放redis资源,得到Jedis对象;

创建好RedisUtil后,写redis操作的接口及其实现类;

service层调用redis的操作接口;

4)实例

app客户端,看板统计数据汇总,数据来自不同库;

https://www.cnblogs.com/jy107600/p/8110173.html

关键代码:

1、取mysql中查询各个接口的信息

getPanelInfo.java

List panels = panelService.getAllPanels();

2、根据拿到的信息生成请求参数

getPanelInfo.java

WrapResponseModel resonseModel = new WrapReaponseModel();

Map headers = new HashMap<>();

headers.put("username",username);

headers.put("token",token);

for(PanelDto panelDto:panel){

 //发送http请求

   content.add(HttpRequestUtils.get(panelDto.getUrl(),headers));

}

//返回格式

responseModel.setCode(SUCCESS_CODE);

responseModel.setData(content);

3、发送http请求调用接口

创建HttpClient对象;

发送get请求;

执行get请求,得到Response对象;

httpResponse.getStatusLine()响应头信息,进行检测是否时200(正常);

返回对象HttpEntity;

4、查询数据set进redis,之后返回查询的数据

getPanInfo.java

if(!Objects.equals(redisCache,"false")){

   //redis_TTL过期时间

   redisProxyHandler.set(redisKey,JSON.toJSONString(responseModel), REDIS_TTL);

   logger.error("set!");

}

redisHandler.java

public void set(String key, String value, int seconds){

   redisCacheProvider.set(key,value,seconds);

}

redisProvider.java

@Autowired
    private JedisPool jedisPool;

    public Jedis getJedis() {
        Jedis jedis = this.jedisPool.getResource();
        // 使用index为2的database
        jedis.select(2);
        return jedis;
    }

    public void set(String key, String value, int seconds) {
        Jedis jedis = null;
        try {
            jedis = getJedis();
            jedis.setex(key, seconds, value);
            Long exp = jedis.ttl(key);
            if (exp < 0) {
                throw new RuntimeException("data time out!");19             }
        } catch (Throwable e) {
            logger.error(e.getMessage(), e);
            throw new TokenException(e.getMessage());
        } finally {
            if(jedis != null){jedis.close;}
        }
    }

5、请求接口的时候,先请求redis婚车,如果命中返回命中数据,否则执行http请求拼凑数据

String panelInfo = redisProxyHandler.get(redisKey);
                Long expire = redisProxyHandler.getExpire(redisKey);
               //命中才返回,否则会去发http请求
                if (Objects.nonNull(panelInfo) && (expire > 0) && expire                  responseModel = JSON.parseObject(panelInfo, WrapResponseModel.class);
                 return responseModel;
                 }

 2、MySQL、Redis和MongoDB的优缺点

1)MySQL

关系型数据库,web应用最好的数据库,管理数据库管理系统;

优点:

体积小,速度快,成本低、开源、支持多个操作系统

采用完全的多线程编程,灵活提供服务,充分利用CPU;

灵活而安全的权限和口令系统;提供用户界面可视化操作方便;

缺点:

不支持热备份;不支持自定义数据类型;

最大缺点安全系统,复杂非标准;

对xml支持不够良好;

Redis和MongoDB非关系型,采用结构型数据存储;

MongoDB建议集群部署,Redis侧重进行顺序写入;

2)Redis

key-value存储,数据结构服务器。value可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

优点:

读写性能优异;支持数据持久化,支持AOF和RDB两者持久化

支持主从复制,主机自动将数据同步到从机,可以读写分离;

缺点:

不能自动容错和恢复;

主机宕机,容易出现数据不一致问题;

主从复制采取全复制;

支持在线扩容;

3)MongoDB

基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能,集群。

将数据存储为一个文档,数据结构由键值(key=>value)对组成。

优点:

弱一致,保证用户访问速度;

文档存储,便捷获取;性能优越;

缺点:

不支持事务操作;占空间大;

你可能感兴趣的:(web开发)