写点什么

使用 Redis,java 面试问到项目难点

作者:MySQL神话
  • 2021 年 11 月 28 日
  • 本文字数:3644 字

    阅读完需:约 12 分钟

两种方式的使用截然不同。

缓存

持久化数据库的缺点与优点:


-数据从数据库读取也就是索引磁盘速度慢


-数据写如数据库速度还说的过去


在 Java Web 领域,对于数据库的操作读的操作远超过写的操作,一般是 1:9 到 3:7 的比例。对于


数据库中的数据,读取操作会直接进行整个磁盘的索引,而索引整个磁盘的速度是非常慢的,但是


读取内存的速度就不一样了,会非常速度。


缓存的缺点:


磁盘的容量一般是 TGB 级别,不同于内存的小容量一般是 GB 级别,容量有限,而且磁盘十分


廉价,内存价格也比磁盘昂贵。

何时使用缓存 Redis

因为缓存基于内存,内存空间有限,价格高贵,所以应该有条件限制


使用 Redis 的条件:


  • 数据使用频繁,读取操作多于写操作

  • 业务数据经常被使用吗?命中率如何?

  • 业务数据大小如何?


一般而言,缓存的作用主要用于存储一些常用的数据,


比如用户登录信息,银行卡信息等。。

Redis 缓存简单原理

使用缓存是因为缓存的读取速度快,而考虑到写操作时,数据库的写操作与其速度差不到那去,


所以直接考虑缓存的读取操作


  • 当第一次读取数据时,首先检测 Redis 中是否含有该数据

  • 如果有直接读取

  • 如果没有,从数据库读取,写入 Redis

  • 第二遍读取数据时,直接从缓存中读取了

高速读/写场合

在互联网行业,对于高并发业务,比如秒杀和抢红包这些业务,


需要高质量的缓存机制相应千万级别的访问量。如果使用数据库,


数据库每秒处理万级别的 sql 语句,简直是异想天开,有时会使数据库瘫痪,甚至有时


会使服务器奔溃。


在这样的场合一般考虑使用异步写入数据库。

异步写入数据库

对于高速读/写场合中单单使用 Redis 的场景,把这些需要高速读/写的数据,


缓存到 Redis 中,而在满足一定条件时,触发这些缓存的数据写入数据库中去。


细细解释一下这个问题,当一个请求发送数据当服务器时,一开始存储数据是


Redis 缓存,没有进行任何关于数据库的操作,但是缓存不能持久化,因此需要


需要把这些数据存入数据库,因此会在一定条件时判断一个请求是否结束,一旦结束,


就会将缓存中的数据更新到数据库。而这个条件就像秒杀或者抢红包业务中红包数量


是否为 0,如果为空,一次性写入数据库,完成持久化工作。


Redis 的原理解析




此部分需要从两个方面为读者解读,不管是配置也好还是代码堆积也好,他们之间紧紧地联系在一起,读者可以参考阅读。


  • Spring 环境下的 Redis 配置细节

  • Java 环境下的 Jedis 操作

Spring IOC 原理简单回忆

SpringIoc 控制反转技术简单的理解就是管理我们日常所用的 JavaBean 类或者对象,因为一个 Bean 对象拥有属性和它们各自对应的 getter 和 setter 方法等,(只是简单的举 JavaBean 对象,其他对象也可以),SpringIoc 容器干了什么呢?通过我们人为的配置,SpringIOC 会在容器中保存对应的 Bean 对象。下面代码介绍:


package com.ruider;


public class Person{


private String name;


private int age;


/** getter and setter **/


}


这是一个 Person 类,拥有属性 name 和 age


初始化一个对象:


Person a=new Person();


a.setName("a");


a.setAge(20);


再看看我们的 Spring 中的配置


<Bean id="person" class="com.ruider.Person">


<property name="name" value="a"/>


<property name="age" value="20"/>


</Bean>


使用配置获取 Person 对象


@Autowired


Person a=null;


不管是 Java 代码式创建对象还是使用 SpringIOC 容器获取对象,他们都是等价的。


理解这一点会有助于后面的 Redis 原理解析。


###Redis 属性以及连接池的属性


Redis:(connectionFactory 常用的)


  • jedisCOnfig 连接池配置信息

  • port 端口,一般是 6379

  • host 或者 localhost

  • password 密码

  • TIMEOUT 超时


Redis 连接池:(JedisPoolConfig 常用)


  • 最大空闲数 MaxIdle

  • 最大连接数 MaxTotal

  • 最大等待时间 MaxWaitingTimes


Redis 使用对象 RedisTemplate 属性


  • conne


《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享


ctionFactory 连接工厂(相当于连接池)


  • keySerializer Redis 键序列化转换类型

  • valueSerializer Redis 值序列化转换类型

Redis 配置式 redis-config.xml

根据上述的三种属性介绍进行 Redis 的属性配置


<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns="http://www.springframework.org/schema/beans"


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"


xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"


xsi:schemaLocation="


http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd


http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd


http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd


http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"


default-autowire="byName" default-lazy-init="true">


<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">


<property name="maxIdle" value="${redis.maxIdle}" />


<property name="maxWaitMillis" value="${redis.maxWait}" />


<property name="testOnBorrow" value="${redis.testOnBorrow}" />


</bean>


<bean id="connectionFactory"


class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">


<property name="poolConfig" ref="poolConfig" />


<property name="port" value="${redis.port}" />


<property name="hostName" value="${redis.host}" />


<property name="password" value="${redis.password}" />


<property name="timeout" value="${redis.timeout}"></property>


</bean>


<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">


<property name="connectionFactory" ref="connectionFactory" />


<property name="keySerializer">


<bean


class="org.springframework.data.redis.serializer.StringRedisSerializer" />


</property>


<property name="valueSerializer">


<bean


class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />


</property>


</bean>


(1)其中对于 JedisPoolConfig 连接池的配置


<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">


<property name="maxIdle" value="${redis.maxIdle}" />


<property name="maxWaitMillis" value="${redis.maxWait}" />


<property name="testOnBorrow" value="${redis.testOnBorrow}" />


</bean>


至此,JedisPoolConfig 的对象已经存储在 SpringIOC 容器中,在程序应用中可以通过@Autowired获取 JedisPoolConfig 的对象。


上面 JedisPoolConfig 的配置用 Java 语句实现如下:


public class JedisPoolDemo{


public static void main(String[] args){


JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();


jedisPoolConfig.setMaxIdle(20); //连接池最大空闲数


jedisPoolConfig.setMaxTotal(100); //连接池最大连接数


jedisPoolConfig.setMaxWaitingMillis(2000);//最大等待时间为 2 秒


}


}


(2)其中 ConnectionFactory 的配置如下


<bean id="connectionFactory"


class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">


<property name="poolConfig" ref="poolConfig" />


<property name="port" value="${redis.port}" />


<property name="hostName" value="${redis.host}" />


<property name="password" value="${redis.password}" />


<property name="timeout" value="${redis.timeout}"></property>


</bean>


至此 ConnectionFactory 的对象已经存储在 SpringIOC 容器中,在程序应用中可以通过@Autowired获取 JedisPoolConfig 的对象。


上面 ConnectionFactory 的配置用 Java 语句实现如下:


//JedisPoolConfig 设置


JedisPoolConfig jedisPoolConfig=new JedisPoolConfig();


jedisPoolConfig.setMaxIdle(20); //连接池最大空闲数


jedisPoolConfig.setMaxTotal(100); //连接池最大连接数


jedisPoolConfig.setMaxWaitingMillis(2000);//最大等待时间为 2 秒


//ConnectionFactory 的设置


ConnectionFactory connectionFactory=new ConnectionFactory(jedisPoolConfig);


connectionFactory.setHost("localhost");


connectionFactory.setPort("6379");


connectionFactory.setTimeOut(2000);


}


(3)其中 RedisTemplate 的配置如下:


<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">


<property name="connectionFactory" ref="connectionFactory" />


<property name="keySerializer">


<bean

总结

在清楚了各个大厂的面试重点之后,就能很好的提高你刷题以及面试准备的效率,接下来小编也为大家准备了最新的互联网大厂资料。






本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

用户头像

MySQL神话

关注

还未添加个人签名 2021.11.12 加入

还未添加个人简介

评论

发布
暂无评论
使用Redis,java面试问到项目难点