Redis Comprehensive Case: use redis para realizar la clasificación de productos almacenados en caché: cree una clase de herramienta Jedis para conectarse a redis

Diagrama de flujo del uso de redis:

Inserte la descripción de la imagen aquí

Un mapa mental para realizar la clasificación de los bienes almacenados en caché:

Inserte la descripción de la imagen aquí

  1. El navegador envía la solicitud, y el servidor recibe la solicitud y la entrega al método queryAll () de la clase CategroySerivce para procesar los datos de la consulta.
  2. Al consultar redis por primera vez, si no hay datos (formato json), llame a CategoryDao para buscar en la base de datos (MySQL), obtenga la colección de clasificación de productos de la lista de colecciones y luego regrese primero a CategorySrvice, deje que convierta los datos de la lista en json y los guarde en la caché en redis, y al mismo tiempo Los datos json se devuelven al servidor.
  3. Para la segunda consulta, obtenga la clasificación del producto en formato de datos json directamente desde redis, y luego convierta el json en una lista y muéstrelo en el navegador.

Realización de casos

1. Clases de prueba de redacción

//第一步:测试开发CategoryService
public class TestCategoryService {
    
    
    @Test
    public void test01() throws Exception {
    
    
        //1. 创建业务类对象
        CategoryService categoryService = new CategoryService();
        //2. 查询所有分类集合
        List<Category> list = categoryService.queryAll();
        //3. 循环遍历输出
        for(Category category:list){
    
    
            System.out.println(category);
        }
    }
}

2. Bean (Categoría) para escribir la clasificación del producto

public class Category {
    
    
    private int cid;		//编号
    private String cname;	//名称
   //省略setter和getter
}

3. Cree un archivo de propiedades (jedis.properties) para almacenar pares clave-valor

maxTotal=50
maxIdle=15
url=localhost
port=6379

4. Cree la clase de herramienta Jedis, conéctese a redis, lea la configuración del par clave-valor del archivo de propiedades

//使用ResourceBundle读.propties文件
public class JedisUtils {
    
    
    //单例模式 静态代码块只执行一次,因为创建会很消耗性能
    private static JedisPool pool = null;
    //1. 创建一个连接池   静态代码在项目中,如果被使用只会加载一次
    static{
    
    
        //1.1 通过ResourceBundle读取properties文件 jedis.properties
        ResourceBundle bundle = ResourceBundle.getBundle("jedis");

        //获取参数
        String maxTotal = bundle.getString("maxTotal");
        String maxIdle = bundle.getString("maxIdle");
        String url = bundle.getString("url");
        String port = bundle.getString("port");

        //1.2创建连接池
        //创建连接池的配置对象
        JedisPoolConfig config = new JedisPoolConfig();
        //设置最大连接数
        config.setMaxTotal(Integer.parseInt(maxTotal));
        //设置空闲连接数
        config.setMaxIdle(Integer.parseInt(maxIdle));

        //2:创建连接池
        pool = new JedisPool(config, url, Integer.parseInt(port));
    }

    //2。 对外提供一个获取连接的方法
    public static Jedis getJedis(){
    
    
        return  pool.getResource();
    }

    //3。 提供释放资源的方法
    public static void close(Jedis jedis){
    
    
        if(jedis != null) {
    
    
            jedis.close();
        }
    }
}

5. Escriba la capa de servicio (CategoryService)

public class CategoryService {
    
    
    //调用dao层查询数据
    CategoryDao dao = new CategoryDao();
    //jackson 的 ObjectMapper类3  用来将数据与json格式相互转换
    ObjectMapper objectMapper = new ObjectMapper();
    public List<Category> queryAll() throws IOException {
    
    
        //1. 先访问redis,有数据就返回 JedisUtils  数据格式:Map<Srting,String>
        //  获取redis连接
         Jedis redis = JedisUtils.getJedis();
        //  查找redis缓存中的数据
        String json = redis.get("categoryList");
        if(json == null){
    
    //2. 如果没有数据就查询数据库(MySQL),缓存到redis
            System.out.println("(第一次查询) redis中没有数据,去查找数据库的数据");
            List<Category> categoryList = dao.findAll();
            //缓存  将查找到的list集合转换成json数据格式,缓存到redis上
            //通过ObjectMapper对象,转list数据格式转化成json数据格式
            String categoryListJson =  objectMapper.writeValueAsString(categoryList);
			System.out.println("查找到的categoryList的json数据是:");
            System.out.println(categoryListJson);

            redis.set("categoryList",categoryListJson);
            return categoryList;
        }else{
    
    //json ! =null 在redis中查询到了数据
            System.out.println("非第一次查询,数据缓存到redis中,redis有数据,直接从内存中返回,速度快");
            //将json转成对象   参1 json数据  参2 TypeReference
            List<Category> categoryList = objectMapper.readValue(json,new TypeReference<List<Category>>(){
    
    });
            return categoryList;
        }

    }
}

6. Escribe la capa dao

public class CategoryDao {
    
    
    public List<Category> findAll() {
    
    
        //1:创建集合
        List<Category> categoryList = new ArrayList<>();
        //使用循环模拟数据,以后使用mybatis来查数据
        for (int i = 0; i < 10; i++) {
    
    
            categoryList.add(new Category(i,"菜单名" + i));
        }
        return categoryList;
    }
}

7. Pruebe TestCategoryService para ver si la lógica es correcta

(El redis conectado aquí es el localhost local, el servidor de reids debe estar encendido redis-server.exe, de lo contrario se informará un error de conexión)

Primera prueba de consulta

(Primera consulta) No hay datos en redis, para encontrar los datos en la base de datos.
Los datos json de la categoryList encontrados son:
[{"cid": 0, "cname": "menu name0"}, {"cid": 1 , "Cname": "nombre del menú 1"}, {"cid": 2, "cname": "nombre del menú 2"}, {"cid": 3, "cname": "nombre del menú 3"}, {" cid ": 4," cname ":" nombre del menú 4 "}, {" cid ": 5," cname ":" nombre del menú 5 "}, {" cid ": 6," cname ":" nombre del menú 6 " }, {"Cid": 7, "cname": "nombre del menú 7"}, {"cid": 8, "cname": "nombre del menú 8"}, {"cid": 9, "cname": " Nombre del menú 9 ”}]
Categoría {cid = 0, cname = 'nombre del menú 0'}
Categoría {cid = 1, cname = 'nombre del menú 1'}
Categoría {cid = 2, cname = 'nombre del menú 2'}
Categoría { cid = 3, cname = 'nombre del menú 3'}
Categoría {cid = 4, cname = 'nombre del menú 4'}
Categoría {cid = 5, cname = 'nombre del menú 5'}
Categoría {cid = 6, cname = 'menú Nombre 6 '}
Categoría {cid = 7, cname =' nombre del menú 7 '}
Categoría {cid = 8, cname =' nombre del menú 8 '}
Categoría {cid = 9, cname =' nombre del menú 9 '}

Datos de la segunda / tercera consulta (cualquier número de veces que no sea la primera búsqueda)

No es la primera consulta, los datos se almacenan en caché en redis, redis tiene datos y regresa directamente desde la memoria,
categoría rápida {cid = 0, cname = 'nombre del menú 0'}
Categoría {cid = 1, cname = 'nombre del menú 1 '}
Categoría {cid = 2, cname =' nombre del menú 2 '}
Categoría {cid = 3, cname =' nombre del menú 3 '}
Categoría {cid = 4, cname =' nombre del menú 4 '}
Categoría {cid = 5, cname = 'nombre del menú 5'}
Categoría {cid = 6, cname = 'nombre del menú 6'}
Categoría {cid = 7, cname = 'nombre del menú 7'}
Categoría {cid = 8, cname = 'nombre del menú 8'}
Categoría {cid = 9, cname = 'nombre del menú 9'}

A partir de los resultados, podemos saber que no hay ningún error en la lógica empresarial y luego puede escribir la página.

8. Escriba la pantalla del Servlet de la página (simplemente escriba el tipo de prueba copiar y modificar)

@WebServlet("/CategoryListServlet")
public class CategoryListServlet extends HttpServlet {
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //1. 创建业务类对象
        CategoryService categoryService = new CategoryService();

        //2. 查询分类集合
        List<Category> categoryList = categoryService.queryAll();

        //3. 请求转发
        request.setAttribute("categoryList",categoryList);
        request.getRequestDispatcher("categoryList.jsp").forward(request,response);

    }
}

9. Filtra para evitar códigos desordenados

//拦截所有,进行编码设置
@WebFilter("/*")
public class EncodingFilter implements Filter {
    
    
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
    
    
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        chain.doFilter(req, resp);//放行
    }
}

10. Escribe páginas jsp

<%-- isELIgnored="false 开启el表达式--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 <html>
<head>
    <title>categoryList商品类型列表</title>
</head>
<body>


        <c:if test="${empty categoryList}">
            商品类型是空的哟
        </c:if>
        <c:if test="${!empty categoryList}">
            <table border="1" cellpadding="0" cellspacing="0">
                <thead>
                <tr>
                    <th>编号</th>
                    <th>商品类型名称</th>
                </tr>
                </thead>
                <tbody>
                <c:forEach items="${categoryList}" var="category" varStatus="vs">

                    <tr>
                        <td>${vs.count}</td>
                        <td>${category.cname}</td>
                    </tr>
                </c:forEach>
                </tbody>
            </table>
        </c:if>
</body>
</html>

11. Envase de tarro necesario

Inserte la descripción de la imagen aquí

12. Ejecutar resultados

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_40542534/article/details/108740426
Recomendado
Clasificación