<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>redis相关内容 on Logan的博客</title>
        <link>https://qh.1357810.xyz/articles/redis/</link>
        <description>Recent content in redis相关内容 on Logan的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <copyright>logan</copyright>
        <lastBuildDate>Wed, 24 Apr 2024 00:00:00 +0800</lastBuildDate><atom:link href="https://qh.1357810.xyz/articles/redis/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>redis概述</title>
        <link>https://qh.1357810.xyz/articles/redis/redis/</link>
        <pubDate>Mon, 04 Sep 2023 02:02:09 +0800</pubDate>
        
        <guid>https://qh.1357810.xyz/articles/redis/redis/</guid>
        <description>&lt;h2 id=&#34;一特点&#34;&gt;
    &lt;a href=&#34;#%e4%b8%80%e7%89%b9%e7%82%b9&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    一、特点
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;键值（key-value）型，value支持多种不同数据结构，功能丰富&lt;/li&gt;
&lt;li&gt;单线程，每个命令具备原子性&lt;/li&gt;
&lt;li&gt;低延迟，速度快（基于内存、IO多路复用、良好的编码）。&lt;/li&gt;
&lt;li&gt;支持数据持久化&lt;/li&gt;
&lt;li&gt;支持主从集群、分片集群&lt;/li&gt;
&lt;li&gt;支持多语言客户端&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;1、redis是单线程的，保证原子性；6.0后网络请求是多线程，但是最终的命令执行依然是单线程&lt;/p&gt;
&lt;p&gt;2、为什么快？低延迟，速度快（基于内存、10多路复用、良好的编码、c语言）&lt;/p&gt;
&lt;h2 id=&#34;二安装&#34;&gt;
    &lt;a href=&#34;#%e4%ba%8c%e5%ae%89%e8%a3%85&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    二、安装
&lt;/h2&gt;
&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-8&#34;&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-9&#34;&gt;9&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 安装依赖&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;yum install -y gcc tcl
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tar -xzf redis-6.2.6.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; redis-6.2.6
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 测试&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 安装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; make install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220523/1653301303-83afb32adf07da.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;错误的本质是我们在开始执行make 时遇到了错误（大部分是由于gcc未安装），然后我们安装好了gcc 后，我们再执行make ,这时就出现了jemalloc/jemalloc.h: No such file or directory。这是因为上次的&lt;/p&gt;
&lt;p&gt;编译失败，有残留的文件，我们需要清理下，然后重新编译就可以了。&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make distclean&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;默认的安装路径是在 &lt;code&gt;/usr/local/bin&lt;/code&gt;目录下：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220523/1653301995-45df7803973ba6.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20220523183315613&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;redis-cli：是redis提供的命令行客户端&lt;/p&gt;
&lt;p&gt;redis-server：是redis的服务端启动脚本&lt;/p&gt;
&lt;p&gt;redis-sentinel：是redis的哨兵启动脚本&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;前台启动&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;redis-server&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;指定配置启动&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp redis.conf redis.conf.bck &lt;span class=&#34;c1&#34;&gt;#配置文件备份&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改配置文件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 允许访问的地址，默认是127.0.0.1，会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问，生产环境不要设置为0.0.0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;bind&lt;/span&gt; 0.0.0.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 守护进程，修改为yes后即可后台运行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;daemonize yes 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 密码，设置后访问Redis必须输入密码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;requirepass &lt;span class=&#34;m&#34;&gt;123321&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;其他配置&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 监听的端口&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;port &lt;span class=&#34;m&#34;&gt;6379&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 工作目录，默认是当前目录，也就是运行redis-server时的命令，日志、持久化等文件会保存在这个目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dir data
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 数据库数量，设置为1，代表只使用1个库，默认有16个库，编号0~15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;databases &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 设置redis能够使用的最大内存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;maxmemory 512mb
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 日志文件，默认为空，不记录日志，可以指定日志文件名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;logfile &lt;span class=&#34;s2&#34;&gt;&amp;#34;redis.log&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;启动&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-6-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-6-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-6-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-6-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-6-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-6-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-6-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-6-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 进入redis安装目录 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /usr/local/src/redis-6.2.6
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 启动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;redis-server redis.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;停止服务&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-7-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-7-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-7-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-7-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-7-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-7-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 利用redis-cli来执行 shutdown 命令，即可停止 Redis 服务，&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 因为之前配置了密码，因此需要通过 -a 来指定密码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;redis-cli -a &lt;span class=&#34;m&#34;&gt;123321&lt;/span&gt; shutdown&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开机自启&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-8-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-8-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vi /etc/systemd/system/redis.service &lt;span class=&#34;c1&#34;&gt;#新建一个系统服务文件&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-9-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-9-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-9-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-9-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-9-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-9-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-9-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-9-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-9-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-9-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-9-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-9-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-9-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-9-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-9-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-9-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-9-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-9-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-9-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-9-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-9-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-9-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Unit&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Description&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;redis-server
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;After&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;network.target
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Service&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;Type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;forking
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ExecStart&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/usr/local/bin/redis-server /usr/local/src/redis-6.2.6/redis.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PrivateTmp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Install&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;WantedBy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;multi-user.target&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-10-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-10-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl daemon-reload &lt;span class=&#34;c1&#34;&gt;#重载系统服务&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;现在，我们可以用下面这组命令来操作redis了：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-11-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-11-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-11-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-11-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-11-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-11-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-11-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-11-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-11-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-11-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-11-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-11-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-11-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-11-7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-11-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-11-8&#34;&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 启动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl start redis
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 停止&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl stop redis
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 重启&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl restart redis
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 查看状态&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl status redis&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;执行下面的命令，可以让redis开机自启：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-12-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-12-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; redis&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;三应用&#34;&gt;
    &lt;a href=&#34;#%e4%b8%89%e5%ba%94%e7%94%a8&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    三、应用
&lt;/h2&gt;&lt;h3 id=&#34;1全局id生成器&#34;&gt;
    &lt;a href=&#34;#1%e5%85%a8%e5%b1%80id%e7%94%9f%e6%88%90%e5%99%a8&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    1、全局ID生成器
&lt;/h3&gt;&lt;p&gt;一位标志位(0)+42位时间戳+21位redis自增  100年&lt;/p&gt;
&lt;h3 id=&#34;2缓存&#34;&gt;
    &lt;a href=&#34;#2%e7%bc%93%e5%ad%98&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    2、缓存
&lt;/h3&gt;&lt;p&gt;缓存预热
缓存穿透 1、缓存null数据 2、布隆过滤&lt;br&gt;
缓存雪崩 1、设置不同过期时间 2、redis高可用 3、多层缓存 4、缓存预热 5、降级限流&lt;br&gt;
缓存击穿 1、互斥锁(性能差，有死锁风险) 2、逻辑过期&lt;/p&gt;
&lt;h3 id=&#34;3秒杀&#34;&gt;
    &lt;a href=&#34;#3%e7%a7%92%e6%9d%80&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3、秒杀
&lt;/h3&gt;&lt;p&gt;秒杀  一人一单、超卖问题 三种方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;1、乐观锁减库存，成功率低，其他判断逻辑不能保证原子性&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2、分布式锁执行，性能差&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3、使用lua脚本判断资格，有序异步执行数据库逻辑&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;3.1、放入JDK阻塞队列&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;内存溢出问题、重启队列内数据丢失问题、取出数据后执行代码逻辑出现异常&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3.2、或者redis的消息队列&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;3.2.1、list-双向链表 模拟 队列(LPUSH+BRPOP)(RPUSH+BLPOP),B:阻塞
支持数据持久化
只支持单消费者
问题：取出数据后执行代码逻辑出现异常&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3.2.2、发布订阅 pub sub(天生阻塞) ，&lt;/p&gt;
&lt;p&gt;​						PUBLISH channel msg ，SUBSCRIBE channel ，PSUBSCRIBE channe*
​		 				支持多消费者,多生产者
​		 				问题：不支持数据持久化
​		 					 取出数据后执行代码逻辑出现异常
​		 					 消息堆积有上限，超出时数据丢失&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3.2.3、stream redis5.0后引入的一种新的数据类型，可以实现一个功能完善的消息队列
XADD s1 * k1 v1 k2 v2  发送消息，*表示使用redis自增id
XLEN s1 查看消息数量
XREAD         读取消息，读完不会删除 消息可回溯
支持数据持久化
支持多消费者
可以阻塞读取
有消息漏读问题&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3.2.4、stream-消费者组 ：将多个消费者划分到一个组，监听同一个队列
消息分流：队列中消息会分流给组内的不同消费者，而不是重复消费，加快消息处理速度
消息标志：消费者组会维护一个标志，记录最后一个被处理的消息，消费者重启后，会从标志之后读取消息，避免消息漏读
消息确认：消费者获取消息后，消息处于pending状态，并存入一个pending-list(在redis中)
当处理完成后需要通过XACK来确认消息，标记消息为已处理，才会从pending-list移除。
XGROUP CREATE key groupname ID
XREADGROUP GROUP
XACK KEY group ID
XPENDING&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;4点赞和关注&#34;&gt;
    &lt;a href=&#34;#4%e7%82%b9%e8%b5%9e%e5%92%8c%e5%85%b3%e6%b3%a8&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4、点赞和关注
&lt;/h3&gt;&lt;p&gt;大V 普通 僵尸粉-活跃粉丝 ， 拉取关注的用户发布的内容，sortedSet 滚动分页查询，按照时间戳倒序排序。
因为查完第一页后，可能会新增数据，所以不能用索引来查，所以用score存时间戳，用时间戳筛选数据
ZREVRANGEBYSCORE key max min WITHSCORES LIMIT offset count
max：第一次查询时，max=当前时间戳；当前查询的score的最大值，在本业务中即上一次排序列表中的最后一个元素的score-时间戳；
min=0 不变
offset：第一次查询时，为0；后面查询时，offset为上一次查询结果中，与最后一个元素的score相等的元素个数，即跳过这些元素，避免重复显示
count=3 不变，每页查多少数据&lt;/p&gt;
&lt;h3 id=&#34;5附近商户-地理坐标&#34;&gt;
    &lt;a href=&#34;#5%e9%99%84%e8%bf%91%e5%95%86%e6%88%b7-%e5%9c%b0%e7%90%86%e5%9d%90%e6%a0%87&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    5、附近商户-地理坐标
&lt;/h3&gt;&lt;p&gt;​	GEO数据结构，底层就时一个sortedset，经纬度转换为score
​	GEOADD：添加一个地理空间信息，包含：经度（longitude）、纬度（latitude）、值（member）
​		GEOADD g1 116.42803 39.903738 bjz 116.322287 39.893729 bjx
​	GEODIST：计算指定的两个点之间的距离并返回
​		GEODIST g1 bjx bjz km
​	GEOHASH：将指定member的坐标转为hash字符串形式并返回
​	GEOPOS：返回指定member的坐标
​		GEOPOS g1 bjz
​	GEORADIUS：指定圆心、半径，找到该圆内包含的所有member，并按照与圆心之间的距离排序后返回。6.2以后已废弃
​	GEOSEARCH：在指定范围内搜索member，并按照与指定点之间的距离排序后返回。范围可以是圆形或矩形。6.2.新功能
​		GEOSEARCH g1 FROMMEMBER bjx BYRADIUS 300 km ASC WITHDIST 默认升序
​		GEOSEARCH g1 FROMLONLAT 116 39 BYRADIUS 300 km ASC WITHDIST
​	GEOSEARCHSTORE：与GEOSEARCH功能一致，不过可以把结果存储到一个指定的key。 6.2.新功能&lt;/p&gt;
&lt;h3 id=&#34;6用户签到&#34;&gt;
    &lt;a href=&#34;#6%e7%94%a8%e6%88%b7%e7%ad%be%e5%88%b0&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    6、用户签到
&lt;/h3&gt;&lt;p&gt;BitMap - 位图 -  假设一次签到数据库中生成一行，每行占22字节，那么1000万个用户签到一个月=非常大的内存和行数
BitMap把每天签到与否抽象为bit的0或1，一个月31天，4个字节就能存下
BitMap利用redis的String类型数据结构(key-value),最大上限为512M，转为bit为2^32bit
key为用户id:月份，value为bit转换成的string
SETBIT key offset value   &amp;ndash;value为0或1
GETBIT key offset
BITCOUNT key [start end]  从0开始，统计一个月内签到次数
BITFIELD查询、BITOP位运算、BITPOS查找第一个出现的位置
连续签到次数：从最后一次签到开始向前统计 BIFIELD key GET u5 0 ,获取0号到5号的所有签到数据，u表示返回无符号数
// num为取出签到数据bit转换成的十进制数
int count = 0;
while (true) {
// 6.1.让这个数字与1做与运算，得到数字的最后一个bit位  // 判断这个bit位是否为0
if ((num &amp;amp; 1) == 0) {
// 如果为0，说明未签到，结束
break;
} else {
// 如果不为0，说明已签到，计数器+1
count++;
}
// 把数字右移一位，抛弃最后一个bit位，继续下一个bit位
num &amp;raquo;&amp;gt;= 1;
}&lt;/p&gt;
&lt;h3 id=&#34;7uv-pv统计&#34;&gt;
    &lt;a href=&#34;#7uv-pv%e7%bb%9f%e8%ae%a1&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    7、UV PV统计
&lt;/h3&gt;&lt;p&gt;HyperLogLog
UV：Unique Visitor ，浏览网页的自然人，一天内同一个用户访问多次，只记录一次
PV：Page View，页面访问量，用户多次打开页面，记录多次
HyperLogLog：基于LogLog算法，用于确定非常大的集合的基数，而不需要存储所有值；伯努利实验，抛硬币
基于redis中的string结构实现，单个HLL内存永远小于16KB，测量结果有小于0.81%的误差，对于UV统计来说可以忽略
PFADD key element [element &amp;hellip;]  添加
PFCOUNT key [key &amp;hellip;]  统计数量
PFMERGE destkey sourcekey [sourcekey &amp;hellip;]  合并
HyperLogLog存储数据天生是唯一的，适合做UV&lt;/p&gt;
&lt;h3 id=&#34;8分布式锁&#34;&gt;
    &lt;a href=&#34;#8%e5%88%86%e5%b8%83%e5%bc%8f%e9%94%81&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    8、分布式锁
&lt;/h3&gt;&lt;p&gt;redlock和mutilock  某台节点时钟漂移&lt;/p&gt;
&lt;h2 id=&#34;四分布式&#34;&gt;
    &lt;a href=&#34;#%e5%9b%9b%e5%88%86%e5%b8%83%e5%bc%8f&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    四、分布式
&lt;/h2&gt;&lt;p&gt;单点问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数据丢失问题  – redis持久化&lt;/li&gt;
&lt;li&gt;并发能力 - 主从，读写分离&lt;/li&gt;
&lt;li&gt;存储空间 - 分片集群，利用插槽机制实现动态扩容&lt;/li&gt;
&lt;li&gt;单点故障  -redis哨兵，健康监测和自动恢复&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Redis高级-分布式缓存</title>
        <link>https://qh.1357810.xyz/articles/redis/redis-cache/</link>
        <pubDate>Mon, 04 Sep 2023 02:02:09 +0800</pubDate>
        
        <guid>https://qh.1357810.xyz/articles/redis/redis-cache/</guid>
        <description>&lt;h1 id=&#34;分布式缓存&#34;&gt;
    &lt;a href=&#34;#%e5%88%86%e5%b8%83%e5%bc%8f%e7%bc%93%e5%ad%98&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    分布式缓存
&lt;/h1&gt;&lt;p&gt;&amp;ndash; 基于Redis集群解决单机Redis存在的问题&lt;/p&gt;
&lt;p&gt;单机的Redis存在四大问题：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-8d3d2393743691.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725144240631&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h1 id=&#34;0学习目标&#34;&gt;
    &lt;a href=&#34;#0%e5%ad%a6%e4%b9%a0%e7%9b%ae%e6%a0%87&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    0.学习目标
&lt;/h1&gt;&lt;h1 id=&#34;1redis持久化&#34;&gt;
    &lt;a href=&#34;#1redis%e6%8c%81%e4%b9%85%e5%8c%96&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    1.Redis持久化
&lt;/h1&gt;&lt;p&gt;Redis有两种持久化方案：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RDB持久化&lt;/li&gt;
&lt;li&gt;AOF持久化&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;11rdb持久化&#34;&gt;
    &lt;a href=&#34;#11rdb%e6%8c%81%e4%b9%85%e5%8c%96&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    1.1.RDB持久化
&lt;/h2&gt;&lt;p&gt;RDB全称Redis Database Backup file（Redis数据备份文件），也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后，从磁盘读取快照文件，恢复数据。快照文件称为RDB文件，默认是保存在当前运行目录。&lt;/p&gt;
&lt;h3 id=&#34;111执行时机&#34;&gt;
    &lt;a href=&#34;#111%e6%89%a7%e8%a1%8c%e6%97%b6%e6%9c%ba&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    1.1.1.执行时机
&lt;/h3&gt;&lt;p&gt;RDB持久化在四种情况下会执行：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;执行save命令&lt;/li&gt;
&lt;li&gt;执行bgsave命令&lt;/li&gt;
&lt;li&gt;Redis停机时&lt;/li&gt;
&lt;li&gt;触发RDB条件时&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;1）save命令&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;执行下面的命令，可以立即执行一次RDB：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-a0666a2f1bed1a.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725144536958&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;save命令会导致主进程执行RDB，这个过程中其它所有命令都会被阻塞。只有在数据迁移时可能用到。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2）bgsave命令&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;下面的命令可以异步执行RDB：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-bb7d18e9bd97ad.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725144725943&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;这个命令执行后会开启独立进程完成RDB，主进程可以持续处理用户请求，不受影响。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3）停机时&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Redis停机时会执行一次save命令，实现RDB持久化。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4）触发RDB条件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Redis内部有触发RDB的机制，可以在redis.conf文件中找到，格式如下：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-properties&#34; data-lang=&#34;properties&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 900秒内，如果至少有1个key被修改，则执行bgsave ， 如果是save &amp;#34;&amp;#34; 则表示禁用RDB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;save&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;900 1  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;save&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;300 10  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;save&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;60 10000 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;RDB的其它配置也可以在redis.conf文件中设置：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-8&#34;&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-properties&#34; data-lang=&#34;properties&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 是否压缩 ,建议不开启，压缩也会消耗cpu，磁盘的话不值钱&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;rdbcompression&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# RDB文件名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;dbfilename&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;dump.rdb  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 文件保存的路径目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;dir&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;./ &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;RDB&lt;/em&gt;是&lt;em&gt;从头开始&lt;/em&gt;创建，更健壮和稳定&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;112rdb原理&#34;&gt;
    &lt;a href=&#34;#112rdb%e5%8e%9f%e7%90%86&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    1.1.2.RDB原理
&lt;/h3&gt;&lt;p&gt;bgsave开始时会fork主进程得到子进程，子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。&lt;/p&gt;
&lt;p&gt;fork采用的是copy-on-write技术：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当主进程执行读操作时，访问共享内存；&lt;/li&gt;
&lt;li&gt;当主进程执行写操作时，则会拷贝一份数据，执行写操作。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-d7327284654ee7.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725151319695&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h3 id=&#34;113小结&#34;&gt;
    &lt;a href=&#34;#113%e5%b0%8f%e7%bb%93&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    1.1.3.小结
&lt;/h3&gt;&lt;p&gt;RDB方式bgsave的基本流程？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;fork主进程得到一个子进程，共享内存空间&lt;/li&gt;
&lt;li&gt;子进程读取内存数据并写入新的RDB文件&lt;/li&gt;
&lt;li&gt;用新RDB文件替换旧的RDB文件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;RDB会在什么时候执行？save 60 1000代表什么含义？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;默认是服务停止时&lt;/li&gt;
&lt;li&gt;代表60秒内至少执行1000次修改则触发RDB&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;RDB的缺点？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RDB执行间隔时间长，两次RDB之间写入数据有丢失的风险&lt;/li&gt;
&lt;li&gt;fork子进程、压缩、写出RDB文件都比较耗时&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;12aof持久化&#34;&gt;
    &lt;a href=&#34;#12aof%e6%8c%81%e4%b9%85%e5%8c%96&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    1.2.AOF持久化
&lt;/h2&gt;&lt;h3 id=&#34;121aof原理&#34;&gt;
    &lt;a href=&#34;#121aof%e5%8e%9f%e7%90%86&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    1.2.1.AOF原理
&lt;/h3&gt;&lt;p&gt;AOF全称为Append Only File（追加文件）。Redis处理的每一个写命令都会记录在AOF文件，可以看做是命令日志文件。&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-610c4179303b23.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725151543640&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h3 id=&#34;122aof配置&#34;&gt;
    &lt;a href=&#34;#122aof%e9%85%8d%e7%bd%ae&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    1.2.2.AOF配置
&lt;/h3&gt;&lt;p&gt;AOF默认是关闭的，需要修改redis.conf配置文件来开启AOF：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-properties&#34; data-lang=&#34;properties&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 是否开启AOF功能，默认是no&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;appendonly&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# AOF文件的名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;appendfilename&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;appendonly.aof&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;AOF的命令记录的频率也可以通过redis.conf文件来配：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-properties&#34; data-lang=&#34;properties&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 表示每执行一次写命令，立即记录到AOF文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;appendfsync&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;always &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 写命令执行完先放入AOF缓冲区，然后表示每隔1秒将缓冲区数据写到AOF文件，是默认方案&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;appendfsync&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;everysec &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 写命令执行完先放入AOF缓冲区，由操作系统决定何时将缓冲区内容写回磁盘&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;appendfsync&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;no&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;三种策略对比：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-52ee27bda7ee08.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725151654046&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h3 id=&#34;123aof文件重写&#34;&gt;
    &lt;a href=&#34;#123aof%e6%96%87%e4%bb%b6%e9%87%8d%e5%86%99&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    1.2.3.AOF文件重写
&lt;/h3&gt;&lt;p&gt;因为是记录命令，AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作，但只有最后一次写操作才有意义。通过执行bgrewriteaof命令，可以让AOF文件执行重写功能，用最少的命令达到相同效果。&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-bf12b672a4f461.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725151729118&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;如图，AOF原本有三个命令，但是&lt;code&gt;set num 123 和 set num 666&lt;/code&gt;都是对num的操作，第二次会覆盖第一次的值，因此第一个命令记录下来没有意义。&lt;/p&gt;
&lt;p&gt;所以重写命令后，AOF文件内容就是：&lt;code&gt;mset name jack num 666&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-properties&#34; data-lang=&#34;properties&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# AOF文件比上次文件 增长超过多少百分比则触发重写&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;auto-aof-rewrite-percentage&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# AOF文件体积最小多大以上才触发重写 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;auto-aof-rewrite-min-size&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;64mb &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;13rdb与aof对比&#34;&gt;
    &lt;a href=&#34;#13rdb%e4%b8%8eaof%e5%af%b9%e6%af%94&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    1.3.RDB与AOF对比
&lt;/h2&gt;&lt;p&gt;RDB和AOF各有自己的优缺点，如果对数据安全性要求较高，在实际开发中往往会&lt;strong&gt;结合&lt;/strong&gt;两者来使用。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RDB&lt;em&gt;是&lt;/em&gt;从头开始创建，更健壮和稳定&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当RDB和AOF在配置文件中同时开启时，当redis重新启动，则优先从AOF中恢复数据&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果redis先只用RDB运行一段时间，并且有数据；然后关闭，修改配置AOF开启，然后重启redis，这时数据会丢失；从AOF中恢复数据，并且把RDB的存储文件也覆盖。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-7290df71c84d27.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725151940515&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h2 id=&#34;14-rdb转aof&#34;&gt;
    &lt;a href=&#34;#14-rdb%e8%bd%acaof&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    1.4 RDB转AOF
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;对数据进行cp 备份&lt;/li&gt;
&lt;li&gt;使用 bgrewriteaof 命令，把RDB重写到AOF文件里&lt;/li&gt;
&lt;li&gt;动态配置 AOF 启动&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 备份&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp appendonly.aof appendonly.aof20181010bak
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp dump.rdb dump.rdb20181010bak
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;config get *  &lt;span class=&#34;c1&#34;&gt;# 查看配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;config &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; appendonly &lt;span class=&#34;s2&#34;&gt;&amp;#34;yes&amp;#34;&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;#修改配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# BGREWRITEAOF必须要在 config set appendonly后执行， 写完之后就去看看有生成aof文件没&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;BGREWRITEAOF &lt;span class=&#34;c1&#34;&gt;#写入AOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;shutdown &lt;span class=&#34;c1&#34;&gt;#修改 redis.conf 文件，把 appendonly 设置为 yes，启动AOF,以防redis重启&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h1 id=&#34;2redis主从&#34;&gt;
    &lt;a href=&#34;#2redis%e4%b8%bb%e4%bb%8e&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    2.Redis主从
&lt;/h1&gt;&lt;h2 id=&#34;21搭建主从架构&#34;&gt;
    &lt;a href=&#34;#21%e6%90%ad%e5%bb%ba%e4%b8%bb%e4%bb%8e%e6%9e%b6%e6%9e%84&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    2.1.搭建主从架构
&lt;/h2&gt;&lt;p&gt;单节点Redis的并发能力是有上限的，要进一步提高Redis的并发能力，就需要搭建主从集群，实现读写分离。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不用哨兵，就不支持主从自动切换&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-2fe7c9d0483b26.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725152037611&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;具体搭建流程参考课前资料《Redis集群.md》：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-cc1e615d1e227b.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725152052501&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h2 id=&#34;22主从数据同步原理&#34;&gt;
    &lt;a href=&#34;#22%e4%b8%bb%e4%bb%8e%e6%95%b0%e6%8d%ae%e5%90%8c%e6%ad%a5%e5%8e%9f%e7%90%86&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    2.2.主从数据同步原理
&lt;/h2&gt;&lt;h3 id=&#34;221全量同步&#34;&gt;
    &lt;a href=&#34;#221%e5%85%a8%e9%87%8f%e5%90%8c%e6%ad%a5&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    2.2.1.全量同步
&lt;/h3&gt;&lt;p&gt;主从第一次建立连接时，会执行&lt;strong&gt;全量同步&lt;/strong&gt;，将master节点的所有数据都拷贝给slave节点，流程：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-f3799459b0cc14.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725152222497&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;这里有一个问题，master如何得知salve是第一次来连接呢？？&lt;/p&gt;
&lt;p&gt;有几个概念，可以作为判断依据：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Replication Id&lt;/strong&gt;：简称replid，是数据集的标记，id一致则说明是同一数据集。每一个master都有唯一的replid，slave则会继承master节点的replid&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;offset&lt;/strong&gt;：偏移量，随着记录在repl_baklog中的数据增多而逐渐增大。slave完成同步时也会记录当前同步的offset。如果slave的offset小于master的offset，说明slave数据落后于master，需要更新。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此slave做数据同步，必须向master声明自己的replication id 和offset，master才可以判断到底需要同步哪些数据。&lt;/p&gt;
&lt;p&gt;因为slave原本也是一个master，有自己的replid和offset，当第一次变成slave，与master建立连接时，发送的replid和offset是自己的replid和offset。&lt;/p&gt;
&lt;p&gt;master判断发现slave发送来的replid与自己的不一致，说明这是一个全新的slave，就知道要做全量同步了。&lt;/p&gt;
&lt;p&gt;master会将自己的replid和offset都发送给这个slave，slave保存这些信息。以后slave的replid就与master一致了。&lt;/p&gt;
&lt;p&gt;因此，&lt;strong&gt;master判断一个节点是否是第一次同步的依据，就是看replid是否一致&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;如图：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-709edb18876cf3.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725152700914&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;完整流程描述：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;slave节点请求增量同步&lt;/li&gt;
&lt;li&gt;master节点判断replid，发现不一致，拒绝增量同步&lt;/li&gt;
&lt;li&gt;master将完整内存数据生成RDB，发送RDB到slave&lt;/li&gt;
&lt;li&gt;slave清空本地数据，加载master的RDB&lt;/li&gt;
&lt;li&gt;master将RDB期间的命令记录在repl_baklog，并持续将log中的命令发送给slave&lt;/li&gt;
&lt;li&gt;slave执行接收到的命令，保持与master之间的同步&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;222增量同步&#34;&gt;
    &lt;a href=&#34;#222%e5%a2%9e%e9%87%8f%e5%90%8c%e6%ad%a5&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    2.2.2.增量同步
&lt;/h3&gt;&lt;p&gt;全量同步需要先做RDB，然后将RDB文件通过网络传输个slave，成本太高了。因此除了第一次做全量同步，其它大多数时候slave与master都是做&lt;strong&gt;增量同步&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;什么是增量同步？就是只更新slave与master存在差异的部分数据。如图：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-c0752e2960a610.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725153201086&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;那么master怎么知道slave与自己的数据差异在哪里呢?&lt;/p&gt;
&lt;h3 id=&#34;223repl_backlog原理&#34;&gt;
    &lt;a href=&#34;#223repl_backlog%e5%8e%9f%e7%90%86&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    2.2.3.repl_backlog原理
&lt;/h3&gt;&lt;p&gt;master怎么知道slave与自己的数据差异在哪里呢?&lt;/p&gt;
&lt;p&gt;这就要说到全量同步时的repl_baklog文件了。&lt;/p&gt;
&lt;p&gt;这个文件是一个固定大小的数组，只不过数组是环形，也就是说&lt;strong&gt;角标到达数组末尾后，会再次从0开始读写&lt;/strong&gt;，这样数组头部的数据就会被覆盖。&lt;/p&gt;
&lt;p&gt;repl_baklog中会记录Redis处理过的命令日志及offset，包括master当前的offset，和slave已经拷贝到的offset：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-716af2abd064bc.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725153359022&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;slave与master的offset之间的差异，就是salve需要增量拷贝的数据了。&lt;/p&gt;
&lt;p&gt;随着不断有数据写入，master的offset逐渐变大，slave也不断的拷贝，追赶master的offset：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-cbdb151216220a.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725153524190&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;直到数组被填满：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-647bae93a2358a.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725153715910&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;此时，如果有新的数据写入，就会覆盖数组中的旧数据。不过，旧的数据只要是绿色的，说明是已经被同步到slave的数据，即便被覆盖了也没什么影响。因为未同步的仅仅是红色部分。&lt;/p&gt;
&lt;p&gt;但是，如果slave出现网络阻塞，导致master的offset远远超过了slave的offset：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-06f7657147f924.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725153937031&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;如果master继续写入新数据，其offset就会覆盖旧的数据，直到将slave现在的offset也覆盖：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-24ca155a2019c9.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725154155984&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;棕色框中的红色部分，就是尚未同步，但是却已经被覆盖的数据。此时如果slave恢复，需要同步，却发现自己的offset都没有了，无法完成增量同步了。只能做全量同步。&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-43b9da63990b4e.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725154216392&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h2 id=&#34;23主从同步优化&#34;&gt;
    &lt;a href=&#34;#23%e4%b8%bb%e4%bb%8e%e5%90%8c%e6%ad%a5%e4%bc%98%e5%8c%96&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    2.3.主从同步优化
&lt;/h2&gt;&lt;p&gt;主从同步可以保证主从数据的一致性，非常重要。&lt;/p&gt;
&lt;p&gt;可以从以下几个方面来优化Redis主从就集群：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在master中配置repl-diskless-sync yes启用无磁盘复制，避免全量同步时的磁盘IO。&lt;/li&gt;
&lt;li&gt;Redis单节点上的内存占用不要太大，减少RDB导致的过多磁盘IO&lt;/li&gt;
&lt;li&gt;适当提高repl_baklog的大小，发现slave宕机时尽快实现故障恢复，尽可能避免全量同步&lt;/li&gt;
&lt;li&gt;限制一个master上的slave节点数量，如果实在是太多slave，则可以采用主-从-从链式结构，减少master压力&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;主从从架构图：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-9c1e02bdfda30d.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725154405899&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h2 id=&#34;24小结&#34;&gt;
    &lt;a href=&#34;#24%e5%b0%8f%e7%bb%93&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    2.4.小结
&lt;/h2&gt;&lt;p&gt;简述全量同步和增量同步区别？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;全量同步：master将完整内存数据生成RDB，发送RDB到slave。后续命令则记录在repl_baklog，逐个发送给slave。&lt;/li&gt;
&lt;li&gt;增量同步：slave提交自己的offset到master，master获取repl_baklog中从offset之后的命令给slave&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;什么时候执行全量同步？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;slave节点第一次连接master节点时&lt;/li&gt;
&lt;li&gt;slave节点断开时间太久，repl_baklog中的offset已经被覆盖时&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;什么时候执行增量同步？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;slave节点断开又恢复，并且在repl_baklog中能找到offset时&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;3redis哨兵&#34;&gt;
    &lt;a href=&#34;#3redis%e5%93%a8%e5%85%b5&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.Redis哨兵
&lt;/h1&gt;&lt;p&gt;Redis提供了哨兵（Sentinel）机制来实现主从集群的自动故障恢复。&lt;/p&gt;
&lt;h2 id=&#34;31哨兵原理&#34;&gt;
    &lt;a href=&#34;#31%e5%93%a8%e5%85%b5%e5%8e%9f%e7%90%86&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.1.哨兵原理
&lt;/h2&gt;&lt;h3 id=&#34;311集群结构和作用&#34;&gt;
    &lt;a href=&#34;#311%e9%9b%86%e7%be%a4%e7%bb%93%e6%9e%84%e5%92%8c%e4%bd%9c%e7%94%a8&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.1.1.集群结构和作用
&lt;/h3&gt;&lt;p&gt;哨兵的结构如图：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-b85ed7c98c79f0.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725154528072&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;哨兵的作用如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;监控&lt;/strong&gt;：Sentinel 会不断检查您的master和slave是否按预期工作&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动故障恢复&lt;/strong&gt;：如果master故障，Sentinel会将一个slave提升为master。当故障实例恢复后也以新的master为主&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;通知&lt;/strong&gt;：Sentinel充当Redis客户端的服务发现来源，当集群发生故障转移时，会将最新信息推送给Redis的客户端&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;312集群监控原理&#34;&gt;
    &lt;a href=&#34;#312%e9%9b%86%e7%be%a4%e7%9b%91%e6%8e%a7%e5%8e%9f%e7%90%86&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.1.2.集群监控原理
&lt;/h3&gt;&lt;p&gt;Sentinel基于心跳机制监测服务状态，每隔1秒向集群的每个实例发送ping命令：&lt;/p&gt;
&lt;p&gt;•主观下线：如果某sentinel节点发现某实例未在规定时间响应，则认为该实例&lt;strong&gt;主观下线&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;•客观下线：若超过指定数量（quorum）的sentinel都认为该实例主观下线，则该实例&lt;strong&gt;客观下线&lt;/strong&gt;。quorum值最好超过Sentinel实例数量的一半。&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-ba4412e693a4c6.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725154632354&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h3 id=&#34;313集群故障恢复原理&#34;&gt;
    &lt;a href=&#34;#313%e9%9b%86%e7%be%a4%e6%95%85%e9%9a%9c%e6%81%a2%e5%a4%8d%e5%8e%9f%e7%90%86&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.1.3.集群故障恢复原理
&lt;/h3&gt;&lt;p&gt;一旦发现master故障，sentinel需要在salve中选择一个作为新的master，选择依据是这样的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首先会判断slave节点与master节点断开时间长短，如果超过指定值（down-after-milliseconds * 10）则会排除该slave节点&lt;/li&gt;
&lt;li&gt;然后判断slave节点的slave-priority值，越小优先级越高，如果是0则永不参与选举&lt;/li&gt;
&lt;li&gt;如果slave-prority一样，则判断slave节点的offset值，越大说明数据越新，优先级越高&lt;/li&gt;
&lt;li&gt;最后是判断slave节点的运行id大小，越小优先级越高。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当选出一个新的master后，该如何实现切换呢？&lt;/p&gt;
&lt;p&gt;流程如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;sentinel给备选的slave1节点发送slaveof no one命令，让该节点成为master&lt;/li&gt;
&lt;li&gt;sentinel给所有其它slave发送slaveof 192.168.150.101 7002 命令，让这些slave成为新master的从节点，开始从新的master上同步数据。&lt;/li&gt;
&lt;li&gt;最后，sentinel将故障节点标记为slave，当故障节点恢复后会自动成为新的master的slave节点&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-c789a8bfd20043.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725154816841&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h3 id=&#34;314小结&#34;&gt;
    &lt;a href=&#34;#314%e5%b0%8f%e7%bb%93&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.1.4.小结
&lt;/h3&gt;&lt;p&gt;Sentinel的三个作用是什么？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;监控&lt;/li&gt;
&lt;li&gt;故障转移&lt;/li&gt;
&lt;li&gt;通知&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sentinel如何判断一个redis实例是否健康？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每隔1秒发送一次ping命令，如果超过一定时间没有相向则认为是主观下线&lt;/li&gt;
&lt;li&gt;如果大多数sentinel都认为实例主观下线，则判定服务下线&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;故障转移步骤有哪些？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首先选定一个slave作为新的master，执行slaveof no one&lt;/li&gt;
&lt;li&gt;然后让所有节点都执行slaveof 新master&lt;/li&gt;
&lt;li&gt;修改故障节点配置，添加slaveof 新master&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;32搭建哨兵集群&#34;&gt;
    &lt;a href=&#34;#32%e6%90%ad%e5%bb%ba%e5%93%a8%e5%85%b5%e9%9b%86%e7%be%a4&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.2.搭建哨兵集群
&lt;/h2&gt;&lt;p&gt;具体搭建流程参考课前资料《Redis集群.md》：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-50f864d00cda58.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725155019276&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h2 id=&#34;33redistemplate&#34;&gt;
    &lt;a href=&#34;#33redistemplate&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.3.RedisTemplate
&lt;/h2&gt;&lt;p&gt;在Sentinel集群监管下的Redis主从集群，其节点会因为自动故障转移而发生变化，Redis的客户端必须感知这种变化，及时更新连接信息。Spring的RedisTemplate底层利用lettuce实现了节点的感知和自动切换。&lt;/p&gt;
&lt;p&gt;下面，我们通过一个测试来实现RedisTemplate集成哨兵机制。&lt;/p&gt;
&lt;h3 id=&#34;331导入demo工程&#34;&gt;
    &lt;a href=&#34;#331%e5%af%bc%e5%85%a5demo%e5%b7%a5%e7%a8%8b&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.3.1.导入Demo工程
&lt;/h3&gt;&lt;p&gt;首先，我们引入课前资料提供的Demo工程：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-59c33cc3382470.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725155124958&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h3 id=&#34;332引入依赖&#34;&gt;
    &lt;a href=&#34;#332%e5%bc%95%e5%85%a5%e4%be%9d%e8%b5%96&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.3.2.引入依赖
&lt;/h3&gt;&lt;p&gt;在项目的pom文件中引入依赖：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-6-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-6-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-6-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-6-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-6-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-6-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-6-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-6-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class=&#34;nt&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-data-redis&lt;span class=&#34;nt&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;333配置redis地址&#34;&gt;
    &lt;a href=&#34;#333%e9%85%8d%e7%bd%aeredis%e5%9c%b0%e5%9d%80&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.3.3.配置Redis地址
&lt;/h3&gt;&lt;p&gt;然后在配置文件application.yml中指定redis的sentinel相关信息：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-7-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-7-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-7-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-7-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-7-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-7-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-7-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-7-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-7-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-7-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-7-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-7-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-7-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-7-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-7-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-7-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-7-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-7-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-7-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-7-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nl&#34;&gt;spring&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sentinel&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;master&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mymaster&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;#&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sentinel配置文件中定义的集群名字&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nodes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;127&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;27001&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;127&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;27002&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;127&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;27003&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;#&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;password&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;123456&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;#&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;访问sentinel的密码&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;password&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;123456&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;#&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;访问redis集群的密码&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;334配置读写分离&#34;&gt;
    &lt;a href=&#34;#334%e9%85%8d%e7%bd%ae%e8%af%bb%e5%86%99%e5%88%86%e7%a6%bb&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.3.4.配置读写分离
&lt;/h3&gt;&lt;p&gt;在项目的启动类中，添加一个新的bean：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-8-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-8-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-8-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-8-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-8-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-8-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-8-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-8-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Bean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LettuceClientConfigurationBuilderCustomizer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;clientConfigurationBuilderCustomizer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(){&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;clientConfigurationBuilder&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;clientConfigurationBuilder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;readFrom&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ReadFrom&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;REPLICA_PREFERRED&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;这个bean中配置的就是读写策略，包括四种：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MASTER：从主节点读取&lt;/li&gt;
&lt;li&gt;MASTER_PREFERRED：优先从master节点读取，master不可用才读取replica&lt;/li&gt;
&lt;li&gt;REPLICA：从slave（replica）节点读取&lt;/li&gt;
&lt;li&gt;REPLICA _PREFERRED：优先从slave（replica）节点读取，所有的slave都不可用才读取master&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;4redis分片集群&#34;&gt;
    &lt;a href=&#34;#4redis%e5%88%86%e7%89%87%e9%9b%86%e7%be%a4&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.Redis分片集群
&lt;/h1&gt;&lt;h2 id=&#34;41搭建分片集群&#34;&gt;
    &lt;a href=&#34;#41%e6%90%ad%e5%bb%ba%e5%88%86%e7%89%87%e9%9b%86%e7%be%a4&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.1.搭建分片集群
&lt;/h2&gt;&lt;p&gt;主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;海量数据存储问题&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;高并发写的问题&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;使用分片集群可以解决上述问题，如图:&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-0aff61ec482794.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725155747294&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;分片集群特征：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;集群中有多个master，每个master保存不同数据&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;每个master都可以有多个slave节点&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;master之间通过ping监测彼此健康状态&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;客户端请求可以访问集群任意节点，最终都会被转发到正确节点&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;具体搭建流程参考课前资料《Redis集群.md》：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-df0398404bc5ba.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725155806288&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h2 id=&#34;42散列插槽&#34;&gt;
    &lt;a href=&#34;#42%e6%95%a3%e5%88%97%e6%8f%92%e6%a7%bd&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.2.散列插槽
&lt;/h2&gt;&lt;h3 id=&#34;421插槽原理&#34;&gt;
    &lt;a href=&#34;#421%e6%8f%92%e6%a7%bd%e5%8e%9f%e7%90%86&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.2.1.插槽原理
&lt;/h3&gt;&lt;p&gt;Redis会把每一个master节点映射到0~16383共16384个插槽（hash slot）上，查看集群信息时就能看到：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-51215b86e24003.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725155820320&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;数据key不是与节点绑定，而是与插槽绑定。redis会根据key的有效部分计算插槽值，分两种情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;key中包含&amp;quot;{}&amp;quot;，且“{}”中至少包含1个字符，“{}”中的部分是有效部分&lt;/li&gt;
&lt;li&gt;key中不包含“{}”，整个key都是有效部分&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如：key是num，那么就根据num计算，如果是{itcast}num，则根据itcast计算。计算方式是利用CRC16算法得到一个hash值，然后对16384取余，得到的结果就是slot值。&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-dd1fdb16116836.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725155850200&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;如图，在7001这个节点执行set a 1时，对a做hash运算，对16384取余，得到的结果是15495，因此要存储到103节点。&lt;/p&gt;
&lt;p&gt;到了7003后，执行&lt;code&gt;get num&lt;/code&gt;时，对num做hash运算，对16384取余，得到的结果是2765，因此需要切换到7001节点&lt;/p&gt;
&lt;h3 id=&#34;421小结&#34;&gt;
    &lt;a href=&#34;#421%e5%b0%8f%e7%bb%93&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.2.1.小结
&lt;/h3&gt;&lt;p&gt;Redis如何判断某个key应该在哪个实例？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将16384个插槽分配到不同的实例&lt;/li&gt;
&lt;li&gt;根据key的有效部分计算哈希值，对16384取余&lt;/li&gt;
&lt;li&gt;余数作为插槽，寻找插槽所在实例即可&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如何将同一类数据固定的保存在同一个Redis实例？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这一类数据使用相同的有效部分，例如key都以{typeId}为前缀&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;43集群伸缩&#34;&gt;
    &lt;a href=&#34;#43%e9%9b%86%e7%be%a4%e4%bc%b8%e7%bc%a9&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.3.集群伸缩
&lt;/h2&gt;&lt;p&gt;redis-cli &amp;ndash;cluster提供了很多操作集群的命令，可以通过下面方式查看：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-248e8d286cb6f9.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725160138290&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;比如，添加节点的命令：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-f776f9593efc4b.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725160448139&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h3 id=&#34;431需求分析&#34;&gt;
    &lt;a href=&#34;#431%e9%9c%80%e6%b1%82%e5%88%86%e6%9e%90&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.3.1.需求分析
&lt;/h3&gt;&lt;p&gt;需求：向集群中添加一个新的master节点，并向其中存储 num = 10&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;启动一个新的redis实例，端口为7004&lt;/li&gt;
&lt;li&gt;添加7004到之前的集群，并作为一个master节点&lt;/li&gt;
&lt;li&gt;给7004节点分配插槽，使得num这个key可以存储到7004实例&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里需要两个新的功能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;添加一个节点到集群中&lt;/li&gt;
&lt;li&gt;将部分插槽分配到新插槽&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;432创建新的redis实例&#34;&gt;
    &lt;a href=&#34;#432%e5%88%9b%e5%bb%ba%e6%96%b0%e7%9a%84redis%e5%ae%9e%e4%be%8b&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.3.2.创建新的redis实例
&lt;/h3&gt;&lt;p&gt;创建一个文件夹：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-9-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-9-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir &lt;span class=&#34;m&#34;&gt;7004&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;拷贝配置文件：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-10-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-10-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp redis.conf /7004&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;修改配置文件：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-11-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-11-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sed /s/6379/7004/g 7004/redis.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;启动&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-12-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-12-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;redis-server 7004/redis.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;433添加新节点到redis&#34;&gt;
    &lt;a href=&#34;#433%e6%b7%bb%e5%8a%a0%e6%96%b0%e8%8a%82%e7%82%b9%e5%88%b0redis&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.3.3.添加新节点到redis
&lt;/h3&gt;&lt;p&gt;添加节点的语法如下：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-f776f9593efc4b.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725160448139&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;执行命令：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-13-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-13-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;redis-cli --cluster add-node  192.168.150.101:7004 192.168.150.101:7001&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;通过命令查看集群状态：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-14-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-14-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;redis-cli -p &lt;span class=&#34;m&#34;&gt;7001&lt;/span&gt; cluster nodes&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;如图，7004加入了集群，并且默认是一个master节点：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-223f05b63ba3c1.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725161007099&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;但是，可以看到7004节点的插槽数量为0，因此没有任何数据可以存储到7004上&lt;/p&gt;
&lt;h3 id=&#34;434转移插槽&#34;&gt;
    &lt;a href=&#34;#434%e8%bd%ac%e7%a7%bb%e6%8f%92%e6%a7%bd&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.3.4.转移插槽
&lt;/h3&gt;&lt;p&gt;我们要将num存储到7004节点，因此需要先看看num的插槽是多少：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-eacabae4ae97b7.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725161241793&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;如上图所示，num的插槽为2765.&lt;/p&gt;
&lt;p&gt;我们可以将0~3000的插槽从7001转移到7004，命令格式如下：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-015fe70c411628.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725161401925&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;具体命令如下：&lt;/p&gt;
&lt;p&gt;建立连接：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-8a1dee9d503d62.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725161506241&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;得到下面的反馈：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-01e2c01bf344fc.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725161540841&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;询问要移动多少个插槽，我们计划是3000个：&lt;/p&gt;
&lt;p&gt;新的问题来了：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-f1e539c2d32bb2.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725161637152&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;那个node来接收这些插槽？？&lt;/p&gt;
&lt;p&gt;显然是7004，那么7004节点的id是多少呢？&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-fd8469e4190bf5.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725161731738&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;复制这个id，然后拷贝到刚才的控制台后：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-3568e3dea6882e.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725161817642&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;这里询问，你的插槽是从哪里移动过来的？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;all：代表全部，也就是三个节点各转移一部分&lt;/li&gt;
&lt;li&gt;具体的id：目标节点的id&lt;/li&gt;
&lt;li&gt;done：没有了&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里我们要从7001获取，因此填写7001的id：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-495e6131b84fd8.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725162030478&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;填完后，点击done，这样插槽转移就准备好了：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-0adcc883d7e60d.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725162101228&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;确认要转移吗？输入yes：&lt;/p&gt;
&lt;p&gt;然后，通过命令查看结果：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-82212633eb8cec.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725162145497&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;可以看到：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-970360629dc0f1.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725162224058&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;目的达成。&lt;/p&gt;
&lt;h2 id=&#34;44故障转移&#34;&gt;
    &lt;a href=&#34;#44%e6%95%85%e9%9a%9c%e8%bd%ac%e7%a7%bb&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.4.故障转移
&lt;/h2&gt;&lt;p&gt;集群初识状态是这样的：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-51210cd66c9f4f.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210727161152065&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;其中7001、7002、7003都是master，我们计划让7002宕机。&lt;/p&gt;
&lt;h3 id=&#34;441自动故障转移&#34;&gt;
    &lt;a href=&#34;#441%e8%87%aa%e5%8a%a8%e6%95%85%e9%9a%9c%e8%bd%ac%e7%a7%bb&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.4.1.自动故障转移
&lt;/h3&gt;&lt;p&gt;当集群中有一个master宕机会发生什么呢？&lt;/p&gt;
&lt;p&gt;直接停止一个redis实例，例如7002：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-15-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-15-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;redis-cli -p &lt;span class=&#34;m&#34;&gt;7002&lt;/span&gt; shutdown&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;1）首先是该实例与其它实例失去连接&lt;/p&gt;
&lt;p&gt;2）然后是疑似宕机：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-39ed6cee009de2.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725162319490&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;3）最后是确定下线，自动提升一个slave为新的master：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-b246d85fc27379.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725162408979&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;4）当7002再次启动，就会变为一个slave节点了：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-553ce4b5bef585.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210727160803386&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h3 id=&#34;442手动故障转移&#34;&gt;
    &lt;a href=&#34;#442%e6%89%8b%e5%8a%a8%e6%95%85%e9%9a%9c%e8%bd%ac%e7%a7%bb&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.4.2.手动故障转移
&lt;/h3&gt;&lt;p&gt;利用cluster failover命令可以手动让集群中的某个master宕机，切换到执行cluster failover命令的这个slave节点，实现无感知的数据迁移。其流程如下：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-0b5c33b5a8be9b.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210725162441407&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;这种failover命令可以指定三种模式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;缺省：默认的流程，如图1~6歩&lt;/li&gt;
&lt;li&gt;force：省略了对offset的一致性校验&lt;/li&gt;
&lt;li&gt;takeover：直接执行第5歩，忽略数据一致性、忽略master状态和其它master的意见&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;案例需求&lt;/strong&gt;：在7002这个slave节点执行手动故障转移，重新夺回master地位&lt;/p&gt;
&lt;p&gt;步骤如下：&lt;/p&gt;
&lt;p&gt;1）利用redis-cli连接7002这个节点&lt;/p&gt;
&lt;p&gt;2）执行cluster failover命令&lt;/p&gt;
&lt;p&gt;如图：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-1bacb7ad036de2.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210727160037766&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;效果：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653728518-51210cd66c9f4f.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210727161152065&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h2 id=&#34;45redistemplate访问分片集群&#34;&gt;
    &lt;a href=&#34;#45redistemplate%e8%ae%bf%e9%97%ae%e5%88%86%e7%89%87%e9%9b%86%e7%be%a4&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.5.RedisTemplate访问分片集群
&lt;/h2&gt;&lt;p&gt;RedisTemplate底层同样基于lettuce实现了分片集群的支持，而使用的步骤与哨兵模式基本一致：&lt;/p&gt;
&lt;p&gt;1）引入redis的starter依赖&lt;/p&gt;
&lt;p&gt;2）配置分片集群地址&lt;/p&gt;
&lt;p&gt;3）配置读写分离&lt;/p&gt;
&lt;p&gt;与哨兵模式相比，其中只有分片集群的配置方式略有差异，如下：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-16-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-16-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-16-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-16-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-16-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-16-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-16-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-16-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-16-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-16-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-16-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-16-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-16-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-16-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-16-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-16-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-16-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-16-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-16-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-16-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-16-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-16-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;spring&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;cluster&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;nodes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;m&#34;&gt;172.16.251.128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;7001&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;m&#34;&gt;172.16.251.128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;7002&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;m&#34;&gt;172.16.251.128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;7003&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;m&#34;&gt;172.16.251.128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8001&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;m&#34;&gt;172.16.251.128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8002&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;- &lt;span class=&#34;m&#34;&gt;172.16.251.128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;8003&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;password&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;123456&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;#访问redis集群的密码&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
</description>
        </item>
        <item>
        <title>Redis集群</title>
        <link>https://qh.1357810.xyz/articles/redis/redis-cluster/</link>
        <pubDate>Mon, 04 Sep 2023 02:02:09 +0800</pubDate>
        
        <guid>https://qh.1357810.xyz/articles/redis/redis-cluster/</guid>
        <description>&lt;h1 id=&#34;配置&#34;&gt;
    &lt;a href=&#34;#%e9%85%8d%e7%bd%ae&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    配置
&lt;/h1&gt;&lt;h2 id=&#34;单实例&#34;&gt;
    &lt;a href=&#34;#%e5%8d%95%e5%ae%9e%e4%be%8b&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    单实例
&lt;/h2&gt;&lt;p&gt;保持默认配置，然后修改以下&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-12&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-13&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-14&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-15&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-16&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-17&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-18&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-19&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-20&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-21&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-22&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-23&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-24&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-25&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-26&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-27&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-28&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-29&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-30&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-31&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-32&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-33&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-34&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-35&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-36&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-37&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-38&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-39&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-40&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 绑定地址，默认是127.0.0.1；为网卡的ip，如果为0.0.0.0则会绑定所有网卡的ip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# bind 0.0.0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 关闭保护模式，让其他机器也能访问&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;protected-mode no&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 数据库数量，设置为1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;databases 16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 守护进程，修改为yes后即可后台运行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;daemonize yes &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 密码，设置后访问Redis必须输入密码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;requirepass 123456&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 监听的端口&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;port 6379&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 数据库数量，设置为1，代表只使用1个库，默认有16个库，编号0~15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;databases 16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 设置redis能够使用的最大内存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;maxmemory 512mb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 日志文件，默认为空，不记录日志，可以指定日志文件名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;logfile &amp;#34;redis.log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 300秒内，如果至少有100个key被修改，则执行bgsave ， 如果是save &amp;#34;&amp;#34; 则表示禁用RDB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;save 300 100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 是否压缩 ,建议不开启，压缩也会消耗cpu，磁盘的话不值钱&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;rdbcompression no&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# RDB文件名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;dbfilename dump.rdb  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 工作目录，默认是当前目录，也就是运行redis-server时的命令，日志、持久化等文件会保存在这个目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;dir data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 是否开启AOF功能，默认是no&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;appendonly yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# AOF文件的名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;appendfilename &amp;#34;appendonly.aof&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 表示每执行一次写命令，立即记录到AOF文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;appendfsync always &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 写命令执行完先放入AOF缓冲区，然后表示每隔1秒将缓冲区数据写到AOF文件，是默认方案&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;appendfsync everysec &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 写命令执行完先放入AOF缓冲区，由操作系统决定何时将缓冲区内容写回磁盘&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;appendfsync no&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# AOF文件比上次文件 增长超过多少百分比则触发重写&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;auto-aof-rewrite-percentage 100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# AOF文件体积最小多大以上才触发重写 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;auto-aof-rewrite-min-size 64mb &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;主从&#34;&gt;
    &lt;a href=&#34;#%e4%b8%bb%e4%bb%8e&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    主从
&lt;/h2&gt;&lt;p&gt;修改以下，其他配置与单机相同&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 绑定节点IP，避免机器有多个ip的情况&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;replica-announce-ip 127.0.0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;port 7001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 配置PID，以免冲突&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;pidfile /var/run/redis_7001.pid&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 开启RDB，主从用的就是RDB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# save &amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;save 300 100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 关闭AOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;appendonly no&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;从&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-12&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-13&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-14&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 绑定节点IP，避免机器有多个ip的情况&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;replica-announce-ip 127.0.0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;port 7002&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 配置PID，以免冲突&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;pidfile /var/run/redis_7002.pid&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 开启RDB，主从用的就是RDB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# save &amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;save 300 100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 关闭AOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;appendonly no&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 访问主节点时要带上密码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;masterauth 123456&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 配置主节点ip和端口&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;replicaof 127.0.0.1 7001&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;哨兵&#34;&gt;
    &lt;a href=&#34;#%e5%93%a8%e5%85%b5&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    哨兵
&lt;/h2&gt;&lt;p&gt;保持主从节点配置；以下是哨兵配置&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-12&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-13&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-14&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-15&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-16&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;port 27001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#绑定ip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;sentinel announce-ip &amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#监控的主节点ip和端口，2为多数派&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;sentinel monitor mymaster 127.0.0.1 7001 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#时间配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;sentinel down-after-milliseconds mymaster 5000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;sentinel failover-timeout mymaster 60000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#工作目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;dir &amp;#34;s1/data&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;logfile &amp;#34;sentinel.log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#后台启动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;daemonize yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#访问主节点要带上密码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;sentinel auth-pass mymaster 123456&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;protected-mode no&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;分片集群&#34;&gt;
    &lt;a href=&#34;#%e5%88%86%e7%89%87%e9%9b%86%e7%be%a4&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    分片集群
&lt;/h2&gt;
&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-12&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-13&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-14&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-15&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-16&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-17&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-18&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-19&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-20&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-21&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-22&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-23&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-24&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-25&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-26&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-27&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-28&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-29&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-30&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-31&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-32&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-33&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-34&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-35&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-36&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-37&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-38&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-39&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-40&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-41&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-42&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-43&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-44&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-45&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-46&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-47&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-48&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-49&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-50&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-51&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 开启集群功能&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;cluster-enabled yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 集群的配置文件名称，不需要我们创建，由redis自己维护&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;cluster-config-file ./nodes.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 节点心跳失败的超时时间&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;cluster-node-timeout 5000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 注册的实例ip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;replica-announce-ip 127.0.0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 绑定地址，默认是127.0.0.1，会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# bind 0.0.0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 关闭保护模式，让其他机器也能访问&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;protected-mode no&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 数据库数量，设置为1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;databases 16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 守护进程，修改为yes后即可后台运行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;daemonize yes &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 密码，设置后访问Redis必须输入密码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;requirepass 123456&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 监听的端口&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;port 8001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 配置PID，以免冲突&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;pidfile /var/run/redis_8001.pid&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 数据库数量，设置为1，代表只使用1个库，默认有16个库，编号0~15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;databases 16&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 设置redis能够使用的最大内存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;maxmemory 512mb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 日志文件，默认为空，不记录日志，可以指定日志文件名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;logfile &amp;#34;redis.log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 300秒内，如果至少有100个key被修改，则执行bgsave ， 如果是save &amp;#34;&amp;#34; 则表示禁用RDB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;save 300 100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 是否压缩 ,建议不开启，压缩也会消耗cpu，磁盘的话不值钱&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;rdbcompression no&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# RDB文件名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;dbfilename dump.rdb  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 工作目录，默认是当前目录，也就是运行redis-server时的命令，日志、持久化等文件会保存在这个目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;dir 8001/data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 是否开启AOF功能，默认是no&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;appendonly no&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# AOF文件的名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;appendfilename &amp;#34;appendonly.aof&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 表示每执行一次写命令，立即记录到AOF文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;appendfsync always &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 写命令执行完先放入AOF缓冲区，然后表示每隔1秒将缓冲区数据写到AOF文件，是默认方案&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;appendfsync everysec &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 写命令执行完先放入AOF缓冲区，由操作系统决定何时将缓冲区内容写回磁盘&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;appendfsync no&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# AOF文件比上次文件 增长超过多少百分比则触发重写&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;auto-aof-rewrite-percentage 100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# AOF文件体积最小多大以上才触发重写 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;auto-aof-rewrite-min-size 64mb &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h1 id=&#34;redis集群&#34;&gt;
    &lt;a href=&#34;#redis%e9%9b%86%e7%be%a4&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    Redis集群
&lt;/h1&gt;&lt;p&gt;本章是基于CentOS7下的Redis集群教程，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;单机安装Redis&lt;/li&gt;
&lt;li&gt;Redis主从&lt;/li&gt;
&lt;li&gt;Redis分片集群&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;1单机安装redis&#34;&gt;
    &lt;a href=&#34;#1%e5%8d%95%e6%9c%ba%e5%ae%89%e8%a3%85redis&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    1.单机安装Redis
&lt;/h1&gt;&lt;p&gt;首先需要安装Redis所需要的依赖：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;yum install -y gcc tcl&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;然后将课前资料提供的Redis安装包上传到虚拟机的任意目录：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653729357-8981121054a952.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210629114325516&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;例如，我放到了/tmp目录：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653729357-65ce6b03697348.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210629114830642&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;解压缩：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-6-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-6-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tar -xzf redis-6.2.4.tar.gz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;解压后：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653729357-ae5101499fd289.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210629114941810&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;进入redis目录：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-7-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-7-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; redis-6.2.4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;运行编译命令：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-8-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-8-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;make &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; make install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;如果没有出错，应该就安装成功了。&lt;/p&gt;
&lt;p&gt;然后修改redis.conf文件中的一些配置：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-9-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-9-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-9-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-9-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-9-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-9-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-9-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-9-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-9-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-9-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-9-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-9-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-properties&#34; data-lang=&#34;properties&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 绑定地址，默认是127.0.0.1，会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;bind&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;0.0.0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 保护模式，关闭保护模式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;protected-mode&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;no&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 数据库数量，设置为1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;databases&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;启动Redis：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-10-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-10-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;redis-server redis.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;停止redis服务：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-11-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-11-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;redis-cli shutdown&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h1 id=&#34;2redis主从集群&#34;&gt;
    &lt;a href=&#34;#2redis%e4%b8%bb%e4%bb%8e%e9%9b%86%e7%be%a4&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    2.Redis主从集群
&lt;/h1&gt;&lt;h2 id=&#34;21集群结构&#34;&gt;
    &lt;a href=&#34;#21%e9%9b%86%e7%be%a4%e7%bb%93%e6%9e%84&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    2.1.集群结构
&lt;/h2&gt;&lt;p&gt;我们搭建的主从集群结构如图：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653729357-067ac943f820f7.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210630111505799&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;共包含三个节点，一个主节点，两个从节点。&lt;/p&gt;
&lt;p&gt;这里我们会在同一台虚拟机中开启3个redis实例，模拟主从集群，信息如下：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;IP&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;PORT&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;角色&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;192.168.150.101&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;7001&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;master&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;192.168.150.101&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;7002&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;slave&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;192.168.150.101&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;7003&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;slave&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;22准备实例和配置&#34;&gt;
    &lt;a href=&#34;#22%e5%87%86%e5%a4%87%e5%ae%9e%e4%be%8b%e5%92%8c%e9%85%8d%e7%bd%ae&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    2.2.准备实例和配置
&lt;/h2&gt;&lt;p&gt;要在同一台虚拟机开启3个实例，必须准备三份不同的配置文件和目录，配置文件所在目录也就是工作目录。&lt;/p&gt;
&lt;p&gt;1）创建目录&lt;/p&gt;
&lt;p&gt;我们创建三个文件夹，名字分别叫7001、7002、7003：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-12-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-12-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-12-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-12-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-12-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-12-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-12-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-12-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 进入/tmp目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /tmp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 创建目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir &lt;span class=&#34;m&#34;&gt;7001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7002&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7003&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;如图：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653729357-6c79ea30e61a87.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210630113929868&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;2）恢复原始配置&lt;/p&gt;
&lt;p&gt;修改redis-6.2.4/redis.conf文件，将其中的持久化模式改为默认的RDB模式，AOF保持关闭状态。&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-13-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-13-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-13-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-13-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-13-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-13-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-13-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-13-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-13-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-13-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-13-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-13-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-13-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-13-7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-13-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-13-8&#34;&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-properties&#34; data-lang=&#34;properties&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 开启RDB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# save &amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;save&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;3600 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;save&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;300 100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;save&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;60 10000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 关闭AOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;appendonly&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;no&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;3）拷贝配置文件到每个实例目录&lt;/p&gt;
&lt;p&gt;然后将redis-6.2.4/redis.conf文件拷贝到三个目录中（在/tmp目录执行下列命令）：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-14-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-14-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-14-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-14-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-14-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-14-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-14-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-14-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-14-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-14-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-14-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-14-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-14-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-14-7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 方式一：逐个拷贝&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp redis-6.2.4/redis.conf 7001/conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp redis-6.2.4/redis.conf 7002/conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp redis-6.2.4/redis.conf 7003/conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 方式二：管道组合命令，一键拷贝&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; 7001/conf 7002/conf 7003/conf &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; xargs -t -n &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; cp redis-6.2.4/redis.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;4）修改每个实例的端口、工作目录&lt;/p&gt;
&lt;p&gt;修改每个文件夹内的配置文件，将端口分别修改为7001、7002、7003，将rdb文件保存位置都修改为自己所在目录（在/tmp目录执行下列命令）：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-15-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-15-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-15-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-15-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-15-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-15-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sed -i -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/6379/7001/g&amp;#39;&lt;/span&gt; -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/dir .\//dir \/tmp\/7001\//g&amp;#39;&lt;/span&gt; 7001/conf/redis.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sed -i -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/6379/7002/g&amp;#39;&lt;/span&gt; -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/dir .\//dir \/tmp\/7002\//g&amp;#39;&lt;/span&gt; 7002/conf/redis.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sed -i -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/6379/7003/g&amp;#39;&lt;/span&gt; -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/dir .\//dir \/tmp\/7003\//g&amp;#39;&lt;/span&gt; 7003/conf/redis.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;5）修改每个实例的声明IP&lt;/p&gt;
&lt;p&gt;虚拟机本身有多个IP，为了避免将来混乱，我们需要在redis.conf文件中指定每一个实例的绑定ip信息，格式如下：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-16-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-16-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-16-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-16-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-properties&#34; data-lang=&#34;properties&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# redis实例的声明 IP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;replica-announce-ip&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;127.0.0.1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;每个目录都要改，我们一键完成修改（在/tmp目录执行下列命令）：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-17-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-17-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-17-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-17-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-17-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-17-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-17-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-17-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-17-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-17-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-17-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-17-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-17-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-17-7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 逐一执行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sed -i &lt;span class=&#34;s1&#34;&gt;&amp;#39;1a replica-announce-ip 127.0.0.1&amp;#39;&lt;/span&gt; 7001/conf/redis.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sed -i &lt;span class=&#34;s1&#34;&gt;&amp;#39;1a replica-announce-ip 127.0.0.1&amp;#39;&lt;/span&gt; 7002/conf/redis.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sed -i &lt;span class=&#34;s1&#34;&gt;&amp;#39;1a replica-announce-ip 127.0.0.1&amp;#39;&lt;/span&gt; 7003/conf/redis.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 或者一键修改&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;%s\n&amp;#39;&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7002&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7003&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; xargs -I&lt;span class=&#34;o&#34;&gt;{}&lt;/span&gt; -t sed -i &lt;span class=&#34;s1&#34;&gt;&amp;#39;1a replica-announce-ip 127.0.0.1&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{}&lt;/span&gt;/conf/redis.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;6）修改pidfile&lt;/p&gt;
&lt;h2 id=&#34;23启动&#34;&gt;
    &lt;a href=&#34;#23%e5%90%af%e5%8a%a8&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    2.3.启动
&lt;/h2&gt;&lt;p&gt;为了方便查看日志，我们打开3个ssh窗口，分别启动3个redis实例，启动命令：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-18-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-18-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-18-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-18-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-18-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-18-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-18-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-18-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-18-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-18-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-18-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-18-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 第1个&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./redis-server 7001/conf/redis.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 第2个&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./redis-server 7002/conf/redis.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 第3个&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./redis-server 7003/conf/redis.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;启动后：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653729357-7e736e12795783.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210630183914491&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;如果要一键停止，可以运行下面命令：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-19-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-19-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;%s\n&amp;#39;&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7002&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7003&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; xargs -I&lt;span class=&#34;o&#34;&gt;{}&lt;/span&gt; -t redis-cli -p &lt;span class=&#34;o&#34;&gt;{}&lt;/span&gt; shutdown&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;24开启主从关系&#34;&gt;
    &lt;a href=&#34;#24%e5%bc%80%e5%90%af%e4%b8%bb%e4%bb%8e%e5%85%b3%e7%b3%bb&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    2.4.开启主从关系
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;不用哨兵，就不支持主从自动切换&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;从节点配置文件需要设置主节点的密码&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-20-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-20-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;masterauth 123456&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;现在三个实例还没有任何关系，要配置主从可以使用replicaof 或者slaveof（5.0以前）命令。&lt;/p&gt;
&lt;p&gt;有临时和永久两种模式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;修改配置文件（永久生效）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在redis.conf中添加一行配置：&lt;code&gt;replicaof &amp;lt;masterip&amp;gt; &amp;lt;masterport&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用redis-cli客户端连接到redis服务，执行slaveof命令（重启后失效）：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-21-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-21-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;replicaof &amp;lt;masterip&amp;gt; &amp;lt;masterport&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;font color=&#39;red&#39;&gt;注意&lt;/font&gt;&lt;/strong&gt;：在5.0以后新增命令replicaof，与salveof效果一致。&lt;/p&gt;
&lt;p&gt;这里我们为了演示方便，使用方式二。&lt;/p&gt;
&lt;p&gt;通过redis-cli命令连接7002，执行下面命令：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-22-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-22-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-22-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-22-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-22-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-22-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-22-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-22-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 连接 7002&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./redis-cli -a &lt;span class=&#34;m&#34;&gt;123456&lt;/span&gt; -p &lt;span class=&#34;m&#34;&gt;7002&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 执行replicaof&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;replicaof 127.0.0.1 &lt;span class=&#34;m&#34;&gt;7001&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;通过redis-cli命令连接7003，执行下面命令：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-23-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-23-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-23-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-23-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-23-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-23-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-23-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-23-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 连接 7003&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./redis-cli -a &lt;span class=&#34;m&#34;&gt;123456&lt;/span&gt; -p &lt;span class=&#34;m&#34;&gt;7003&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 执行replicaof&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;replicaof 127.0.0.1 &lt;span class=&#34;m&#34;&gt;7001&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;然后连接 7001节点，查看集群状态：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-24-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-24-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-24-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-24-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-24-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-24-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-24-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-24-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 连接 7001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./redis-cli -a &lt;span class=&#34;m&#34;&gt;123456&lt;/span&gt; -p &lt;span class=&#34;m&#34;&gt;7001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 查看状态&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;info replication&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;结果：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653729357-670b629d9385e0.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210630201258802&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h2 id=&#34;25测试&#34;&gt;
    &lt;a href=&#34;#25%e6%b5%8b%e8%af%95&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    2.5.测试
&lt;/h2&gt;&lt;p&gt;执行下列操作以测试：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;利用redis-cli连接7001，执行&lt;code&gt;set num 123&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;利用redis-cli连接7002，执行&lt;code&gt;get num&lt;/code&gt;，再执行&lt;code&gt;set num 666&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;利用redis-cli连接7003，执行&lt;code&gt;get num&lt;/code&gt;，再执行&lt;code&gt;set num 888&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可以发现，只有在7001这个master节点上可以执行写操作，7002和7003这两个slave节点只能执行读操作。&lt;/p&gt;
&lt;h1 id=&#34;3搭建哨兵集群&#34;&gt;
    &lt;a href=&#34;#3%e6%90%ad%e5%bb%ba%e5%93%a8%e5%85%b5%e9%9b%86%e7%be%a4&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.搭建哨兵集群
&lt;/h1&gt;&lt;h2 id=&#34;31集群结构&#34;&gt;
    &lt;a href=&#34;#31%e9%9b%86%e7%be%a4%e7%bb%93%e6%9e%84&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.1.集群结构
&lt;/h2&gt;&lt;p&gt;这里我们搭建一个三节点形成的Sentinel集群，来监管之前的Redis主从集群。如图：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653729357-a5a4966cb6e025.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210701215227018&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;三个sentinel实例信息如下：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;节点&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;IP&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;PORT&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;s1&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;192.168.150.101&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;27001&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;s2&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;192.168.150.101&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;27002&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;s3&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;192.168.150.101&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;27003&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;32准备实例和配置&#34;&gt;
    &lt;a href=&#34;#32%e5%87%86%e5%a4%87%e5%ae%9e%e4%be%8b%e5%92%8c%e9%85%8d%e7%bd%ae&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.2.准备实例和配置
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;vim /etc/sysctl.conf&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-25-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-25-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-25-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-25-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-25-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-25-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-25-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-25-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-25-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-25-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-25-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-25-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;net.ipv4.tcp_syncookies&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;net.ipv4.tcp_tw_reuse&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;net.ipv4.tcp_tw_recycle&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;net.ipv4.tcp_fin_timeout&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;30&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;net.core.somaxconn&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;1024&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;vm.overcommit_memory&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;sudo sysctl -p&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;要在同一台虚拟机开启3个实例，必须准备三份不同的配置文件和目录，配置文件所在目录也就是工作目录。&lt;/p&gt;
&lt;p&gt;我们创建三个文件夹，名字分别叫s1、s2、s3：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-26-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-26-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-26-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-26-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-26-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-26-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-26-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-26-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 进入/tmp目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /tmp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 创建目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir s1 s2 s3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;如图：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653729357-b5e16491b07df9.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210701215534714&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;然后我们在s1目录创建一个sentinel.conf文件，添加下面的内容：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;port 27001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;sentinel announce-ip &amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;sentinel monitor mymaster 127.0.0.1 7001 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;sentinel down-after-milliseconds mymaster 5000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;sentinel failover-timeout mymaster 60000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;dir &amp;#34;s1/data&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;logfile &amp;#34;sentinel.log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;daemonize yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;sentinel auth-pass mymaster 123456&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;protected-mode no&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;解读：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;port 27001&lt;/code&gt;：是当前sentinel实例的端口&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sentinel monitor mymaster 127.0.0.1 7001 2&lt;/code&gt;：指定主节点信息
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mymaster&lt;/code&gt;：主节点名称，自定义，任意写&lt;/li&gt;
&lt;li&gt;&lt;code&gt;127.0.0.1&lt;/code&gt;：主节点的ip和端口&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2&lt;/code&gt;：选举master时的quorum值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;然后将s1/sentinel.conf文件拷贝到s2、s3两个目录中（在/tmp目录执行下列命令）：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-28-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-28-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-28-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-28-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-28-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-28-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-28-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-28-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-28-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-28-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 方式一：逐个拷贝&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp s1/conf/sentinel.conf s2/conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp s1/conf/sentinel.conf s3/conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 方式二：管道组合命令，一键拷贝&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; s2 s3 &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; xargs -t -n &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; cp s1/conf/sentinel.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;修改s2、s3两个文件夹内的配置文件，将端口分别修改为27002、27003：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-29-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-29-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-29-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-29-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sed -i -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/27001/27002/g&amp;#39;&lt;/span&gt; -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/s1/s2/g&amp;#39;&lt;/span&gt; s2/conf/sentinel.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sed -i -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/27001/27003/g&amp;#39;&lt;/span&gt; -e &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/s1/s3/g&amp;#39;&lt;/span&gt; s3/conf/sentinel.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;33启动&#34;&gt;
    &lt;a href=&#34;#33%e5%90%af%e5%8a%a8&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.3.启动
&lt;/h2&gt;&lt;p&gt;为了方便查看日志，我们打开3个ssh窗口，分别启动3个redis实例，启动命令：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-30-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-30-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-30-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-30-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-30-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-30-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-30-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-30-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-30-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-30-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-30-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-30-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 第1个&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./redis-sentinel s1/conf/sentinel.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 第2个&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./redis-sentinel s2/conf/sentinel.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 第3个&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./redis-sentinel s3/conf/sentinel.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;启动后：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653729357-bc6fddb5d37800.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210701220714104&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h2 id=&#34;34测试&#34;&gt;
    &lt;a href=&#34;#34%e6%b5%8b%e8%af%95&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.4.测试
&lt;/h2&gt;&lt;p&gt;尝试让master节点7001宕机，查看sentinel日志：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653729357-6af367b72569d4.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210701222857997&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;查看7003的日志：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653729357-0ec7a871b21fe0.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210701223025709&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;查看7002的日志：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653729357-6525d09fb941b5.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210701223131264&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h1 id=&#34;4搭建分片集群&#34;&gt;
    &lt;a href=&#34;#4%e6%90%ad%e5%bb%ba%e5%88%86%e7%89%87%e9%9b%86%e7%be%a4&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.搭建分片集群
&lt;/h1&gt;&lt;h2 id=&#34;41集群结构&#34;&gt;
    &lt;a href=&#34;#41%e9%9b%86%e7%be%a4%e7%bb%93%e6%9e%84&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.1.集群结构
&lt;/h2&gt;&lt;p&gt;分片集群需要的节点数量较多，这里我们搭建一个最小的分片集群，包含3个master节点，每个master包含一个slave节点，结构如下：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653729357-27acba59e1ebb0.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210702164116027&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;这里我们会在同一台虚拟机中开启6个redis实例，模拟分片集群，信息如下：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;IP&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;PORT&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;角色&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;192.168.150.101&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;7001&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;master&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;192.168.150.101&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;7002&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;master&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;192.168.150.101&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;7003&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;master&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;192.168.150.101&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;8001&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;slave&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;192.168.150.101&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;8002&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;slave&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;192.168.150.101&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;8003&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;slave&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;42准备实例和配置&#34;&gt;
    &lt;a href=&#34;#42%e5%87%86%e5%a4%87%e5%ae%9e%e4%be%8b%e5%92%8c%e9%85%8d%e7%bd%ae&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.2.准备实例和配置
&lt;/h2&gt;&lt;p&gt;删除之前的7001、7002、7003这几个目录，重新创建出7001、7002、7003、8001、8002、8003目录：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-31-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-31-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-31-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-31-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-31-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-31-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-31-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-31-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-31-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-31-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-31-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-31-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 进入/tmp目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /tmp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 删除旧的，避免配置干扰&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -rf &lt;span class=&#34;m&#34;&gt;7001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7002&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7003&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 创建目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir &lt;span class=&#34;m&#34;&gt;7001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7002&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7003&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;8001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;8002&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;8003&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;在/tmp下准备一个新的redis.conf文件，内容如下：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-12&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-13&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-14&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-15&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-16&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-17&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-18&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-19&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-20&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-21&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;port 6379&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 开启集群功能&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;cluster-enabled yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 集群的配置文件名称，不需要我们创建，由redis自己维护&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;cluster-config-file /tmp/6379/nodes.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 节点心跳失败的超时时间&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;cluster-node-timeout 5000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 持久化文件存放目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;dir /tmp/6379&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 绑定地址&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;bind 0.0.0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 让redis后台运行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;daemonize yes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 注册的实例ip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;replica-announce-ip 192.168.150.101&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 保护模式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;protected-mode no&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 数据库数量&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;databases 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 日志&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;logfile /tmp/6379/run.log&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;将这个文件拷贝到每个目录下：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-33-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-33-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-33-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-33-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-33-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-33-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-33-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-33-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 进入/tmp目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /tmp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 执行拷贝&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7002&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7003&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;8001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;8002&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;8003&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; xargs -t -n &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; cp redis.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;修改每个目录下的redis.conf，将其中的6379修改为与所在目录一致：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-34-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-34-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-34-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-34-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-34-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-34-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-34-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-34-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 进入/tmp目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /tmp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 修改配置文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;%s\n&amp;#39;&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7002&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7003&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;8001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;8002&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;8003&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; xargs -I&lt;span class=&#34;o&#34;&gt;{}&lt;/span&gt; -t sed -i &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/6379/{}/g&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{}&lt;/span&gt;/redis.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;43启动&#34;&gt;
    &lt;a href=&#34;#43%e5%90%af%e5%8a%a8&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.3.启动
&lt;/h2&gt;&lt;p&gt;因为已经配置了后台启动模式，所以可以直接启动服务：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-35-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-35-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-35-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-35-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-35-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-35-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-35-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-35-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 进入/tmp目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /tmp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 一键启动所有服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;%s\n&amp;#39;&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7002&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7003&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;8001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;8002&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;8003&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; xargs -I&lt;span class=&#34;o&#34;&gt;{}&lt;/span&gt; -t redis-server &lt;span class=&#34;o&#34;&gt;{}&lt;/span&gt;/redis.conf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;通过ps查看状态：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-36-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-36-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ps -ef &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep redis&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;发现服务都已经正常启动：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653729357-28548ea5bd760a.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210702174255799&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;如果要关闭所有进程，可以执行命令：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-37-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-37-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ps -ef &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep redis &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; awk &lt;span class=&#34;s1&#34;&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; xargs kill&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;或者（推荐这种方式）：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-38-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-38-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;printf&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;%s\n&amp;#39;&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7002&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;7003&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;8001&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;8002&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;8003&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; xargs -I&lt;span class=&#34;o&#34;&gt;{}&lt;/span&gt; -t redis-cli -p &lt;span class=&#34;o&#34;&gt;{}&lt;/span&gt; shutdown&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;44创建集群&#34;&gt;
    &lt;a href=&#34;#44%e5%88%9b%e5%bb%ba%e9%9b%86%e7%be%a4&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.4.创建集群
&lt;/h2&gt;&lt;p&gt;虽然服务启动了，但是目前每个服务之间都是独立的，没有任何关联。&lt;/p&gt;
&lt;p&gt;我们需要执行命令来创建集群，在Redis5.0之前创建集群比较麻烦，5.0之后集群管理命令都集成到了redis-cli中。&lt;/p&gt;
&lt;p&gt;1）Redis5.0之前&lt;/p&gt;
&lt;p&gt;Redis5.0之前集群命令都是用redis安装包下的src/redis-trib.rb来实现的。因为redis-trib.rb是有ruby语言编写的所以需要安装ruby环境。&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 安装依赖&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;yum -y install zlib ruby rubygems
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gem install redis&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;然后通过命令来管理集群：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-40-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-40-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-40-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-40-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-40-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-40-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-40-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-40-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 进入redis的src目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /tmp/redis-6.2.4/src
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 创建集群&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./redis-trib.rb create --replicas &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; 192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 192.168.150.101:8001 192.168.150.101:8002 192.168.150.101:8003&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;2）Redis5.0以后&lt;/p&gt;
&lt;p&gt;我们使用的是Redis6.2.4版本，集群管理以及集成到了redis-cli中，格式如下：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-41-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-41-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;redis-cli --cluster create --cluster-replicas &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; 192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 192.168.150.101:8001 192.168.150.101:8002 192.168.150.101:8003&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;命令说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;redis-cli --cluster&lt;/code&gt;或者&lt;code&gt;./redis-trib.rb&lt;/code&gt;：代表集群操作命令&lt;/li&gt;
&lt;li&gt;&lt;code&gt;create&lt;/code&gt;：代表是创建集群&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--replicas 1&lt;/code&gt;或者&lt;code&gt;--cluster-replicas 1&lt;/code&gt; ：指定集群中每个master的副本个数为1，此时&lt;code&gt;节点总数 ÷ (replicas + 1)&lt;/code&gt; 得到的就是master的数量。因此节点列表中的前n个就是master，其它节点都是slave节点，随机分配到不同master&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;运行后的样子：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653729357-b9af0677819ec1.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210702181101969&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;这里输入yes，则集群开始创建：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653729357-ec690821ac407c.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210702181215705&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;通过命令可以查看集群状态：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;redis-cli -p &lt;span class=&#34;m&#34;&gt;7001&lt;/span&gt; cluster nodes&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653729357-55d6509561013d.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210702181922809&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h2 id=&#34;45测试&#34;&gt;
    &lt;a href=&#34;#45%e6%b5%8b%e8%af%95&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.5.测试
&lt;/h2&gt;&lt;p&gt;尝试连接7001节点，存储一个数据：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-43-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-43-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-43-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-43-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-43-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-43-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-43-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-43-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-43-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-43-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-43-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-43-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-43-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-43-7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-43-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-43-8&#34;&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 连接&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;redis-cli -p &lt;span class=&#34;m&#34;&gt;7001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 存储数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; num &lt;span class=&#34;m&#34;&gt;123&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 读取数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;get num
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 再次存储&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; a &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;结果悲剧了：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653729357-1ba2282ec576ba.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210702182343979&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;集群操作时，需要给&lt;code&gt;redis-cli&lt;/code&gt;加上&lt;code&gt;-c&lt;/code&gt;参数才可以：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;redis-cli -c -p &lt;span class=&#34;m&#34;&gt;7001&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;这次可以了：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653729357-913a4f83c931e6.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210702182602145&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
</description>
        </item>
        <item>
        <title>多级缓存</title>
        <link>https://qh.1357810.xyz/articles/redis/multistage-cache/</link>
        <pubDate>Mon, 04 Sep 2023 02:02:09 +0800</pubDate>
        
        <guid>https://qh.1357810.xyz/articles/redis/multistage-cache/</guid>
        <description>&lt;h1 id=&#34;多级缓存&#34;&gt;
    &lt;a href=&#34;#%e5%a4%9a%e7%ba%a7%e7%bc%93%e5%ad%98&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    多级缓存
&lt;/h1&gt;&lt;h1 id=&#34;0学习目标&#34;&gt;
    &lt;a href=&#34;#0%e5%ad%a6%e4%b9%a0%e7%9b%ae%e6%a0%87&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    0.学习目标
&lt;/h1&gt;&lt;h1 id=&#34;1什么是多级缓存&#34;&gt;
    &lt;a href=&#34;#1%e4%bb%80%e4%b9%88%e6%98%af%e5%a4%9a%e7%ba%a7%e7%bc%93%e5%ad%98&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    1.什么是多级缓存
&lt;/h1&gt;&lt;p&gt;传统的缓存策略一般是请求到达Tomcat后，先查询Redis，如果未命中则查询数据库，如图：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-eb89404eee39b3.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821075259137&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;存在下面的问题：&lt;/p&gt;
&lt;p&gt;•请求要经过Tomcat处理，Tomcat的性能成为整个系统的瓶颈&lt;/p&gt;
&lt;p&gt;•Redis缓存失效时，会对数据库产生冲击&lt;/p&gt;
&lt;p&gt;多级缓存就是充分利用请求处理的每个环节，分别添加缓存，减轻Tomcat压力，提升服务性能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;浏览器访问静态资源时，优先读取浏览器本地缓存&lt;/li&gt;
&lt;li&gt;访问非静态资源（ajax查询数据）时，访问服务端&lt;/li&gt;
&lt;li&gt;请求到达Nginx后，优先读取Nginx本地缓存&lt;/li&gt;
&lt;li&gt;如果Nginx本地缓存未命中，则去直接查询Redis（不经过Tomcat）&lt;/li&gt;
&lt;li&gt;如果Redis查询未命中，则查询Tomcat&lt;/li&gt;
&lt;li&gt;请求进入Tomcat后，优先查询JVM进程缓存&lt;/li&gt;
&lt;li&gt;如果JVM进程缓存未命中，则查询数据库&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-8375b2b1bbd609.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821075558137&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;在多级缓存架构中，Nginx内部需要编写本地缓存查询、Redis查询、Tomcat查询的业务逻辑，因此这样的nginx服务不再是一个&lt;strong&gt;反向代理服务器&lt;/strong&gt;，而是一个编写&lt;strong&gt;业务的Web服务器了&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;因此这样的业务Nginx服务也需要搭建集群来提高并发，再有专门的nginx服务来做反向代理，如图：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-df4a5105292095.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821080511581&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;另外，我们的Tomcat服务将来也会部署为集群模式：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-81085f6bc6d957.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821080954947&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;可见，多级缓存的关键有两个：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;一个是在nginx中编写业务，实现nginx本地缓存、Redis、Tomcat的查询&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;另一个就是在Tomcat中实现JVM进程缓存&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其中Nginx编程则会用到OpenResty框架结合Lua这样的语言。&lt;/p&gt;
&lt;p&gt;这也是今天课程的难点和重点。&lt;/p&gt;
&lt;h1 id=&#34;2jvm进程缓存&#34;&gt;
    &lt;a href=&#34;#2jvm%e8%bf%9b%e7%a8%8b%e7%bc%93%e5%ad%98&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    2.JVM进程缓存
&lt;/h1&gt;&lt;p&gt;为了演示多级缓存的案例，我们先准备一个商品查询的业务。&lt;/p&gt;
&lt;h2 id=&#34;21导入案例&#34;&gt;
    &lt;a href=&#34;#21%e5%af%bc%e5%85%a5%e6%a1%88%e4%be%8b&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    2.1.导入案例
&lt;/h2&gt;&lt;p&gt;参考课前资料的：《案例导入说明.md》&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-b2af2581954953.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821081418456&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h2 id=&#34;22初识caffeine&#34;&gt;
    &lt;a href=&#34;#22%e5%88%9d%e8%af%86caffeine&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    2.2.初识Caffeine
&lt;/h2&gt;&lt;p&gt;缓存在日常开发中启动至关重要的作用，由于是存储在内存中，数据的读取速度是非常快的，能大量减少对数据库的访问，减少数据库的压力。我们把缓存分为两类：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;分布式缓存，例如Redis：
&lt;ul&gt;
&lt;li&gt;优点：存储容量更大、可靠性更好、可以在集群间共享&lt;/li&gt;
&lt;li&gt;缺点：访问缓存有网络开销&lt;/li&gt;
&lt;li&gt;场景：缓存数据量较大、可靠性要求较高、需要在集群间共享&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;进程本地缓存，例如HashMap、GuavaCache：
&lt;ul&gt;
&lt;li&gt;优点：读取本地内存，没有网络开销，速度更快&lt;/li&gt;
&lt;li&gt;缺点：存储容量有限、可靠性较低、无法共享&lt;/li&gt;
&lt;li&gt;场景：性能要求较高，缓存数据量较小&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们今天会利用Caffeine框架来实现JVM进程缓存。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Caffeine&lt;/strong&gt;是一个基于Java8开发的，提供了近乎最佳命中率的高性能的本地缓存库。目前Spring内部的缓存使用的就是Caffeine。GitHub地址：https://github.com/ben-manes/caffeine&lt;/p&gt;
&lt;p&gt;Caffeine的性能非常好，下图是官方给出的性能对比：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-f20ec75962340b.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821081826399&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;可以看到Caffeine的性能遥遥领先！&lt;/p&gt;
&lt;p&gt;缓存使用的基本API：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-12&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-13&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-14&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-15&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-16&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-17&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-18&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-19&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-20&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-21&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-0-22&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-0-22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Test&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;testBasicOps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 构建cache对象&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Cache&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cache&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Caffeine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;newBuilder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 存数据&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;put&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;gf&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;迪丽热巴&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 取数据&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gf&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getIfPresent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;gf&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;gf = &amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 取数据，包含两个参数：&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 参数一：缓存的key&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 参数二：Lambda表达式，表达式参数就是缓存的key，方法体是查询数据库的逻辑&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 优先根据key查询JVM缓存，如果未命中，则执行参数二的Lambda表达式&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;defaultGF&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;defaultGF&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 根据key去数据库查询数据&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;柳岩&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;defaultGF = &amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;defaultGF&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Caffeine既然是缓存的一种，肯定需要有缓存的清除策略，不然的话内存总会有耗尽的时候。&lt;/p&gt;
&lt;p&gt;Caffeine提供了三种缓存驱逐策略：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;基于容量&lt;/strong&gt;：设置缓存的数量上限&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-1-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-1-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 创建缓存对象&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Cache&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cache&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Caffeine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;newBuilder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;maximumSize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 设置缓存大小上限为 1&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;基于时间&lt;/strong&gt;：设置缓存的有效时间&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-2-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-2-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 创建缓存对象&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Cache&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cache&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Caffeine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;newBuilder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 设置缓存有效期为 10 秒，从最后一次写入开始计时 &lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;expireAfterWrite&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Duration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;ofSeconds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;基于引用&lt;/strong&gt;：设置缓存为软引用或弱引用，利用GC来回收缓存数据。性能较差，不建议使用。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：在默认情况下，当一个缓存元素过期的时候，Caffeine不会自动立即将其清理和驱逐。而是在一次读或写操作后，或者在空闲时间完成对失效数据的驱逐。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;23实现jvm进程缓存&#34;&gt;
    &lt;a href=&#34;#23%e5%ae%9e%e7%8e%b0jvm%e8%bf%9b%e7%a8%8b%e7%bc%93%e5%ad%98&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    2.3.实现JVM进程缓存
&lt;/h2&gt;&lt;h3 id=&#34;231需求&#34;&gt;
    &lt;a href=&#34;#231%e9%9c%80%e6%b1%82&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    2.3.1.需求
&lt;/h3&gt;&lt;p&gt;利用Caffeine实现下列需求：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;给根据id查询商品的业务添加缓存，缓存未命中时查询数据库&lt;/li&gt;
&lt;li&gt;给根据id查询商品库存的业务添加缓存，缓存未命中时查询数据库&lt;/li&gt;
&lt;li&gt;缓存初始大小为100&lt;/li&gt;
&lt;li&gt;缓存上限为10000&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;232实现&#34;&gt;
    &lt;a href=&#34;#232%e5%ae%9e%e7%8e%b0&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    2.3.2.实现
&lt;/h3&gt;&lt;p&gt;首先，我们需要定义两个Caffeine的缓存对象，分别保存商品、库存的缓存数据。&lt;/p&gt;
&lt;p&gt;在item-service的&lt;code&gt;com.heima.item.config&lt;/code&gt;包下定义&lt;code&gt;CaffeineConfig&lt;/code&gt;类：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-12&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-13&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-14&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-15&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-16&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-17&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-18&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-19&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-20&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-21&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-22&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-23&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-24&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-25&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-26&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-27&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-3-28&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-3-28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.heima.item.config&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.github.benmanes.caffeine.cache.Cache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.github.benmanes.caffeine.cache.Caffeine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.heima.item.pojo.Item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.heima.item.pojo.ItemStock&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.springframework.context.annotation.Bean&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.springframework.context.annotation.Configuration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Configuration&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;CaffeineConfig&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Bean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Cache&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Long&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;itemCache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(){&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Caffeine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;newBuilder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;initialCapacity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;maximumSize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;10_000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Bean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Cache&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Long&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ItemStock&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;stockCache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(){&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Caffeine&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;newBuilder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;initialCapacity&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;100&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;maximumSize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;10_000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;然后，修改item-service中的&lt;code&gt;com.heima.item.web&lt;/code&gt;包下的ItemController类，添加缓存逻辑：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-12&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-13&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-14&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-15&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-16&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-17&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-18&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-19&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-20&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-21&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-22&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-23&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-24&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-25&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-26&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-27&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-28&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-4-29&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-4-29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@RestController&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@RequestMapping&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;item&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;ItemController&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Autowired&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IItemService&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;itemService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Autowired&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IItemStockService&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stockService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Autowired&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Cache&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Long&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;itemCache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Autowired&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Cache&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Long&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ItemStock&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stockCache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// ...其它略&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@GetMapping&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/{id}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Item&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;findById&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@PathVariable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Long&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;itemCache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;itemService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;query&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;ne&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;eq&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;one&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@GetMapping&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;/stock/{id}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ItemStock&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;findStockById&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@PathVariable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Long&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stockCache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stockService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getById&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h1 id=&#34;3lua语法入门&#34;&gt;
    &lt;a href=&#34;#3lua%e8%af%ad%e6%b3%95%e5%85%a5%e9%97%a8&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.Lua语法入门
&lt;/h1&gt;&lt;p&gt;Nginx编程需要用到Lua语言，因此我们必须先入门Lua的基本语法。&lt;/p&gt;
&lt;h2 id=&#34;31初识lua&#34;&gt;
    &lt;a href=&#34;#31%e5%88%9d%e8%af%86lua&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.1.初识Lua
&lt;/h2&gt;&lt;p&gt;Lua 是一种轻量小巧的脚本语言，用标准C语言编写并以源代码形式开放， 其设计目的是为了嵌入应用程序中，从而为应用程序提供灵活的扩展和定制功能。官网：https://www.lua.org/&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-057a4204125018.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821091437975&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;Lua经常嵌入到C语言开发的程序中，例如游戏开发、游戏插件等。&lt;/p&gt;
&lt;p&gt;Nginx本身也是C语言开发，因此也允许基于Lua做拓展。&lt;/p&gt;
&lt;h2 id=&#34;31helloworld&#34;&gt;
    &lt;a href=&#34;#31helloworld&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.1.HelloWorld
&lt;/h2&gt;&lt;p&gt;CentOS7默认已经安装了Lua语言环境，所以可以直接运行Lua代码。&lt;/p&gt;
&lt;p&gt;1）在Linux虚拟机的任意目录下，新建一个hello.lua文件&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-fab5c642b72efe.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821091621308&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;2）添加下面的内容&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-5-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-5-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Hello World!&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;3）运行&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-1de9ff5caeff58.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821091638140&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h2 id=&#34;32变量和循环&#34;&gt;
    &lt;a href=&#34;#32%e5%8f%98%e9%87%8f%e5%92%8c%e5%be%aa%e7%8e%af&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.2.变量和循环
&lt;/h2&gt;&lt;p&gt;学习任何语言必然离不开变量，而变量的声明必须先知道数据的类型。&lt;/p&gt;
&lt;h3 id=&#34;321lua的数据类型&#34;&gt;
    &lt;a href=&#34;#321lua%e7%9a%84%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.2.1.Lua的数据类型
&lt;/h3&gt;&lt;p&gt;Lua中支持的常见数据类型包括：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-729da0339c5950.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821091835406&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;另外，Lua提供了type()函数来判断一个变量的数据类型：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-048efcee904502.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821091904332&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h3 id=&#34;322声明变量&#34;&gt;
    &lt;a href=&#34;#322%e5%a3%b0%e6%98%8e%e5%8f%98%e9%87%8f&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.2.2.声明变量
&lt;/h3&gt;&lt;p&gt;Lua声明变量的时候无需指定数据类型，而是用local来声明变量为局部变量：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-6-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-6-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-6-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-6-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-6-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-6-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-6-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-6-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-6-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-6-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-6-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-6-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-6-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-6-7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-6-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-6-8&#34;&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 声明字符串，可以用单引号或双引号，&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;hello&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 字符串拼接可以使用 ..&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;str2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;hello&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;world&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 声明数字&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;num&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;21&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 声明布尔类型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;flag&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Lua中的table类型既可以作为数组，又可以作为Java中的map来使用。数组就是特殊的table，key是数组角标而已：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-7-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-7-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-7-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-7-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-7-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-7-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-7-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-7-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 声明数组 ，key为角标的 table&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;arr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;java&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;python&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;lua&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 声明table，类似java的map&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Jack&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;age&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Lua中的数组角标是从1开始，访问的时候与Java中类似：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-8-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-8-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-8-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-8-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 访问数组，lua数组的角标从1开始&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Lua中的table可以用key来访问：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-9-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-9-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-9-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-9-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-9-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-9-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 访问table&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map.name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;323循环&#34;&gt;
    &lt;a href=&#34;#323%e5%be%aa%e7%8e%af&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.2.3.循环
&lt;/h3&gt;&lt;p&gt;对于table，我们可以利用for循环来遍历。不过数组和普通table遍历略有差异。&lt;/p&gt;
&lt;p&gt;遍历数组：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-10-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-10-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-10-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-10-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-10-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-10-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-10-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-10-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-10-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-10-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-10-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-10-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 声明数组 key为索引的 table&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;arr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;java&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;python&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;lua&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 遍历数组&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ipairs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;遍历普通table&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-11-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-11-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-11-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-11-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-11-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-11-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-11-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-11-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-11-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-11-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-11-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-11-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 声明map，也就是table&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Jack&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;age&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 遍历table&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pairs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;n&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;33条件控制函数&#34;&gt;
    &lt;a href=&#34;#33%e6%9d%a1%e4%bb%b6%e6%8e%a7%e5%88%b6%e5%87%bd%e6%95%b0&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.3.条件控制、函数
&lt;/h2&gt;&lt;p&gt;Lua中的条件控制和函数声明与Java类似。&lt;/p&gt;
&lt;h3 id=&#34;331函数&#34;&gt;
    &lt;a href=&#34;#331%e5%87%bd%e6%95%b0&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.3.1.函数
&lt;/h3&gt;&lt;p&gt;定义函数的语法：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-12-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-12-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-12-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-12-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-12-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-12-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-12-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-12-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;函数名&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argument1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argument2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;...,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argumentn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;-- 函数体&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;返回值&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;例如，定义一个函数，用来打印数组：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-13-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-13-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-13-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-13-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-13-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-13-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-13-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-13-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-13-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-13-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;printArr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ipairs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;332条件控制&#34;&gt;
    &lt;a href=&#34;#332%e6%9d%a1%e4%bb%b6%e6%8e%a7%e5%88%b6&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.3.2.条件控制
&lt;/h3&gt;&lt;p&gt;类似Java的条件控制，例如if、else语法：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-14-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-14-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-14-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-14-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-14-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-14-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-14-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-14-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-14-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-14-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-14-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-14-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;布尔表达式&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;c1&#34;&gt;--[ 布尔表达式为 true 时执行该语句块 --]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;c1&#34;&gt;--[ 布尔表达式为 false 时执行该语句块 --]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;与java不同，布尔表达式中的逻辑运算是基于英文单词：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-537c133f0b3967.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821092657918&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h3 id=&#34;333案例&#34;&gt;
    &lt;a href=&#34;#333%e6%a1%88%e4%be%8b&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3.3.3.案例
&lt;/h3&gt;&lt;p&gt;需求：自定义一个函数，可以打印table，当参数为nil时，打印错误信息&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-15-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-15-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-15-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-15-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-15-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-15-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-15-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-15-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-15-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-15-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-15-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-15-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-15-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-15-7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-15-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-15-8&#34;&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-15-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-15-9&#34;&gt;9&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;printArr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;arr&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;数组不能为空！&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    		&lt;span class=&#34;kr&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ipairs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h1 id=&#34;4实现多级缓存&#34;&gt;
    &lt;a href=&#34;#4%e5%ae%9e%e7%8e%b0%e5%a4%9a%e7%ba%a7%e7%bc%93%e5%ad%98&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.实现多级缓存
&lt;/h1&gt;&lt;p&gt;多级缓存的实现离不开Nginx编程，而Nginx编程又离不开OpenResty。&lt;/p&gt;
&lt;h2 id=&#34;41安装openresty&#34;&gt;
    &lt;a href=&#34;#41%e5%ae%89%e8%a3%85openresty&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.1.安装OpenResty
&lt;/h2&gt;&lt;p&gt;OpenResty® 是一个基于 Nginx的高性能 Web 平台，用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。具备下列特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;具备Nginx的完整功能&lt;/li&gt;
&lt;li&gt;基于Lua语言进行扩展，集成了大量精良的 Lua 库、第三方模块&lt;/li&gt;
&lt;li&gt;允许使用Lua&lt;strong&gt;自定义业务逻辑&lt;/strong&gt;、&lt;strong&gt;自定义库&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;官方网站： &lt;a class=&#34;link&#34; href=&#34;https://openresty.org/cn/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://openresty.org/cn/


&lt;span style=&#34;white-space: nowrap;&#34; class=&#34;link-text iconfont-logan icon-logan-arrow-up-right-from-square-solid&#34;&gt;&lt;/span&gt;

&lt;/a&gt;


&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-7a8099d87cdcab.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821092902946&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;安装Lua可以参考课前资料提供的《安装OpenResty.md》：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-1b4ef4aead47af.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821092941139&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h2 id=&#34;42openresty快速入门&#34;&gt;
    &lt;a href=&#34;#42openresty%e5%bf%ab%e9%80%9f%e5%85%a5%e9%97%a8&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.2.OpenResty快速入门
&lt;/h2&gt;&lt;p&gt;我们希望达到的多级缓存架构如图：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-e50eca97f7c6ff.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;yeVDlwtfMx&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;其中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;windows上的nginx用来做反向代理服务，将前端的查询商品的ajax请求代理到OpenResty集群&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OpenResty集群用来编写多级缓存业务&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;421反向代理流程&#34;&gt;
    &lt;a href=&#34;#421%e5%8f%8d%e5%90%91%e4%bb%a3%e7%90%86%e6%b5%81%e7%a8%8b&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.2.1.反向代理流程
&lt;/h3&gt;&lt;p&gt;现在，商品详情页使用的是假的商品数据。不过在浏览器中，可以看到页面有发起ajax请求查询真实商品数据。&lt;/p&gt;
&lt;p&gt;这个请求如下：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-21296cd1182ac1.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821093144700&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;请求地址是localhost，端口是80，就被windows上安装的Nginx服务给接收到了。然后代理给了OpenResty集群：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-ae76b337687b05.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821094447709&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;我们需要在OpenResty中编写业务，查询商品数据并返回到浏览器。&lt;/p&gt;
&lt;p&gt;但是这次，我们先在OpenResty接收请求，返回假的商品数据。&lt;/p&gt;
&lt;h3 id=&#34;422openresty监听请求&#34;&gt;
    &lt;a href=&#34;#422openresty%e7%9b%91%e5%90%ac%e8%af%b7%e6%b1%82&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.2.2.OpenResty监听请求
&lt;/h3&gt;&lt;p&gt;OpenResty的很多功能都依赖于其目录下的Lua库，需要在nginx.conf中指定依赖库的目录，并导入依赖：&lt;/p&gt;
&lt;p&gt;1）添加对OpenResty的Lua模块的加载&lt;/p&gt;
&lt;p&gt;修改&lt;code&gt;/usr/local/openresty/nginx/conf/nginx.conf&lt;/code&gt;文件，在其中的http下面，添加下面代码：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-16-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-16-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-16-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-16-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-16-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-16-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-16-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-16-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#lua 模块
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;lua_package_path&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;/usr/local/openresty/lualib/?.lua&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;;&lt;span class=&#34;k&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#c模块     
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;lua_package_cpath&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;/usr/local/openresty/lualib/?.so&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;;&lt;span class=&#34;k&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;2）监听/api/item路径&lt;/p&gt;
&lt;p&gt;修改&lt;code&gt;/usr/local/openresty/nginx/conf/nginx.conf&lt;/code&gt;文件，在nginx.conf的server下面，添加对/api/item这个路径的监听：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-17-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-17-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-17-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-17-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-17-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-17-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-17-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-17-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-17-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-17-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-17-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-17-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;location&lt;/span&gt;  &lt;span class=&#34;s&#34;&gt;/api/item&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# 默认的响应类型
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;default_type&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;application/json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# 响应结果由lua/item.lua文件来决定
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;content_by_lua_file&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;lua/item.lua&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;这个监听，就类似于SpringMVC中的&lt;code&gt;@GetMapping(&amp;quot;/api/item&amp;quot;)&lt;/code&gt;做路径映射。&lt;/p&gt;
&lt;p&gt;而&lt;code&gt;content_by_lua_file lua/item.lua&lt;/code&gt;则相当于调用item.lua这个文件，执行其中的业务，把结果返回给用户。相当于java中调用service。&lt;/p&gt;
&lt;h3 id=&#34;423编写itemlua&#34;&gt;
    &lt;a href=&#34;#423%e7%bc%96%e5%86%99itemlua&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.2.3.编写item.lua
&lt;/h3&gt;&lt;p&gt;1）在&lt;code&gt;/usr/loca/openresty/nginx&lt;/code&gt;目录创建文件夹：lua&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-0e0970413481d4.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821100755080&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;2）在&lt;code&gt;/usr/loca/openresty/nginx/lua&lt;/code&gt;文件夹下，新建文件：item.lua&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-9efe6774755068.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821100801756&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;3）编写item.lua，返回假数据&lt;/p&gt;
&lt;p&gt;item.lua中，利用ngx.say()函数返回数据到Response中&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-18-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-18-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ngx.say&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;id&amp;#34;:10001,&amp;#34;name&amp;#34;:&amp;#34;SALSA AIR&amp;#34;,&amp;#34;title&amp;#34;:&amp;#34;RIMOWA 21寸托运箱拉杆箱 SALSA AIR系列果绿色 820.70.36.4&amp;#34;,&amp;#34;price&amp;#34;:17900,&amp;#34;image&amp;#34;:&amp;#34;https://m.360buyimg.com/mobilecms/s720x720_jfs/t6934/364/1195375010/84676/e9f2c55f/597ece38N0ddcbc77.jpg!q70.jpg.webp&amp;#34;,&amp;#34;category&amp;#34;:&amp;#34;拉杆箱&amp;#34;,&amp;#34;brand&amp;#34;:&amp;#34;RIMOWA&amp;#34;,&amp;#34;spec&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;status&amp;#34;:1,&amp;#34;createTime&amp;#34;:&amp;#34;2019-04-30T16:00:00.000+00:00&amp;#34;,&amp;#34;updateTime&amp;#34;:&amp;#34;2019-04-30T16:00:00.000+00:00&amp;#34;,&amp;#34;stock&amp;#34;:2999,&amp;#34;sold&amp;#34;:31290}&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;4）重新加载配置&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-19-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-19-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nginx -s reload&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;刷新商品页面：http://localhost/item.html?id=1001，即可看到效果：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-9dd11faefaf925.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821101217089&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h2 id=&#34;43请求参数处理&#34;&gt;
    &lt;a href=&#34;#43%e8%af%b7%e6%b1%82%e5%8f%82%e6%95%b0%e5%a4%84%e7%90%86&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.3.请求参数处理
&lt;/h2&gt;&lt;p&gt;上一节中，我们在OpenResty接收前端请求，但是返回的是假数据。&lt;/p&gt;
&lt;p&gt;要返回真实数据，必须根据前端传递来的商品id，查询商品信息才可以。&lt;/p&gt;
&lt;p&gt;那么如何获取前端传递的商品参数呢？&lt;/p&gt;
&lt;h3 id=&#34;431获取参数的api&#34;&gt;
    &lt;a href=&#34;#431%e8%8e%b7%e5%8f%96%e5%8f%82%e6%95%b0%e7%9a%84api&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.3.1.获取参数的API
&lt;/h3&gt;&lt;p&gt;OpenResty中提供了一些API用来获取不同类型的前端请求参数：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-5d98ce04789297.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821101433528&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h3 id=&#34;432获取参数并返回&#34;&gt;
    &lt;a href=&#34;#432%e8%8e%b7%e5%8f%96%e5%8f%82%e6%95%b0%e5%b9%b6%e8%bf%94%e5%9b%9e&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.3.2.获取参数并返回
&lt;/h3&gt;&lt;p&gt;在前端发起的ajax请求如图：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-eb224c9a5bc1c6.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821101721649&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;可以看到商品id是以路径占位符方式传递的，因此可以利用正则表达式匹配的方式来获取ID&lt;/p&gt;
&lt;p&gt;1）获取商品id&lt;/p&gt;
&lt;p&gt;修改&lt;code&gt;/usr/loca/openresty/nginx/nginx.conf&lt;/code&gt;文件中监听/api/item的代码，利用正则表达式获取ID：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-20-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-20-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-20-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-20-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-20-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-20-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-20-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-20-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-20-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-20-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-20-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-20-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;location&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;~&lt;/span&gt; &lt;span class=&#34;sr&#34;&gt;/api/item/(\d+)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# 默认的响应类型
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;default_type&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;application/json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# 响应结果由lua/item.lua文件来决定
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;content_by_lua_file&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;lua/item.lua&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;2）拼接ID并返回&lt;/p&gt;
&lt;p&gt;修改&lt;code&gt;/usr/loca/openresty/nginx/lua/item.lua&lt;/code&gt;文件，获取id并拼接到结果中返回：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-21-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-21-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-21-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-21-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-21-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-21-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-21-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-21-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 获取商品id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;id&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ngx.var&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 拼接并返回&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ngx.say&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;id&amp;#34;:&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;id&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;,&amp;#34;name&amp;#34;:&amp;#34;SALSA AIR&amp;#34;,&amp;#34;title&amp;#34;:&amp;#34;RIMOWA 21寸托运箱拉杆箱 SALSA AIR系列果绿色 820.70.36.4&amp;#34;,&amp;#34;price&amp;#34;:17900,&amp;#34;image&amp;#34;:&amp;#34;https://m.360buyimg.com/mobilecms/s720x720_jfs/t6934/364/1195375010/84676/e9f2c55f/597ece38N0ddcbc77.jpg!q70.jpg.webp&amp;#34;,&amp;#34;category&amp;#34;:&amp;#34;拉杆箱&amp;#34;,&amp;#34;brand&amp;#34;:&amp;#34;RIMOWA&amp;#34;,&amp;#34;spec&amp;#34;:&amp;#34;&amp;#34;,&amp;#34;status&amp;#34;:1,&amp;#34;createTime&amp;#34;:&amp;#34;2019-04-30T16:00:00.000+00:00&amp;#34;,&amp;#34;updateTime&amp;#34;:&amp;#34;2019-04-30T16:00:00.000+00:00&amp;#34;,&amp;#34;stock&amp;#34;:2999,&amp;#34;sold&amp;#34;:31290}&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;3）重新加载并测试&lt;/p&gt;
&lt;p&gt;运行命令以重新加载OpenResty配置：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-22-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-22-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nginx -s reload&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;刷新页面可以看到结果中已经带上了ID：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-7295d9029a85fc.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821102235467&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h2 id=&#34;44查询tomcat&#34;&gt;
    &lt;a href=&#34;#44%e6%9f%a5%e8%af%a2tomcat&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.4.查询Tomcat
&lt;/h2&gt;&lt;p&gt;拿到商品ID后，本应去缓存中查询商品信息，不过目前我们还未建立nginx、redis缓存。因此，这里我们先根据商品id去tomcat查询商品信息。我们实现如图部分：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-1388dfa16a22b7.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821102610167&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;需要注意的是，我们的OpenResty是在虚拟机，Tomcat是在Windows电脑上。两者IP一定不要搞错了。&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-1b16be5b451132.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821102959829&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h3 id=&#34;441发送http请求的api&#34;&gt;
    &lt;a href=&#34;#441%e5%8f%91%e9%80%81http%e8%af%b7%e6%b1%82%e7%9a%84api&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.4.1.发送http请求的API
&lt;/h3&gt;&lt;p&gt;nginx提供了内部API用以发送http请求：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-23-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-23-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-23-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-23-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-23-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-23-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-23-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-23-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ngx.location&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;capture&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/path&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;method&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ngx.HTTP_GET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;   &lt;span class=&#34;c1&#34;&gt;-- 请求方式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;-- get方式传参数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;返回的响应内容包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;resp.status：响应状态码&lt;/li&gt;
&lt;li&gt;resp.header：响应头，是一个table&lt;/li&gt;
&lt;li&gt;resp.body：响应体，就是响应数据&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意：这里的path是路径，并不包含IP和端口。这个请求会被nginx内部的server监听并处理。&lt;/p&gt;
&lt;p&gt;但是我们希望这个请求发送到Tomcat服务器，所以还需要编写一个server来对这个路径做反向代理：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-24-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-24-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-24-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-24-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-24-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-24-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-24-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-24-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;k&#34;&gt;location&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/path&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;c1&#34;&gt;# 这里是windows电脑的ip和Java服务端口，需要确保windows防火墙处于关闭状态
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;kn&#34;&gt;proxy_pass&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;http://192.168.150.1:8081&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;原理如图：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-4a6f945aaaab7a.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821104149061&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h3 id=&#34;442封装http工具&#34;&gt;
    &lt;a href=&#34;#442%e5%b0%81%e8%a3%85http%e5%b7%a5%e5%85%b7&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.4.2.封装http工具
&lt;/h3&gt;&lt;p&gt;下面，我们封装一个发送Http请求的工具，基于ngx.location.capture来实现查询tomcat。&lt;/p&gt;
&lt;p&gt;1）添加反向代理，到windows的Java服务&lt;/p&gt;
&lt;p&gt;因为item-service中的接口都是/item开头，所以我们监听/item路径，代理到windows上的tomcat服务。&lt;/p&gt;
&lt;p&gt;修改 &lt;code&gt;/usr/local/openresty/nginx/conf/nginx.conf&lt;/code&gt;文件，添加一个location：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-25-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-25-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-25-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-25-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-25-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-25-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;location&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/item&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;proxy_pass&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;http://192.168.150.1:8081&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;以后，只要我们调用&lt;code&gt;ngx.location.capture(&amp;quot;/item&amp;quot;)&lt;/code&gt;，就一定能发送请求到windows的tomcat服务。&lt;/p&gt;
&lt;p&gt;2）封装工具类&lt;/p&gt;
&lt;p&gt;之前我们说过，OpenResty启动时会加载以下两个目录中的工具文件：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-614d3628a4f780.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821104857413&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;所以，自定义的http工具也需要放到这个目录下。&lt;/p&gt;
&lt;p&gt;在&lt;code&gt;/usr/local/openresty/lualib&lt;/code&gt;目录下，新建一个common.lua文件：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-26-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-26-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vi /usr/local/openresty/lualib/common.lua&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;内容如下:&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-12&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-13&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-14&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-15&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-16&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-17&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-27-18&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-27-18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 封装函数，发送http请求，并解析响应&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;read_http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ngx.location&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;capture&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;method&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ngx.HTTP_GET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;-- 记录错误信息，返回404&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ngx.log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ngx.ERR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;http请求查询失败, path: &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;, args: &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ngx.exit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;404&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resp.body&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 将方法导出&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_M&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;read_http&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_http&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_M&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;这个工具将read_http函数封装到_M这个table类型的变量中，并且返回，这类似于导出。&lt;/p&gt;
&lt;p&gt;使用的时候，可以利用&lt;code&gt;require(&#39;common&#39;)&lt;/code&gt;来导入该函数库，这里的common是函数库的文件名。&lt;/p&gt;
&lt;p&gt;3）实现商品查询&lt;/p&gt;
&lt;p&gt;最后，我们修改&lt;code&gt;/usr/local/openresty/lua/item.lua&lt;/code&gt;文件，利用刚刚封装的函数库实现对tomcat的查询：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-28-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-28-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-28-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-28-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-28-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-28-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-28-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-28-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-28-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-28-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-28-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-28-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-28-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-28-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-28-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-28-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-28-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-28-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-28-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-28-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 引入自定义common工具模块，返回值是common中返回的 _M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;common&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;common&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 从 common中获取read_http这个函数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_http&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;common.read_http&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 获取路径参数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;id&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ngx.var&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 根据id查询商品&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itemJSON&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/item/&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 根据id查询商品库存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itemStockJSON&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/item/stock/&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;这里查询到的结果是json字符串，并且包含商品、库存两个json字符串，页面最终需要的是把两个json拼接为一个json：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-321a54f60610b9.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821110441222&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;这就需要我们先把JSON变为lua的table，完成数据整合后，再转为JSON。&lt;/p&gt;
&lt;h3 id=&#34;443cjson工具类&#34;&gt;
    &lt;a href=&#34;#443cjson%e5%b7%a5%e5%85%b7%e7%b1%bb&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.4.3.CJSON工具类
&lt;/h3&gt;&lt;p&gt;OpenResty提供了一个cjson的模块用来处理JSON的序列化和反序列化。&lt;/p&gt;
&lt;p&gt;官方地址： &lt;a class=&#34;link&#34; href=&#34;https://github.com/openresty/lua-cjson/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/openresty/lua-cjson/


&lt;span style=&#34;white-space: nowrap;&#34; class=&#34;link-text iconfont-logan icon-logan-arrow-up-right-from-square-solid&#34;&gt;&lt;/span&gt;

&lt;/a&gt;


&lt;/p&gt;
&lt;p&gt;1）引入cjson模块：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-29-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-29-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cjson&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;require&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;cjson&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;2）序列化：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-30-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-30-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-30-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-30-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-30-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-30-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-30-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-30-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-30-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-30-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-30-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-30-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;obj&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;jack&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;age&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;21&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 把 table 序列化为 json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cjson.encode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;obj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;3）反序列化：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-31-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-31-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-31-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-31-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-31-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-31-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-31-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-31-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;name&amp;#34;: &amp;#34;jack&amp;#34;, &amp;#34;age&amp;#34;: 21}&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 反序列化 json为 table&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;obj&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cjson.decode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;obj.name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;444实现tomcat查询&#34;&gt;
    &lt;a href=&#34;#444%e5%ae%9e%e7%8e%b0tomcat%e6%9f%a5%e8%af%a2&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.4.4.实现Tomcat查询
&lt;/h3&gt;&lt;p&gt;下面，我们修改之前的item.lua中的业务，添加json处理功能：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-12&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-13&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-14&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-15&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-16&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-17&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-18&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-19&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-20&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-21&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-22&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-32-23&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-32-23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 导入common函数库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;common&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;common&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_http&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;common.read_http&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 导入cjson库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cjson&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;cjson&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 获取路径参数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;id&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ngx.var&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 根据id查询商品&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itemJSON&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/item/&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 根据id查询商品库存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itemStockJSON&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/item/stock/&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- JSON转化为lua的table&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cjson.decode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;itemJSON&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stock&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cjson.decode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stockJSON&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 组合数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;item.stock&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stock.stock&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;item.sold&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stock.sold&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 把item序列化为json 返回结果&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ngx.say&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cjson.encode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;445基于id负载均衡&#34;&gt;
    &lt;a href=&#34;#445%e5%9f%ba%e4%ba%8eid%e8%b4%9f%e8%bd%bd%e5%9d%87%e8%a1%a1&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.4.5.基于ID负载均衡
&lt;/h3&gt;&lt;p&gt;刚才的代码中，我们的tomcat是单机部署。而实际开发中，tomcat一定是集群模式：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-f4e9d584033c55.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821111023255&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;因此，OpenResty需要对tomcat集群做负载均衡。&lt;/p&gt;
&lt;p&gt;而默认的负载均衡规则是轮询模式，当我们查询/item/10001时：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一次会访问8081端口的tomcat服务，在该服务内部就形成了JVM进程缓存&lt;/li&gt;
&lt;li&gt;第二次会访问8082端口的tomcat服务，该服务内部没有JVM缓存（因为JVM缓存无法共享），会查询数据库&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;你看，因为轮询的原因，第一次查询8081形成的JVM缓存并未生效，直到下一次再次访问到8081时才可以生效，缓存命中率太低了。&lt;/p&gt;
&lt;p&gt;怎么办？&lt;/p&gt;
&lt;p&gt;如果能让同一个商品，每次查询时都访问同一个tomcat服务，那么JVM缓存就一定能生效了。&lt;/p&gt;
&lt;p&gt;也就是说，我们需要根据商品id做负载均衡，而不是轮询。&lt;/p&gt;
&lt;h4 id=&#34;1原理&#34;&gt;
    &lt;a href=&#34;#1%e5%8e%9f%e7%90%86&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    1）原理
&lt;/h4&gt;&lt;p&gt;nginx提供了基于请求路径做负载均衡的算法：&lt;/p&gt;
&lt;p&gt;nginx根据请求路径做hash运算，把得到的数值对tomcat服务的数量取余，余数是几，就访问第几个服务，实现负载均衡。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我们的请求路径是 /item/10001&lt;/li&gt;
&lt;li&gt;tomcat总数为2台（8081、8082）&lt;/li&gt;
&lt;li&gt;对请求路径/item/1001做hash运算求余的结果为1&lt;/li&gt;
&lt;li&gt;则访问第一个tomcat服务，也就是8081&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;只要id不变，每次hash运算结果也不会变，那就可以保证同一个商品，一直访问同一个tomcat服务，确保JVM缓存生效。&lt;/p&gt;
&lt;h4 id=&#34;2实现&#34;&gt;
    &lt;a href=&#34;#2%e5%ae%9e%e7%8e%b0&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    2）实现
&lt;/h4&gt;&lt;p&gt;修改&lt;code&gt;/usr/local/openresty/nginx/conf/nginx.conf&lt;/code&gt;文件，实现基于ID做负载均衡。&lt;/p&gt;
&lt;p&gt;首先，定义tomcat集群，并设置基于路径做负载均衡：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-33-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-33-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-33-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-33-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-33-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-33-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-33-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-33-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-33-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-33-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;upstream&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;tomcat-cluster&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;hash&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$request_uri&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;server&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;192.168.150.1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8081&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;server&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;192.168.150.1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8082&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;然后，修改对tomcat服务的反向代理，目标指向tomcat集群：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-34-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-34-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-34-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-34-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-34-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-34-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;location&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/item&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;proxy_pass&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;http://tomcat-cluster&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;重新加载OpenResty&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-35-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-35-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nginx -s reload&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h4 id=&#34;3测试&#34;&gt;
    &lt;a href=&#34;#3%e6%b5%8b%e8%af%95&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    3）测试
&lt;/h4&gt;&lt;p&gt;启动两台tomcat服务：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-b781aec8491469.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821112420464&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;同时启动：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-8892c3348a93ce.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821112444482&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;清空日志后，再次访问页面，可以看到不同id的商品，访问到了不同的tomcat服务：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-e5cee0b8a861f8.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821112559965&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-fef298ab79712f.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821112637430&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h2 id=&#34;45redis缓存预热&#34;&gt;
    &lt;a href=&#34;#45redis%e7%bc%93%e5%ad%98%e9%a2%84%e7%83%ad&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.5.Redis缓存预热
&lt;/h2&gt;&lt;p&gt;Redis缓存会面临冷启动问题：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;冷启动&lt;/strong&gt;：服务刚刚启动时，Redis中并没有缓存，如果所有商品数据都在第一次查询时添加缓存，可能会给数据库带来较大压力。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;缓存预热&lt;/strong&gt;：在实际开发中，我们可以利用大数据统计用户访问的热点数据，在项目启动时将这些热点数据提前查询并保存到Redis中。&lt;/p&gt;
&lt;p&gt;我们数据量较少，并且没有数据统计相关功能，目前可以在启动时将所有数据都放入缓存中。&lt;/p&gt;
&lt;p&gt;1）利用Docker安装Redis&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-36-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-36-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run --name redis -p 6379:6379 -d redis redis-server --appendonly yes&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;2）在item-service服务中引入Redis依赖&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-37-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-37-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-37-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-37-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-37-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-37-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-37-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-37-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span class=&#34;nt&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-data-redis&lt;span class=&#34;nt&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;3）配置Redis地址&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-38-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-38-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-38-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-38-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-38-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-38-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;spring&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;192.168.150.101&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;4）编写初始化类&lt;/p&gt;
&lt;p&gt;缓存预热需要在项目启动时完成，并且必须是拿到RedisTemplate之后。&lt;/p&gt;
&lt;p&gt;这里我们利用InitializingBean接口来实现，因为InitializingBean可以在对象被Spring创建并且成员变量全部注入后执行。&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-12&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-13&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-14&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-15&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-16&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-17&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-18&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-19&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-20&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-21&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-22&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-23&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-24&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-25&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-26&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-27&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-28&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-29&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-30&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-31&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-32&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-33&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-34&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-35&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-36&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-37&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-38&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-39&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-40&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-41&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-42&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-43&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-44&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-45&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-46&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-47&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-48&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-49&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-50&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-51&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-39-52&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-39-52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.heima.item.config&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.fasterxml.jackson.core.JsonProcessingException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.fasterxml.jackson.databind.ObjectMapper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.heima.item.pojo.Item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.heima.item.pojo.ItemStock&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.heima.item.service.IItemService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.heima.item.service.IItemStockService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.springframework.beans.factory.InitializingBean&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.springframework.beans.factory.annotation.Autowired&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.springframework.data.redis.core.StringRedisTemplate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.springframework.stereotype.Component&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.List&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Component&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;RedisHandler&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;implements&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;InitializingBean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Autowired&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StringRedisTemplate&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redisTemplate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Autowired&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IItemService&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;itemService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Autowired&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IItemStockService&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stockService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ObjectMapper&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MAPPER&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ObjectMapper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;afterPropertiesSet&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;throws&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Exception&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 初始化缓存&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 1.查询商品信息&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;itemList&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;itemService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 2.放入缓存&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Item&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;itemList&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 2.1.item序列化为JSON&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MAPPER&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;writeValueAsString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 2.2.存入redis&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redisTemplate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;opsForValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;item:id:&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getId&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 3.查询商品库存信息&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ItemStock&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stockList&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stockService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 4.放入缓存&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ItemStock&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stock&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stockList&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 2.1.item序列化为JSON&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MAPPER&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;writeValueAsString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stock&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 2.2.存入redis&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redisTemplate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;opsForValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;item:stock:id:&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stock&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getId&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;46查询redis缓存&#34;&gt;
    &lt;a href=&#34;#46%e6%9f%a5%e8%af%a2redis%e7%bc%93%e5%ad%98&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.6.查询Redis缓存
&lt;/h2&gt;&lt;p&gt;现在，Redis缓存已经准备就绪，我们可以再OpenResty中实现查询Redis的逻辑了。如下图红框所示：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-f2d6f7ca9499cf.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821113340111&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;当请求进入OpenResty之后：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;优先查询Redis缓存&lt;/li&gt;
&lt;li&gt;如果Redis缓存未命中，再查询Tomcat&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;461封装redis工具&#34;&gt;
    &lt;a href=&#34;#461%e5%b0%81%e8%a3%85redis%e5%b7%a5%e5%85%b7&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.6.1.封装Redis工具
&lt;/h3&gt;&lt;p&gt;OpenResty提供了操作Redis的模块，我们只要引入该模块就能直接使用。但是为了方便，我们将Redis操作封装到之前的common.lua工具库中。&lt;/p&gt;
&lt;p&gt;修改&lt;code&gt;/usr/local/openresty/lualib/common.lua&lt;/code&gt;文件：&lt;/p&gt;
&lt;p&gt;1）引入Redis模块，并初始化Redis对象&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-40-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-40-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-40-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-40-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-40-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-40-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-40-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-40-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-40-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-40-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 导入redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;redis&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;resty.redis&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 初始化redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;red&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;red&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;set_timeouts&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;2）封装函数，用来释放Redis连接，其实是放入连接池&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-41-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-41-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-41-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-41-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-41-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-41-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-41-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-41-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-41-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-41-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-41-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-41-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-41-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-41-7&#34;&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-41-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-41-8&#34;&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-41-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-41-9&#34;&gt;9&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 关闭redis连接的工具方法，其实是放入连接池&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;close_redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;red&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pool_max_idle_time&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10000&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;-- 连接的空闲时间，单位是毫秒&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pool_size&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;--连接池大小&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ok&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;red&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;set_keepalive&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pool_max_idle_time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pool_size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ok&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ngx.log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ngx.ERR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;放入redis连接池失败: &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;3）封装函数，根据key查询Redis数据&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-12&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-13&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-14&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-15&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-16&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-17&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-18&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-19&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-20&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-21&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-42-22&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-42-22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 查询redis的方法 ip和port是redis地址，key是查询的key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;read_redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;-- 获取一个连接&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ok&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;red&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;connect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ok&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ngx.log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ngx.ERR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;连接redis失败 : &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kr&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;-- 查询redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;red&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;-- 查询失败处理&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ngx.log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ngx.ERR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;查询Redis失败: &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;, key = &amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;--得到的数据为空处理&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ngx.null&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ngx.log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ngx.ERR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;查询Redis数据为空, key = &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;close_redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;red&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;4）导出&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-43-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-43-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-43-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-43-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-43-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-43-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-43-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-43-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-43-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-43-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-43-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-43-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 将方法导出&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_M&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;read_http&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;read_redis&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_M&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;完整的common.lua：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-12&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-13&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-14&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-15&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-16&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-17&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-18&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-19&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-20&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-21&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-22&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-23&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-24&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-25&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-26&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-27&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-28&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-29&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-30&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-31&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-32&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-33&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-34&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-35&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-36&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-37&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-38&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-39&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-40&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-41&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-42&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-43&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-44&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-45&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-46&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-47&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-48&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-49&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-50&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-51&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-52&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-53&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-53&#34;&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-54&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-54&#34;&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-55&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-55&#34;&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-56&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-56&#34;&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-57&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-57&#34;&gt;57&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-44-58&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-44-58&#34;&gt;58&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 导入redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;redis&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;resty.redis&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 初始化redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;red&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;red&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;set_timeouts&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 关闭redis连接的工具方法，其实是放入连接池&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;close_redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;red&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pool_max_idle_time&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10000&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;-- 连接的空闲时间，单位是毫秒&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pool_size&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;--连接池大小&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ok&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;red&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;set_keepalive&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pool_max_idle_time&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pool_size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ok&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ngx.log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ngx.ERR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;放入redis连接池失败: &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 查询redis的方法 ip和port是redis地址，key是查询的key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;read_redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;-- 获取一个连接&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ok&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;red&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;connect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ok&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ngx.log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ngx.ERR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;连接redis失败 : &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kr&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;-- 查询redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;red&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;-- 查询失败处理&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ngx.log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ngx.ERR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;查询Redis失败: &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;err&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;, key = &amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;--得到的数据为空处理&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ngx.null&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ngx.log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ngx.ERR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;查询Redis数据为空, key = &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;close_redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;red&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 封装函数，发送http请求，并解析响应&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;read_http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ngx.location&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;capture&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;method&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ngx.HTTP_GET&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resp&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;-- 记录错误信息，返回404&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ngx.log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ngx.ERR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;http查询失败, path: &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;, args: &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ngx.exit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;404&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resp.body&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 将方法导出&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_M&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;read_http&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;read_redis&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;_M&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;462实现redis查询&#34;&gt;
    &lt;a href=&#34;#462%e5%ae%9e%e7%8e%b0redis%e6%9f%a5%e8%af%a2&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.6.2.实现Redis查询
&lt;/h3&gt;&lt;p&gt;接下来，我们就可以去修改item.lua文件，实现对Redis的查询了。&lt;/p&gt;
&lt;p&gt;查询逻辑是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;根据id查询Redis&lt;/li&gt;
&lt;li&gt;如果查询失败则继续查询Tomcat&lt;/li&gt;
&lt;li&gt;将查询结果返回&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;1）修改&lt;code&gt;/usr/local/openresty/lua/item.lua&lt;/code&gt;文件，添加一个查询函数：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-45-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-45-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-45-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-45-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-45-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-45-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-45-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-45-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-45-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-45-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-45-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-45-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-45-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-45-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-45-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-45-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-45-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-45-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-45-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-45-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-45-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-45-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-45-12&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-45-12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-45-13&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-45-13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-45-14&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-45-14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-45-15&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-45-15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-45-16&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-45-16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-45-17&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-45-17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 导入common函数库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;common&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;common&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_http&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;common.read_http&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_redis&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;common.read_redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 封装查询函数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;read_data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;-- 查询本地缓存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;6379&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;-- 判断查询结果&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ngx.log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ngx.ERR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;redis查询失败，尝试查询http， key: &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;-- redis查询失败，去查询http&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;-- 返回数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;2）而后修改商品查询、库存查询的业务：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-2c26386414dbdd.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821114528954&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;3）完整的item.lua代码：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-12&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-13&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-14&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-15&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-16&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-17&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-18&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-19&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-20&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-21&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-22&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-23&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-24&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-25&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-26&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-27&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-28&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-29&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-30&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-31&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-32&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-33&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-34&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-35&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-36&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-37&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-46-38&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-46-38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 导入common函数库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;common&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;common&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_http&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;common.read_http&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_redis&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;common.read_redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 导入cjson库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cjson&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;cjson&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 封装查询函数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;read_data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;-- 查询本地缓存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;6379&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;-- 判断查询结果&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ngx.log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ngx.ERR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;redis查询失败，尝试查询http， key: &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;-- redis查询失败，去查询http&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;-- 返回数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 获取路径参数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;id&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ngx.var&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 查询商品信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itemJSON&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;item:id:&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;/item/&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 查询库存信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stockJSON&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;item:stock:id:&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/item/stock/&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- JSON转化为lua的table&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cjson.decode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;itemJSON&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stock&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cjson.decode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stockJSON&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 组合数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;item.stock&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stock.stock&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;item.sold&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stock.sold&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 把item序列化为json 返回结果&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ngx.say&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cjson.encode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id=&#34;47nginx本地缓存&#34;&gt;
    &lt;a href=&#34;#47nginx%e6%9c%ac%e5%9c%b0%e7%bc%93%e5%ad%98&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.7.Nginx本地缓存
&lt;/h2&gt;&lt;p&gt;现在，整个多级缓存中只差最后一环，也就是nginx的本地缓存了。如图：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-96dcd7d348332e.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821114742950&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h3 id=&#34;471本地缓存api&#34;&gt;
    &lt;a href=&#34;#471%e6%9c%ac%e5%9c%b0%e7%bc%93%e5%ad%98api&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.7.1.本地缓存API
&lt;/h3&gt;&lt;p&gt;OpenResty为Nginx提供了&lt;strong&gt;shard dict&lt;/strong&gt;的功能，可以在nginx的多个worker之间共享数据，实现缓存功能。&lt;/p&gt;
&lt;p&gt;1）开启共享字典，在nginx.conf的http下添加配置：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-47-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-47-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-47-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-47-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;c1&#34;&gt;# 共享字典，也就是本地缓存，名称叫做：item_cache，大小150m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;k&#34;&gt;lua_shared_dict&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;item_cache&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;150m&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;2）操作共享字典：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-48-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-48-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-48-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-48-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-48-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-48-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-48-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-48-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-48-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-48-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-48-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-48-6&#34;&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 获取本地缓存对象&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item_cache&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ngx.shared&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item_cache&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 存储, 指定key、value、过期时间，单位s，默认为0代表永不过期&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;item_cache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;key&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;value&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 读取&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item_cache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;key&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;472实现本地缓存查询&#34;&gt;
    &lt;a href=&#34;#472%e5%ae%9e%e7%8e%b0%e6%9c%ac%e5%9c%b0%e7%bc%93%e5%ad%98%e6%9f%a5%e8%af%a2&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    4.7.2.实现本地缓存查询
&lt;/h3&gt;&lt;p&gt;1）修改&lt;code&gt;/usr/local/openresty/lua/item.lua&lt;/code&gt;文件，修改read_data查询函数，添加本地缓存逻辑：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-12&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-13&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-14&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-15&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-16&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-17&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-18&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-19&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-20&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-21&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-22&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-49-23&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-49-23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 导入共享词典，本地缓存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item_cache&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ngx.shared&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item_cache&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 封装查询函数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;read_data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;expire&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;-- 查询本地缓存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item_cache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ngx.log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ngx.ERR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;本地缓存查询失败，尝试查询Redis， key: &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;-- 查询redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;6379&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;-- 判断查询结果&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kr&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;ngx.log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ngx.ERR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;redis查询失败，尝试查询http， key: &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;c1&#34;&gt;-- redis查询失败，去查询http&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;-- 查询成功，把数据写入本地缓存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;item_cache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;expire&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;-- 返回数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;2）修改item.lua中查询商品和库存的业务，实现最新的read_data函数：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-daf3427e7cdb20.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821115108528&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;其实就是多了缓存时间参数，过期后nginx缓存会自动删除，下次访问即可更新缓存。&lt;/p&gt;
&lt;p&gt;这里给商品基本信息设置超时时间为30分钟，库存为1分钟。&lt;/p&gt;
&lt;p&gt;因为库存更新频率较高，如果缓存时间过长，可能与数据库差异较大。&lt;/p&gt;
&lt;p&gt;3）完整的item.lua文件：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-12&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-13&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-14&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-15&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-16&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-17&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-18&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-19&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-20&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-21&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-22&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-23&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-24&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-25&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-26&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-27&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-28&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-29&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-30&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-31&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-32&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-33&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-34&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-35&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-36&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-37&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-38&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-39&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-40&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-41&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-42&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-43&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-44&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-45&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-46&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-50-47&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-50-47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-lua&#34; data-lang=&#34;lua&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 导入common函数库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;common&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;common&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_http&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;common.read_http&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_redis&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;common.read_redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 导入cjson库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cjson&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;cjson&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 导入共享词典，本地缓存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item_cache&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ngx.shared&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item_cache&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 封装查询函数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;read_data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;expire&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;-- 查询本地缓存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item_cache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;ngx.log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ngx.ERR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;本地缓存查询失败，尝试查询Redis， key: &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;-- 查询redis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_redis&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;127.0.0.1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;6379&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;-- 判断查询结果&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kr&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;ngx.log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ngx.ERR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;redis查询失败，尝试查询http， key: &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;c1&#34;&gt;-- redis查询失败，去查询http&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;-- 查询成功，把数据写入本地缓存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;item_cache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;expire&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;-- 返回数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kr&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 获取路径参数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;id&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ngx.var&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 查询商品信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;itemJSON&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;item:id:&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1800&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;/item/&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 查询库存信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stockJSON&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;read_data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;item:stock:id:&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;60&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/item/stock/&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;..&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;nil&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- JSON转化为lua的table&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cjson.decode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;itemJSON&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;local&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stock&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cjson.decode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stockJSON&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 组合数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;item.stock&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stock.stock&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;item.sold&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;stock.sold&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;-- 把item序列化为json 返回结果&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;ngx.say&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cjson.encode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h1 id=&#34;5缓存同步&#34;&gt;
    &lt;a href=&#34;#5%e7%bc%93%e5%ad%98%e5%90%8c%e6%ad%a5&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    5.缓存同步
&lt;/h1&gt;&lt;p&gt;大多数情况下，浏览器查询到的都是缓存数据，如果缓存数据与数据库数据存在较大差异，可能会产生比较严重的后果。&lt;/p&gt;
&lt;p&gt;所以我们必须保证数据库数据、缓存数据的一致性，这就是缓存与数据库的同步。&lt;/p&gt;
&lt;h2 id=&#34;51数据同步策略&#34;&gt;
    &lt;a href=&#34;#51%e6%95%b0%e6%8d%ae%e5%90%8c%e6%ad%a5%e7%ad%96%e7%95%a5&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    5.1.数据同步策略
&lt;/h2&gt;&lt;p&gt;缓存数据同步的常见方式有三种：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;设置有效期&lt;/strong&gt;：给缓存设置有效期，到期后自动删除。再次查询时更新&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;优势：简单、方便&lt;/li&gt;
&lt;li&gt;缺点：时效性差，缓存过期之前可能不一致&lt;/li&gt;
&lt;li&gt;场景：更新频率较低，时效性要求低的业务&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;同步双写&lt;/strong&gt;：在修改数据库的同时，直接修改缓存&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;优势：时效性强，缓存与数据库强一致&lt;/li&gt;
&lt;li&gt;缺点：有代码侵入，耦合度高；&lt;/li&gt;
&lt;li&gt;场景：对一致性、时效性要求较高的缓存数据&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;**异步通知：**修改数据库时发送事件通知，相关服务监听到通知后修改缓存数据&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;优势：低耦合，可以同时通知多个缓存服务&lt;/li&gt;
&lt;li&gt;缺点：时效性一般，可能存在中间不一致状态&lt;/li&gt;
&lt;li&gt;场景：时效性要求一般，有多个服务需要同步&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而异步实现又可以基于MQ或者Canal来实现：&lt;/p&gt;
&lt;p&gt;1）基于MQ的异步通知：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-51a03209e91b7e.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821115552327&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;解读：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;商品服务完成对数据的修改后，只需要发送一条消息到MQ中。&lt;/li&gt;
&lt;li&gt;缓存服务监听MQ消息，然后完成对缓存的更新&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;依然有少量的代码侵入。&lt;/p&gt;
&lt;p&gt;2）基于Canal的通知&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-265c5e9d2ae245.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821115719363&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;解读：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;商品服务完成商品修改后，业务直接结束，没有任何代码侵入&lt;/li&gt;
&lt;li&gt;Canal监听MySQL变化，当发现变化后，立即通知缓存服务&lt;/li&gt;
&lt;li&gt;缓存服务接收到canal通知，更新缓存&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;代码零侵入&lt;/p&gt;
&lt;h2 id=&#34;52安装canal&#34;&gt;
    &lt;a href=&#34;#52%e5%ae%89%e8%a3%85canal&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    5.2.安装Canal
&lt;/h2&gt;&lt;h3 id=&#34;521认识canal&#34;&gt;
    &lt;a href=&#34;#521%e8%ae%a4%e8%af%86canal&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    5.2.1.认识Canal
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Canal [kə&amp;rsquo;næl]&lt;/strong&gt;，译意为水道/管道/沟渠，canal是阿里巴巴旗下的一款开源项目，基于Java开发。基于数据库增量日志解析，提供增量数据订阅&amp;amp;消费。GitHub的地址：https://github.com/alibaba/canal&lt;/p&gt;
&lt;p&gt;Canal是基于mysql的主从同步来实现的，MySQL主从同步的原理如下：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-e875a53720eb57.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821115914748&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1）MySQL master 将数据变更写入二进制日志( binary log），其中记录的数据叫做binary log events&lt;/li&gt;
&lt;li&gt;2）MySQL slave 将 master 的 binary log events拷贝到它的中继日志(relay log)&lt;/li&gt;
&lt;li&gt;3）MySQL slave 重放 relay log 中事件，将数据变更反映它自己的数据&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;而Canal就是把自己伪装成MySQL的一个slave节点，从而监听master的binary log变化。再把得到的变化信息通知给Canal的客户端，进而完成对其它数据库的同步。&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-ccbfe45c21c3b6.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821115948395&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h3 id=&#34;522安装canal&#34;&gt;
    &lt;a href=&#34;#522%e5%ae%89%e8%a3%85canal&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    5.2.2.安装Canal
&lt;/h3&gt;&lt;p&gt;安装和配置Canal参考课前资料文档：&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-7d6d9c80e41c91.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821120017324&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;h2 id=&#34;53监听canal&#34;&gt;
    &lt;a href=&#34;#53%e7%9b%91%e5%90%accanal&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    5.3.监听Canal
&lt;/h2&gt;&lt;p&gt;Canal提供了各种语言的客户端，当Canal监听到binlog变化时，会通知Canal的客户端。&lt;/p&gt;
&lt;p&gt;


    &lt;img src=&#34;https://logan.1357810.xyz/img/20220528/1653749846-2421ac2095c20d.png&#34;
         width=&#34;200&#34;
            height=&#34;200&#34;
            
         loading=&#34;lazy&#34;
         decoding=&#34;async&#34;
            
              alt=&#34;image-20210821120049024&#34;
            
            
              class=&#34;gallery-image link-image&#34;
              data-flex-grow=&#34;20&#34;
              data-flex-basis=&#34;20px&#34;
            
    &gt;
&lt;/p&gt;
&lt;p&gt;我们可以利用Canal提供的Java客户端，监听Canal通知消息。当收到变化的消息时，完成对缓存的更新。&lt;/p&gt;
&lt;p&gt;不过这里我们会使用GitHub上的第三方开源的canal-starter客户端。地址：https://github.com/NormanGyllenhaal/canal-client&lt;/p&gt;
&lt;p&gt;与SpringBoot完美整合，自动装配，比官方客户端要简单好用很多。&lt;/p&gt;
&lt;h3 id=&#34;531引入依赖&#34;&gt;
    &lt;a href=&#34;#531%e5%bc%95%e5%85%a5%e4%be%9d%e8%b5%96&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    5.3.1.引入依赖：
&lt;/h3&gt;
&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-51-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-51-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-51-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-51-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-51-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-51-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-51-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-51-4&#34;&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-51-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-51-5&#34;&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;top.javatool&lt;span class=&#34;nt&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;canal-spring-boot-starter&lt;span class=&#34;nt&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.2.1-RELEASE&lt;span class=&#34;nt&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;532编写配置&#34;&gt;
    &lt;a href=&#34;#532%e7%bc%96%e5%86%99%e9%85%8d%e7%bd%ae&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    5.3.2.编写配置：
&lt;/h3&gt;
&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-52-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-52-1&#34;&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-52-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-52-2&#34;&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-52-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-52-3&#34;&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;canal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;destination&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;heima&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# canal的集群名字，要与安装canal时设置的名称一致&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;server&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;192.168.150.101&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;11111&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# canal服务地址&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;533修改item实体类&#34;&gt;
    &lt;a href=&#34;#533%e4%bf%ae%e6%94%b9item%e5%ae%9e%e4%bd%93%e7%b1%bb&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    5.3.3.修改Item实体类
&lt;/h3&gt;&lt;p&gt;通过@Id、@Column、等注解完成Item与数据库表字段的映射：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-12&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-13&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-14&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-15&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-16&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-17&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-18&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-19&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-20&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-21&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-22&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-23&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-24&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-25&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-26&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-27&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-28&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-29&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-30&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-31&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-32&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-33&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-34&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-35&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-36&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-53-37&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-53-37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.heima.item.pojo&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.baomidou.mybatisplus.annotation.IdType&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.baomidou.mybatisplus.annotation.TableField&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.baomidou.mybatisplus.annotation.TableId&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.baomidou.mybatisplus.annotation.TableName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;lombok.Data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.springframework.data.annotation.Id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.springframework.data.annotation.Transient&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;javax.persistence.Column&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.Date&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@TableName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;tb_item&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Item&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@TableId&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;type&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IdType&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;AUTO&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Id&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Long&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//商品id&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Column&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//商品名称&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//商品标题&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Long&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;price&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//价格（分）&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//商品图片&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;category&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//分类名称&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;brand&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//品牌名称&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;spec&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//规格&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//商品状态 1-正常，2-下架&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Date&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;createTime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//创建时间&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Date&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;updateTime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//更新时间&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@TableField&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exist&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Transient&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stock&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@TableField&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exist&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Transient&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Integer&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sold&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 id=&#34;534编写监听器&#34;&gt;
    &lt;a href=&#34;#534%e7%bc%96%e5%86%99%e7%9b%91%e5%90%ac%e5%99%a8&#34; class=&#34;header-anchor&#34;&gt;&lt;/a&gt;  
    5.3.4.编写监听器
&lt;/h3&gt;&lt;p&gt;通过实现&lt;code&gt;EntryHandler&amp;lt;T&amp;gt;&lt;/code&gt;接口编写监听器，监听Canal消息。注意两点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;实现类通过&lt;code&gt;@CanalTable(&amp;quot;tb_item&amp;quot;)&lt;/code&gt;指定监听的表信息&lt;/li&gt;
&lt;li&gt;EntryHandler的泛型是与表对应的实体类&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-12&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-13&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-14&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-15&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-16&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-17&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-18&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-19&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-20&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-21&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-22&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-23&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-24&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-25&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-26&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-27&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-28&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-29&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-30&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-31&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-32&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-33&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-34&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-35&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-36&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-37&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-38&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-39&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-40&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-41&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-42&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-54-43&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-54-43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.heima.item.canal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.github.benmanes.caffeine.cache.Cache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.heima.item.config.RedisHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.heima.item.pojo.Item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.springframework.beans.factory.annotation.Autowired&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.springframework.stereotype.Component&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;top.javatool.canal.client.annotation.CanalTable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;top.javatool.canal.client.handler.EntryHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@CanalTable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;tb_item&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Component&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;ItemHandler&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;implements&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;EntryHandler&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Autowired&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RedisHandler&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redisHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Autowired&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Cache&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Long&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;itemCache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;insert&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Item&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 写数据到JVM进程缓存&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;itemCache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;put&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getId&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 写数据到redis&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redisHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;saveItem&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;update&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Item&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;before&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Item&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;after&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 写数据到JVM进程缓存&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;itemCache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;put&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;after&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getId&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;after&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 写数据到redis&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redisHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;saveItem&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;after&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;delete&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Item&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 删除数据到JVM进程缓存&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;itemCache&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;invalidate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getId&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 删除数据到redis&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redisHandler&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;deleteItemById&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getId&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;在这里对Redis的操作都封装到了RedisHandler这个对象中，是我们之前做缓存预热时编写的一个类，内容如下：&lt;/p&gt;

&lt;div class=&#34;logan-code-block&#34;&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-1&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-1&#34;&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-2&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-2&#34;&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-3&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-3&#34;&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-4&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-4&#34;&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-5&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-5&#34;&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-6&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-6&#34;&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-7&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-7&#34;&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-8&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-8&#34;&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-9&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-9&#34;&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-10&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-10&#34;&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-11&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-11&#34;&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-12&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-12&#34;&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-13&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-13&#34;&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-14&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-14&#34;&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-15&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-15&#34;&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-16&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-16&#34;&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-17&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-17&#34;&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-18&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-18&#34;&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-19&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-19&#34;&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-20&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-20&#34;&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-21&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-21&#34;&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-22&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-22&#34;&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-23&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-23&#34;&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-24&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-24&#34;&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-25&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-25&#34;&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-26&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-26&#34;&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-27&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-27&#34;&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-28&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-28&#34;&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-29&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-29&#34;&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-30&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-30&#34;&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-31&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-31&#34;&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-32&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-32&#34;&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-33&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-33&#34;&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-34&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-34&#34;&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-35&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-35&#34;&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-36&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-36&#34;&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-37&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-37&#34;&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-38&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-38&#34;&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-39&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-39&#34;&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-40&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-40&#34;&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-41&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-41&#34;&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-42&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-42&#34;&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-43&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-43&#34;&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-44&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-44&#34;&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-45&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-45&#34;&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-46&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-46&#34;&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-47&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-47&#34;&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-48&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-48&#34;&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-49&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-49&#34;&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-50&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-50&#34;&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-51&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-51&#34;&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-52&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-52&#34;&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-53&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-53&#34;&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-54&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-54&#34;&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-55&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-55&#34;&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-56&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-56&#34;&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-57&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-57&#34;&gt;57&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-58&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-58&#34;&gt;58&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-59&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-59&#34;&gt;59&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-60&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-60&#34;&gt;60&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-61&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-61&#34;&gt;61&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-62&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-62&#34;&gt;62&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-63&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-63&#34;&gt;63&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-64&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-64&#34;&gt;64&lt;/a&gt;
&lt;/span&gt;&lt;span class=&#34;lnt&#34; id=&#34;hl-55-65&#34;&gt;&lt;a class=&#34;lnlinks&#34; href=&#34;#hl-55-65&#34;&gt;65&lt;/a&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.heima.item.config&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.fasterxml.jackson.core.JsonProcessingException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.fasterxml.jackson.databind.ObjectMapper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.heima.item.pojo.Item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.heima.item.pojo.ItemStock&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.heima.item.service.IItemService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;com.heima.item.service.IItemStockService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.springframework.beans.factory.InitializingBean&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.springframework.beans.factory.annotation.Autowired&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.springframework.data.redis.core.StringRedisTemplate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;org.springframework.stereotype.Component&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;java.util.List&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@Component&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;RedisHandler&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;implements&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;InitializingBean&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Autowired&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;StringRedisTemplate&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redisTemplate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Autowired&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IItemService&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;itemService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Autowired&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;IItemStockService&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stockService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ObjectMapper&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MAPPER&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ObjectMapper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;afterPropertiesSet&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;throws&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Exception&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 初始化缓存&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 1.查询商品信息&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;itemList&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;itemService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 2.放入缓存&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Item&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;itemList&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 2.1.item序列化为JSON&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MAPPER&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;writeValueAsString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 2.2.存入redis&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redisTemplate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;opsForValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;item:id:&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getId&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 3.查询商品库存信息&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;List&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ItemStock&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stockList&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stockService&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 4.放入缓存&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ItemStock&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stock&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stockList&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 2.1.item序列化为JSON&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MAPPER&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;writeValueAsString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stock&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 2.2.存入redis&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redisTemplate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;opsForValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;item:stock:id:&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stock&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getId&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;saveItem&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Item&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MAPPER&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;writeValueAsString&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redisTemplate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;opsForValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;item:id:&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getId&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JsonProcessingException&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RuntimeException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;deleteItemById&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Long&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;redisTemplate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;delete&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;item:id:&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;

  &lt;div class=&#34;code-scroll&#34; aria-label=&#34;代码块滚动工具栏&#34;&gt;
    &lt;button class=&#34;code-scroll-left iconfont-logan icon-logan-circle-left-solid&#34; aria-label=&#34;向左滚动&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;code-scroll-right iconfont-logan icon-logan-circle-right-solid&#34; aria-label=&#34;向右滚动&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&#34;code-tools&#34; aria-label=&#34;代码块工具栏&#34;&gt;
    &lt;div class=&#34;copy-text&#34;&gt;Copied!&lt;/div&gt;
    &lt;button class=&#34;copy-code-button iconfont-logan icon-logan-copy-round3&#34; aria-label=&#34;复制&#34;&gt;&lt;/button&gt;
    &lt;button class=&#34;my-code-fold iconfont-logan icon-logan-circle-chevron-down-solid expand1&#34; aria-label=&#34;折叠&#34;&gt;&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;
</description>
        </item>
        
    </channel>
</rss>
