Redis优化
针对上一篇博客(黑马旅游网),记录一下学到的知识点。
上篇博客链接:黑马旅游网
Redis学习笔记:Redis入门 转载于‘西邮陈冠希’的博客
Redis学习笔记:图片理解Redis数据类型 转载于‘锦衣夜行_’的博客
个人理解 仅供参考,欢迎指出错误
- 刚入门的时候,开发前端页面(例如:HTML网页)都是静态获取数据(写导航的时候,用ul、li、a等写的静态代码)。在写黑马旅游网,碰到从数据库中获取导航分类信息,然后动态显示到前端,如果用普通的数据查询显示,每次刷新都会访问一次数据库,从而给数据库带来巨大的压力,因此,有没有什么方式可以减轻数据库压力呢?这就是Redis优化。把不经常改变的数据(例如:导航分类,没有新商品上架一般不改变分类),放进缓存中,需要查询的时候先去缓存中取,没有再去数据库中查询。
笔记
- jedis就是集成了redis的一些命令操作,封装了redis的java客户端。提供了连接池管理。一般不直接使用jedis,而是在其上在封装一层,作为业务的使用。
- 项目中,是把分类的uid作为权值(Score),存入缓存中。
下面是CategoryServiceImpl代码,先在redis缓存中查询,没有再去数据库中查询。
package com.li.travel.service.impl;
import com.li.travel.dao.CategoryDao;
import com.li.travel.dao.impl.CategoryDaoImpl;
import com.li.travel.domain.Category;
import com.li.travel.service.CategoryService;
import com.li.travel.util.JedisUtil;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Tuple;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class CategoryServiceImpl implements CategoryService {
CategoryDao categoryDao = new CategoryDaoImpl();
Jedis jedis = JedisUtil.getJedis();
@Override
public List<Category> findAll() {
//先从redis查找
Set<Tuple> categories = jedis.zrangeWithScores("category", 0, -1);
List<Category> lists = null;
if(categories == null || categories.size()==0){
System.out.println("从数据库查询");
lists = categoryDao.findAll();
//把数据存入redis
for (Category list : lists) {
jedis.zadd("category",(int)list.getCid(),list.getCname());
}
}else{
System.out.println("缓存中查询数据");
//将set类型的categories转为List类型。
lists = new ArrayList<Category>();
for (Tuple category : categories) {
Category c = new Category();
c.setCname(category.getElement());
c.setCid((int)category.getScore());
lists.add(c);
}
}
return lists;
}
}