<?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 随记</title><link>https://blog.liuyi2026.asia/zh/tags/redis_%E5%B0%9A%E7%A1%85%E8%B0%B7/</link><description>Recent content in Redis_尚硅谷 on 随记</description><generator>Hugo</generator><language>zh</language><lastBuildDate>Wed, 19 Jan 2022 16:52:19 +0000</lastBuildDate><atom:link href="https://blog.liuyi2026.asia/zh/tags/redis_%E5%B0%9A%E7%A1%85%E8%B0%B7/index.xml" rel="self" type="application/rss+xml"/><item><title>redis_尚硅谷_19-A</title><link>https://blog.liuyi2026.asia/zh/docs/technology/Redis/shangguigu_BV1Rv41177Af_/19-A/</link><pubDate>Wed, 19 Jan 2022 16:52:19 +0000</pubDate><guid>https://blog.liuyi2026.asia/zh/docs/technology/Redis/shangguigu_BV1Rv41177Af_/19-A/</guid><description>&lt;h2 id="验证码模拟">验证码模拟&lt;a class="anchor" href="#%e9%aa%8c%e8%af%81%e7%a0%81%e6%a8%a1%e6%8b%9f">#&lt;/a>&lt;/h2>
&lt;ul>
&lt;li>首先需要一个MyRedis单例类&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">/**
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> * MyRedis单例类
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> */&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">MyJedis&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">private&lt;/span> &lt;span style="color:#66d9ef">static&lt;/span> Jedis myJedis;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">static&lt;/span> Jedis &lt;span style="color:#a6e22e">getInstance&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">//如果是空则进行初始化&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (myJedis &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#66d9ef">null&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">//由于synchronized同步是在条件判断内，所以同步&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">//并不会一直都执行，增加了效率&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">synchronized&lt;/span> (MyJedis.&lt;span style="color:#a6e22e">class&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> (myJedis &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#66d9ef">null&lt;/span>) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">//设置密码&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> DefaultJedisClientConfig.&lt;span style="color:#a6e22e">Builder&lt;/span> builder &lt;span style="color:#f92672">=&lt;/span> DefaultJedisClientConfig.&lt;span style="color:#a6e22e">builder&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">password&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;hello.lwm&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> DefaultJedisClientConfig config &lt;span style="color:#f92672">=&lt;/span> builder.&lt;span style="color:#a6e22e">build&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Jedis jedis &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> redis.&lt;span style="color:#a6e22e">clients&lt;/span>.&lt;span style="color:#a6e22e">jedis&lt;/span>.&lt;span style="color:#a6e22e">Jedis&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;192.168.200.200&amp;#34;&lt;/span>, 6379, config);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> jedis;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> myJedis;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>redis_尚硅谷_18</title><link>https://blog.liuyi2026.asia/zh/docs/technology/Redis/shangguigu_BV1Rv41177Af_/18/</link><pubDate>Wed, 19 Jan 2022 14:07:52 +0000</pubDate><guid>https://blog.liuyi2026.asia/zh/docs/technology/Redis/shangguigu_BV1Rv41177Af_/18/</guid><description>&lt;h2 id="jedis操作redis6">Jedis操作Redis6&lt;a class="anchor" href="#jedis%e6%93%8d%e4%bd%9credis6">#&lt;/a>&lt;/h2>
&lt;ul>
&lt;li>插曲:本地项目关联github远程库
&lt;pre tabindex="0">&lt;code> git init
 git add README.md
 git commit -m &amp;#34;first commit&amp;#34;
 #-m表示强制重命名
 git branch -M main
 #使用别名
 git remote add origin git@github.com:lwmfjc/jedis_demo.git
 #用了-u之后以后可以直接用git push替代整行 
 git push -u origin main &lt;/code>&lt;/pre>&lt;/li>
&lt;li>jedis pom依赖
&lt;pre tabindex="0">&lt;code class="language-pom" data-lang="pom">&amp;lt;!-- https://mvnrepository.com/artifact/redis.clients/jedis --&amp;gt;
&amp;lt;dependency&amp;gt;
 &amp;lt;groupId&amp;gt;redis.clients&amp;lt;/groupId&amp;gt;
 &amp;lt;artifactId&amp;gt;jedis&amp;lt;/artifactId&amp;gt;
 &amp;lt;version&amp;gt;4.0.1&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/code>&lt;/pre>&lt;/li>
&lt;li>jedis使用
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Main&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">static&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>(String&lt;span style="color:#f92672">[]&lt;/span> args) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">//设置密码&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> DefaultJedisClientConfig.&lt;span style="color:#a6e22e">Builder&lt;/span> builder &lt;span style="color:#f92672">=&lt;/span> 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> DefaultJedisClientConfig.&lt;span style="color:#a6e22e">builder&lt;/span>()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> .&lt;span style="color:#a6e22e">password&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;hello.lwm&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> DefaultJedisClientConfig config &lt;span style="color:#f92672">=&lt;/span> builder.&lt;span style="color:#a6e22e">build&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Jedis jedis &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> Jedis(&lt;span style="color:#e6db74">&amp;#34;192.168.200.200&amp;#34;&lt;/span>, 6379, config);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">//ping&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> String value &lt;span style="color:#f92672">=&lt;/span> jedis.&lt;span style="color:#a6e22e">ping&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(value);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">//返回所有key&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Set&lt;span style="color:#f92672">&amp;lt;&lt;/span>String&lt;span style="color:#f92672">&amp;gt;&lt;/span> keys &lt;span style="color:#f92672">=&lt;/span> jedis.&lt;span style="color:#a6e22e">keys&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;*&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;key count: &amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> keys.&lt;span style="color:#a6e22e">size&lt;/span>());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (String key : keys) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">printf&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;key--:%s---value:%s\n&amp;#34;&lt;/span>, 
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> key, jedis.&lt;span style="color:#a6e22e">get&lt;/span>(key));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;操作list&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">//操作list&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> jedis.&lt;span style="color:#a6e22e">lpush&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;ly-list&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;java&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;c++&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;css&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> List&lt;span style="color:#f92672">&amp;lt;&lt;/span>String&lt;span style="color:#f92672">&amp;gt;&lt;/span> lrange &lt;span style="color:#f92672">=&lt;/span> jedis.&lt;span style="color:#a6e22e">lrange&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;ly-list&amp;#34;&lt;/span>, 0, &lt;span style="color:#f92672">-&lt;/span>1);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (String v : lrange) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;value:&amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> v);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">//操作set&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;操作set&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> jedis.&lt;span style="color:#a6e22e">sadd&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;ly-set&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;1&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;3&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;3&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;5&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;1&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Set&lt;span style="color:#f92672">&amp;lt;&lt;/span>String&lt;span style="color:#f92672">&amp;gt;&lt;/span> smembers &lt;span style="color:#f92672">=&lt;/span> jedis.&lt;span style="color:#a6e22e">smembers&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;ly-set&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (String v : smembers) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;value:&amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> v);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">//操作hash&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;操作hash&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> jedis.&lt;span style="color:#a6e22e">hset&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;ly-hash&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;name&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;lidian&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> jedis.&lt;span style="color:#a6e22e">hset&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;ly-hash&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;age&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;30&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> jedis.&lt;span style="color:#a6e22e">hset&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;ly-hash&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;sex&amp;#34;&lt;/span>, &lt;span style="color:#e6db74">&amp;#34;man&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Map&lt;span style="color:#f92672">&amp;lt;&lt;/span>String, String&lt;span style="color:#f92672">&amp;gt;&lt;/span> lyHash &lt;span style="color:#f92672">=&lt;/span> jedis.&lt;span style="color:#a6e22e">hgetAll&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;ly-hash&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (String key : lyHash.&lt;span style="color:#a6e22e">keySet&lt;/span>()) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(key &lt;span style="color:#f92672">+&lt;/span> &lt;span style="color:#e6db74">&amp;#34;:&amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> lyHash.&lt;span style="color:#a6e22e">get&lt;/span>(key));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">//操作zset&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;操作zset&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> jedis.&lt;span style="color:#a6e22e">zadd&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;person&amp;#34;&lt;/span>, 100, &lt;span style="color:#e6db74">&amp;#34;xiaohong&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> jedis.&lt;span style="color:#a6e22e">zadd&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;person&amp;#34;&lt;/span>, 80, &lt;span style="color:#e6db74">&amp;#34;xiaoli&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> jedis.&lt;span style="color:#a6e22e">zadd&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;person&amp;#34;&lt;/span>, 90, &lt;span style="color:#e6db74">&amp;#34;xiaochen&amp;#34;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> List&lt;span style="color:#f92672">&amp;lt;&lt;/span>String&lt;span style="color:#f92672">&amp;gt;&lt;/span> person &lt;span style="color:#f92672">=&lt;/span> jedis.&lt;span style="color:#a6e22e">zrange&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;person&amp;#34;&lt;/span>, 0, &lt;span style="color:#f92672">-&lt;/span>1);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">for&lt;/span> (String name : person) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(name);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">//结束操作&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> jedis.&lt;span style="color:#a6e22e">flushDB&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> jedis.&lt;span style="color:#a6e22e">close&lt;/span>();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ul></description></item><item><title>redis_尚硅谷_12-17</title><link>https://blog.liuyi2026.asia/zh/docs/technology/Redis/shangguigu_BV1Rv41177Af_/12-17/</link><pubDate>Tue, 18 Jan 2022 08:48:54 +0000</pubDate><guid>https://blog.liuyi2026.asia/zh/docs/technology/Redis/shangguigu_BV1Rv41177Af_/12-17/</guid><description>&lt;h2 id="redis配置文件">Redis配置文件&lt;a class="anchor" href="#redis%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6">#&lt;/a>&lt;/h2>
&lt;ul>
&lt;li>redis中单位的设置，支持k,kb,m,mb,g,gb，且不区分大小写&lt;br>
&lt;img src="img/ly-20241212142200403.png" alt="" />&lt;/li>
&lt;li>include (包含其他文件，比如公共部分)&lt;br>
&lt;img src="img/ly-20241212142200557.png" alt="" />&lt;/li>
&lt;li>bind
&lt;pre tabindex="0">&lt;code>bind 127.0.0.1 ::1 #listens on loopback IPv4 and IPv6 &lt;/code>&lt;/pre>&lt;ul>
&lt;li>后面这个::1，相当于ipv6版的127.0.0.1。在redis配置文件中，整句表示只允许本地网卡的某个ip连接(但是它并不能指定某个主机连接到redis中。比如本机有两个网卡，两个ip，可以限定只有其中一个ip可以连接)&lt;/li>
&lt;li>如果注释掉了/或者bind 0.0.0.0，表示允许所有主机连接&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>protected-mode
&lt;pre tabindex="0">&lt;code>protected-mode yes &lt;/code>&lt;/pre>&lt;ul>
&lt;li>设置保护模式为yes，protected是redis本身的一个安全层，这个安全层在同时满足下面三个条件的时候会开启，开启后只有本机可以访问redis
&lt;ul>
&lt;li>protected-mode yes&lt;/li>
&lt;li>没有bind指令(bind 0.0.0.0不属于这个条件)&lt;/li>
&lt;li>没有设置密码 (没有设置requirepass password)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>只要上面一个条件不满足，就不会开启保护模式。换言之，只要设置了bind 0.0.0.0或者没有设置bind，且不满足上面三个条件之一，就能够进行远程访问(当然，linux/windows的6379端口要开放)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>tcp-backlog 表示未连接队列总和&lt;/li>
&lt;li>timeout 秒为单位，时间内没操作则断开连接&lt;/li>
&lt;li>tcp-keepalive 300 心跳检测，每隔300s检测连接是否存在&lt;/li>
&lt;li>pidfile /var/run/redis_6379.pid 将进程号保存到文件中&lt;/li>
&lt;li>loglevel 表示日志的级别/debug/verbose/&lt;strong>notice&lt;/strong>/warning&lt;/li>
&lt;li>logfile &amp;quot;&amp;quot; 设置日志的路径&lt;/li>
&lt;li>database 16 默认有16个库&lt;/li>
&lt;li>requirepass password 设置密码&lt;/li>
&lt;li>maxclients 设置最大连接数&lt;/li>
&lt;li>maxmemory 设置最大内存量，达到则会根据移除策略进行移除操作&lt;/li>
&lt;/ul>
&lt;h2 id="redis的发布和订阅">Redis的发布和订阅&lt;a class="anchor" href="#redis%e7%9a%84%e5%8f%91%e5%b8%83%e5%92%8c%e8%ae%a2%e9%98%85">#&lt;/a>&lt;/h2>
&lt;ul>
&lt;li>发布订阅，pub/sub，是一种消息通信模式：发送者pub发送消息，订阅器sub接收消息&lt;/li>
&lt;li>发布者能发布消息，订阅者可以订阅/接收消息&lt;br>
&lt;img src="img/ly-20241212142200586.png" alt="" />&lt;/li>
&lt;li>操作
&lt;pre tabindex="0">&lt;code class="language-redis" data-lang="redis">subscribe channel1 #客户端A订阅频道 &lt;/code>&lt;/pre>&lt;pre tabindex="0">&lt;code class="language-redis" data-lang="redis">publish channel1 helloly #向频道发送消息&lt;/code>&lt;/pre>此时订阅channel1频道的客户端就会接收到消息&lt;br>
&lt;img src="img/ly-20241212142200619.png" alt="" />&lt;/li>
&lt;/ul>
&lt;h2 id="redis新数据类型">redis新数据类型&lt;a class="anchor" href="#redis%e6%96%b0%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b">#&lt;/a>&lt;/h2>
&lt;h3 id="bitmaps">Bitmaps&lt;a class="anchor" href="#bitmaps">#&lt;/a>&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>进行二进制操作&lt;/p></description></item><item><title>redis_尚硅谷_06-11</title><link>https://blog.liuyi2026.asia/zh/docs/technology/Redis/shangguigu_BV1Rv41177Af_/06-11/</link><pubDate>Tue, 04 Jan 2022 16:22:12 +0000</pubDate><guid>https://blog.liuyi2026.asia/zh/docs/technology/Redis/shangguigu_BV1Rv41177Af_/06-11/</guid><description>&lt;h2 id="redis针对key的基本操作">Redis针对key的基本操作&lt;a class="anchor" href="#redis%e9%92%88%e5%af%b9key%e7%9a%84%e5%9f%ba%e6%9c%ac%e6%93%8d%e4%bd%9c">#&lt;/a>&lt;/h2>
&lt;ul>
&lt;li>常用命令
&lt;pre tabindex="0">&lt;code>keys * #查找当前库所有库
exists key1 #key1是否存在 1存在；0不存在
type key2 #key2的类型
del key3 #删除key3
unlink key3 #删除key3(选择非阻塞删除。会先从元数据删除，而真正删除是异步删除)
expire key1 10 #设置key1的过期时间，单位秒
ttl key1 #获取key1的剩余存活时间，-2表示key已过期或不存在，-1表示永不过期
select 1 #切换到1号库(redis中有15个库，默认在库1)
dbsize #查找当前redis库中有多少个key
flushdb #清空当前库
flushall #清空所有库&lt;/code>&lt;/pre>&lt;/li>
&lt;/ul>
&lt;h2 id="redis中常用数据类型">Redis中常用数据类型&lt;a class="anchor" href="#redis%e4%b8%ad%e5%b8%b8%e7%94%a8%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b">#&lt;/a>&lt;/h2>
&lt;h3 id="字符串string">字符串（String）&lt;a class="anchor" href="#%e5%ad%97%e7%ac%a6%e4%b8%b2string">#&lt;/a>&lt;/h3>
&lt;ul>
&lt;li>String是二进制安全的，可以包含jpg图片或序列化的对象&lt;/li>
&lt;li>一个Redis中字符串value最多可以只能是512M&lt;/li>
&lt;li>常用命令
&lt;pre tabindex="0">&lt;code>set key1 value1
get key1 
set key1 value11 #将覆盖上一个值
append key1 abc #在key1的值追加&amp;#34;abc&amp;#34;
strlen key1 #key值的长度
setnx key1 value #当key不存在时才设置key
incr n1 #将n1的值加一,,如果n1不存在则会创建key n1 并改为1(0+1)
decr n1 #将n1的值减一,如果n1不存在则会创建key n1 并改为-1(0-1)
incrby n1 20 #将n1的值加20，其他同上
decrby n1 20 #将n1的值减20，其他同上&lt;/code>&lt;/pre>&lt;/li>
&lt;li>redis原子性&lt;br>
incr具有原子性操作&lt;br>
java中的i++不是原子操作&lt;/li>
&lt;li>其他命令
&lt;pre tabindex="0">&lt;code>mset k1 v1 k2 v2
mget k1 k2 
msetnx k1 v1 k2 v2 #仅当所有的key都不存在时才会进行设置
getrange name 0 3 #截断字符串[0,3]
setrange name 3 123 #从下标[3]开始替换字符串（换成123）
setex k1 20 v1 #设置过期时间为20s
expire k1 30 #设置过期时间为30s
getset k1 123 #获取旧值，并设置一个新值&lt;/code>&lt;/pre>&lt;/li>
&lt;li>数据结构，SimpleDynamicString，SDS，简单动态字符串，内部结构类似Java的ArrayList，采用预分配冗余空间的方式来减少内存的频繁分配&lt;br>
&lt;img src="img/ly-20241212142200067.png" alt="" />&lt;/li>
&lt;/ul>
&lt;h3 id="列表-list">列表 (List)&lt;a class="anchor" href="#%e5%88%97%e8%a1%a8-list">#&lt;/a>&lt;/h3>
&lt;ul>
&lt;li>单键多值&lt;/li>
&lt;li>底层是双向链表&lt;/li>
&lt;li>从左放
&lt;pre tabindex="0">&lt;code>lpush k1 v1 v2 v3 #从左边放(从左往右推)
lrange k1 0 -1 #从左边取(v3 v2 v1)&lt;/code>&lt;/pre>&lt;/li>
&lt;li>lpush:&lt;br>
&lt;img src="img/ly-20241212142200123.png" alt="" />&lt;/li>
&lt;li>从右放
&lt;pre tabindex="0">&lt;code>rpush k2 v1 v2 v3 &lt;/code>&lt;/pre>&lt;/li>
&lt;li>brpush:&lt;br>
&lt;img src="img/ly-20241212142200156.png" alt="" />&lt;/li>
&lt;li>lpop/rpop
&lt;pre tabindex="0">&lt;code>lpop k2 #从左边弹出一个值
lpop k2 2 #从左边弹出两个值，当键没有包含值时，键被删除&lt;/code>&lt;/pre>&lt;/li>
&lt;li>rpoplpush
&lt;pre tabindex="0">&lt;code>lpush a a1 a2 a3
rpush b b1 b2 b3
rpoplpush a b #此时a:a1 a2，b:a3 b1 b2 b3&lt;/code>&lt;/pre>&lt;/li>
&lt;li>lrange
&lt;pre tabindex="0">&lt;code>lrange b 1 2 #获取b中下标[1,2]的所有值
lrange b 1 -1 #获取所有值[1,最大下标]的所有值&lt;/code>&lt;/pre>&lt;/li>
&lt;li>lindex,llen
&lt;pre tabindex="0">&lt;code>lindex b 1 #直接取第一个下标的元素
llen b #获取列表的长度&lt;/code>&lt;/pre>&lt;/li>
&lt;li>linsert
&lt;pre tabindex="0">&lt;code>linsert b before b2 myinsert
linsert b after b2 myinsert
#在某个列表的值(如果重复取第一个)的位置之前/之后插入值&lt;/code>&lt;/pre>&lt;img src="img/ly-20241212142200200.png" alt="" />&lt;/li>
&lt;li>lrem,lset
&lt;pre tabindex="0">&lt;code>lrem b 2 a #从b列表中，删除两个a（从左往右）
lset b 2 AA #把下标2的值设置为AA&lt;/code>&lt;/pre>&lt;/li>
&lt;li>list数据结构是一个快速列表，quicklist&lt;br>
当元素较少的时候，会使用连续的内存存储，结构时ziplist，即压缩列表；当数据多的时候会有多个压缩列表，然后会链接到一起(使用双向指针)&lt;br>
&lt;img src="img/ly-20241212142200233.png" alt="" />&lt;/li>
&lt;/ul>
&lt;h3 id="集合set">集合(Set)&lt;a class="anchor" href="#%e9%9b%86%e5%90%88set">#&lt;/a>&lt;/h3>
&lt;ul>
&lt;li>特点：无序，不重复&lt;/li>
&lt;li>Set:string类型的无序集合，底层是一个value为null的hash表；添加/删除时间复杂度为O(1)&lt;/li>
&lt;li>常用命令
&lt;pre tabindex="0">&lt;code>sadd k1 v1 v2 v3 v2 v2 v1 #设置集合中的值
smembers k1 #取出集合中的值
sismember k1 v3 #k1是否存在v3，存在返回1，不存在返回0
scard k1 #返回集合中元素的个数
srem k1 v2 v3 #删除集合中的v2和v3
spop k1 #从k1中随机取出一个值
srandmember k1 2 #从k1中随机取出2个值&lt;/code>&lt;/pre>&lt;pre tabindex="0">&lt;code>smove a k a1 #从a中将a1移动到k中
sinter a k #取a，k的交集
sunion a k #取a，k的并集
sdiff a k #返回两个集合的差集（从集合a中，去除存在集合k中的元素，即a-k）&lt;/code>&lt;/pre>&lt;/li>
&lt;li>Set数据结构时dict字典，字典使用哈希表实现的&lt;/li>
&lt;/ul>
&lt;h3 id="哈希hash">哈希（Hash)&lt;a class="anchor" href="#%e5%93%88%e5%b8%8chash">#&lt;/a>&lt;/h3>
&lt;ul>
&lt;li>是String类型的field和value的映射表，用来存储对象,类似java中的Map&amp;lt;String,Object&amp;gt; &lt;br>
&lt;img src="img/ly-20241212142200266.png" alt="" />&lt;/li>
&lt;li>常用命令
&lt;pre tabindex="0">&lt;code>hset user:1001 id 1 #设置(对象)user:1001的id属性值
hset user:1001 name zhangsan 
hget user:1001 name #取出user:1001的name
hmset user:1001 id 1 name zhangsan #批量设置（现在hset也可以批量设置了，hmset已弃用）
hexists user:1001 id 1 #判断属性id是否存在
hkeys user:1001 #查看hash结构中的所有filed
hvals user:1001 #查看hash结构中所有value
hincrby user:1001 age 2 #给hash结构的age属性值加2
hsetnx user:1001 age 10 #给hash结构的age属性设置值为10（如果age属性不存在）&lt;/code>&lt;/pre>&lt;/li>
&lt;li>hash类型数据结构，当field-value长度较短时用的是ziplist，否则使用的是hashtable&lt;/li>
&lt;/ul>
&lt;h3 id="有序集合zset">有序集合(ZSet)&lt;a class="anchor" href="#%e6%9c%89%e5%ba%8f%e9%9b%86%e5%90%88zset">#&lt;/a>&lt;/h3>
&lt;ul>
&lt;li>与set很相似，但是是有序的&lt;/li>
&lt;li>有序集合的所有元素（成员）都关联一个评分(score)，score用来从最低到最高方式进行排序，成员唯一但评分是重复的&lt;/li>
&lt;li>常用命令
&lt;pre tabindex="0">&lt;code>zadd topn 100 xiaoming 120 xiaohong 60 xiaochen #添加key并为每个成员添加评分
zadd topn xiaoli 200 
zrange topn 0 -1 #查找出所有成员(按排名由小到大)
zrange topn 0 -1 withscores #从小到大查找所有成员并显示分数
zrangebyscore topn 130 200 #查找所有在130-200的成员
zrevrangebyscore topn 200 130 #从大到小查找所有成员（注意，从大到小时第一个值必须大于等于第二个）
zincrby topn 15 xiaohong #给小红添加15分
zrem topn xiaohong #删除元素
zcount topn 10 200 #统计该集合，分数区间内的元素个数
zrank topn xiaohong #xiaohong的排名，从0开始&lt;/code>&lt;/pre>&lt;/li>
&lt;li>zset底层数据结构
&lt;ul>
&lt;li>hash结构&lt;br>
&lt;img src="img/ly-20241212142200298.png" alt="" />&lt;/li>
&lt;li>跳跃表
给元素value排序，根据score的范围获取元素列表&lt;/li>
&lt;li>对比有序链表和跳跃表
&lt;ul>
&lt;li>查找51元素&lt;br>
&lt;img src="img/ly-20241212142200328.png" alt="" />&lt;/li>
&lt;li>跳跃表&lt;br>
按图中的顺序查找，查找四次就能找到&lt;br>
&lt;img src="img/ly-20241212142200360.png" alt="" />&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>End&lt;/li>
&lt;/ul></description></item><item><title>redis_尚硅谷_01-05</title><link>https://blog.liuyi2026.asia/zh/docs/technology/Redis/shangguigu_BV1Rv41177Af_/01-05/</link><pubDate>Mon, 27 Dec 2021 09:09:03 +0000</pubDate><guid>https://blog.liuyi2026.asia/zh/docs/technology/Redis/shangguigu_BV1Rv41177Af_/01-05/</guid><description>&lt;h2 id="课程简介">课程简介&lt;a class="anchor" href="#%e8%af%be%e7%a8%8b%e7%ae%80%e4%bb%8b">#&lt;/a>&lt;/h2>
&lt;p>NoSQL数据库简介、Redis概述与安装、常用五大数据结构、配置文件详解、发布与订阅、Redis6新数据类型、Redis与spring boot整合、事务操作、持久化之RDB、持久化之AOF、主从复制及集群、Redis6应用问题(缓存穿透、击穿、雪崩以及分布式锁)、Redis6新增功能&lt;/p>
&lt;h2 id="nosql数据库简介">NoSQL数据库简介&lt;a class="anchor" href="#nosql%e6%95%b0%e6%8d%ae%e5%ba%93%e7%ae%80%e4%bb%8b">#&lt;/a>&lt;/h2>
&lt;ul>
&lt;li>Redis属于NoSQL数据库&lt;/li>
&lt;li>技术分为三大类
&lt;ul>
&lt;li>解决功能性问题：Java、Jsp、RDBMS、Tomcat、Linux、JDBC、SVN&lt;/li>
&lt;li>解决扩展性问题：Struts、Spring、SpringMVC、Hibernate、Mybatis&lt;/li>
&lt;li>解决性能问题：NoSQL、Java线程、Nginx、MQ、ElasticSearch&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>缓存数据库的好处
&lt;ul>
&lt;li>完全在内存中，速度快，结构简单&lt;/li>
&lt;li>作为缓存数据库：减少io的读操作&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>NoSQL＝Not Only SQL,不仅仅是SQL，泛指&lt;strong>非泛型数据库&lt;/strong>
&lt;ul>
&lt;li>不支持ACID(但是NoSQL支持事务)&lt;/li>
&lt;li>选超于SQL的性能&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>NoSQL适用场景
&lt;ul>
&lt;li>对数据高并发的读写&lt;/li>
&lt;li>海量数据的读写&lt;/li>
&lt;li>对数据高可扩展性&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>NoSQL不适用的场景
&lt;ul>
&lt;li>需要事务支持&lt;/li>
&lt;li>基于sql的结构化查询存储&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>多种NoSQL数据库介绍
&lt;ul>
&lt;li>Memcache 不支持持久化，数据类型单一，一般作为辅助持久化的数据库&lt;/li>
&lt;li>Redis 支持持久化，除了k-v模式还有其他多种数据结构，一般作为辅助持久化的数据库&lt;/li>
&lt;li>MongoDB，是文档型数据类型；k-v模型，但是对value提供了丰富的查询功能；支持二进制数据及大型对象；替代RDBMS，成为独立数据库&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>大数据时代（行式数据库、列式数据库）
&lt;ul>
&lt;li>行式数据库&lt;br>
查询某一块数据的时候效率高&lt;br>
&lt;img src="img/ly-20241212142159687.png" alt="" />&lt;/li>
&lt;li>列式数据库&lt;br>
查询某一列统计信息快&lt;br>
&lt;img src="img/ly-20241212142159845.png" alt="" />&lt;/li>
&lt;li>其他&lt;br>
Hbase，Cassandra，图关系数据库(比如社会关系，公共交通网等)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>小计&lt;br>
NoSQL数据库是为提高性能而产生的非关系型数据库&lt;/li>
&lt;/ul>
&lt;h2 id="redis概述与安装">Redis概述与安装&lt;a class="anchor" href="#redis%e6%a6%82%e8%bf%b0%e4%b8%8e%e5%ae%89%e8%a3%85">#&lt;/a>&lt;/h2>
&lt;ul>
&lt;li>简单概述
&lt;ul>
&lt;li>Redis是一个开源的kv存储系统&lt;/li>
&lt;li>相比Mencached，支持存储的数据类型更多，包括string，list，set，zset以及hash，这些类型都支持(pop、add/remove及取交并集和差集等)，操作都是原子性的&lt;/li>
&lt;li>Redis数据都是缓存在内存中&lt;/li>
&lt;li>Redis会周期性地把数据写入磁盘或修改操作写入追加的记录文件&lt;/li>
&lt;li>能在此基础上实现master-slave(主从)同步&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Redis功能
&lt;ul>
&lt;li>配合关系型数据库做高速缓存&lt;/li>
&lt;li>Redis具有多样的数据结构存储持久化数据&lt;/li>
&lt;li>其他部分功能&lt;br>
&lt;img src="img/ly-20241212142159875.png" alt="" />&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Redis安装
&lt;ul>
&lt;li>从官网中下载redis-6.xx.tar.gz包(该教程在linux中使用redis6教学)&lt;/li>
&lt;li>编译redis需要gcc环境
&lt;ul>
&lt;li>使用gcc &amp;ndash;version查看服务器是否有gcc环境&lt;/li>
&lt;li>如果没有需要进行安装
&lt;pre tabindex="0">&lt;code class="language-l" data-lang="l">apt install -y gcc
或者
yum install -y gcc&lt;/code>&lt;/pre>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>将redis压缩文件进行解压
&lt;pre tabindex="0">&lt;code>tar -zxvf redis-6xx.tar.gz&lt;/code>&lt;/pre>&lt;/li>
&lt;li>进入解压后的文件夹，并使用make命令进行编译
&lt;pre tabindex="0">&lt;code>make&lt;/code>&lt;/pre>&lt;/li>
&lt;li>如果报错了，需要先用下面命令清理，之后再进行编译
&lt;pre tabindex="0">&lt;code>make distclean&lt;/code>&lt;/pre>&lt;/li>
&lt;li>安装redis
&lt;pre tabindex="0">&lt;code>make install&lt;/code>&lt;/pre>&lt;/li>
&lt;li>进入/usr/local/bin目录，查看目录&lt;br>
&lt;img src="img/ly-20241212142159913.png" alt="" />&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Redis启动
&lt;ul>
&lt;li>前台启动
&lt;pre tabindex="0">&lt;code>redis-server &lt;/code>&lt;/pre>&lt;/li>
&lt;li>后台启动
&lt;ul>
&lt;li>在刚才解压的文件夹中，拷贝出redis.conf文件(这里拷贝到/etc/目录下)
&lt;pre tabindex="0">&lt;code>cp redis.conf /etc/redis.conf&lt;/code>&lt;/pre>&lt;/li>
&lt;li>到etc中修改redis.conf文件
&lt;pre tabindex="0">&lt;code>vim /etc/redis.conf
# 进入编辑器后使用下面命令进行搜索并回车
/daemonize no&lt;/code>&lt;/pre>将no改为yes并保存&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>进入/usr/local/bin目录启动redis
&lt;pre tabindex="0">&lt;code>redis-server /etc/redis.conf &lt;/code>&lt;/pre>&lt;/li>
&lt;li>查看进程，发现redis已经启动
&lt;pre tabindex="0">&lt;code>ps -ef | grep redis&lt;/code>&lt;/pre>&lt;/li>
&lt;li>使用redis-cli 客户端连接redis
&lt;pre tabindex="0">&lt;code>redis-cli
keys * &lt;/code>&lt;/pre>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="相关知识">相关知识&lt;a class="anchor" href="#%e7%9b%b8%e5%85%b3%e7%9f%a5%e8%af%86">#&lt;/a>&lt;/h2>
&lt;ul>
&lt;li>Redis6379的由来
&lt;ul>
&lt;li>人名Merz 在九宫格对应的数字就是6379&lt;br>
&lt;img src="img/ly-20241212142159946.png" alt="" />&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Redis默认有15个库，默认数据都在数据库0中，所有库的密码都是相同的&lt;/li>
&lt;li>Redis是单线程+多路复用技术
&lt;ul>
&lt;li>Redis是串行操作&lt;br>
&lt;img src="img/ly-20241212142159981.png" alt="" />&lt;/li>
&lt;li>火车站的例子&lt;br>
当1，2，3没有票的时候，不用一直等待买票，可以继续做自己的事情，黄牛买到票就会通知123进行取票&lt;br>
&lt;img src="img/ly-20241212142200015.png" alt="" />&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Memcached和Redis区别
&lt;ul>
&lt;li>Memcached支持单一数据类型，Redis支持多数据类型&lt;/li>
&lt;li>Memcached不支持持久化&lt;/li>
&lt;li>Memcached用的多线程+锁的机制，Redis用的是单线程+多路复用程序&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;h2 id="end">End&lt;a class="anchor" href="#end">#&lt;/a>&lt;/h2></description></item></channel></rss>