一、简单介绍
redis
是一款高性能的NOSQL
系列的非关系型数据库。主要用于缓存,可提升数据访问的性能。这里用于做缓存的数据是不经常做改变的数据。核心思想见下图:
使用缓存机制,可以加快我们数据的访问。因为数据是暂存在内存中,直接访问内存的数据可以减少在访问数据库过程中的I/O
操作,这样便可以提升系统的性能,查询速度。但是作为缓存也有一定的缺点:数据因为是暂存在内存上的,一旦redis
服务端关闭,再次开启时,缓存数据将不复存在。因此在某些场合中,我们需要对redis
缓存数据做持久化操作,将其持久化到硬盘上,当再次查询时,可将数据读取到缓存中。
从以上我们看出redis
使用时的两点注意事项:
- 数据不会经常改变。如果,数据持续改变,就不断的访问数据库,再将数据放入到缓存中。
- 确定持久化操作的条件。不能随时随地的进行持久化(反而增加了
IO
操作),也不能对缓存中大量改变的数据不做持久化数据(会导致数据大量的丢失)。
二、案例实操
通过对redis
的基本介绍,我们做一个小案例。案例需求如下:
- 提供index.html页面,页面中有一个省份下拉列表
- 当页面加载完成后,发送
ajax
请求,加载所有省份
思路:
当接收到请求时,做redis
缓存的查询。如果缓存中存在所需要的数据,就将缓存数据进行返回;如果不存在,就进行数据库查询,同时将数据库中的数据加入到缓存中,再将数据进行返回。
前端接收到的数据是序列化后的Json
数据,便于数据的读取,进行页面数据的展示。
**思考:**为什么这里要使用ajax
?
当我们对页面进行加载时,就需要自动显示后台传递的数据,而没有进行任何链接的操作(form表单提交、点击超链接等操作),而让页面主动对后端进行请求,所以我们这里需要使用ajax
,简化我们的操作。
第二点是因为异步请求是为了获取服务器响应的数据,而前端使用的是html
,不能够直接从servlet
相关的域对象获取值,只能通过ajax
获取相应的数据。
以下便是具体实现的代码:
dao层中findAll方法的实现public class ProvinceDaoImpl implements ProvinceDao {
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
@Override
public List<Province> findAll() {
String sql = "select * from province";
List<Province> list = template.query(sql, new BeanPropertyRowMapper<Province>(Province.class));
return list;
}
}
service层中findAll方法的实现
public class ProvinceServiceImpl implements ProvinceService {
private ProvinceDao provinceDao = new ProvinceDaoImpl();
@Override
public String findAllByRedis() {
Jedis jedis = JedisUtils.getJedis(); // 创建Jedis对象,用于redis的操作
String province = jedis.get("province"); // 获取需要查询的对象
if (province == null || province.length