<?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 Dapeng Zhang</title><link>https://zhangdapeng.dev/tags/redis/</link><description>Recent content in Redis on Dapeng Zhang</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Fri, 11 Jul 2025 11:14:46 +0000</lastBuildDate><atom:link href="https://zhangdapeng.dev/tags/redis/index.xml" rel="self" type="application/rss+xml"/><item><title>Redis小知识 - Redis持久化方式</title><link>https://zhangdapeng.dev/p/redis-xiao-zhi-shi-redis-chi-jiu-hua-fang-shi/</link><pubDate>Fri, 11 Jul 2025 11:14:46 +0000</pubDate><guid>https://zhangdapeng.dev/p/redis-xiao-zhi-shi-redis-chi-jiu-hua-fang-shi/</guid><description>&lt;p&gt;redis持久化方式&lt;/p&gt;
&lt;h3 id="第一种方式快照"&gt;第一种方式：快照
&lt;/h3&gt;&lt;p&gt;快照是默认的持久化方式。这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。&lt;/p&gt;
&lt;p&gt;可以通过配置设置自动做快照持久化的方式。我们可以配置 redis在 n 秒内如果超过 m 个 key 被修改就自动做快照，下面是默认的快照保存配置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;save 900 1 #900 秒内如果超过 1 个 key 被修改，则发起快照保存&lt;/li&gt;
&lt;li&gt;save 300 10 #300 秒内容如超过 10 个 key 被修改，则发起快照保存&lt;/li&gt;
&lt;li&gt;save 60 10000&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;快照保存过程&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;redis 调用 fork,现在有了子进程和父进程。&lt;/li&gt;
&lt;li&gt;父进程继续处理 client 请求，子进程负责将内存内容写入到临时文件。由于 os 的实时复制机制（ copy on write)父子进程会共享相同的物理页面，当父进程处理写请求时 os 会为父进程要修改的页面创建副本，而不是写共享的页面。所以子进程地址空间内的数据是 fork时刻整个数据库的一个快照。&lt;/li&gt;
&lt;li&gt;当子进程将快照写入临时文件完毕后，用临时文件替换原来的快照文件，然后子进程退出。client 也可以使用 save 或者 bgsave 命令通知 redis 做一次快照持久化。 save 操作是在主线程中保存快照的，由于 redis 是用一个主线程来处理所有 client 的请求，这种方式会阻塞所有client 请求。所以不推荐使用。另一点需要注意的是，每次快照持久化都是将内存数据完整写入到磁盘一次，并不是增量的只同步变更数据。如果数据量大的话，而且写操作比较多，必然会引起大量的磁盘 io 操作，可能会严重影响性能。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="第一种方式aof"&gt;第一种方式：aof
&lt;/h3&gt;&lt;p&gt;由于快照方式是在一定间隔时间做一次的，所以如果 redis 意外 down 掉的话，就会丢失最后一次快照后的所有修改。如果应用要求不能丢失任何修改的话，可以采用 aof 持久化方式。&lt;br&gt;
aof 比快照方式有更好的持久化性，是由于在使用 aof 持久化方式时,redis 会将每一个收到的写命令都通过 write 函数追加到文件中(默认是 appendonly.aof)。当 redis 重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。&lt;br&gt;
当然由于 os 会在内核中缓存 write 做的修改，所以可能不是立即写到磁盘上。这样 aof 方式的持久化也还是有可能会丢失部分修改。不过我们可以通过配置文件告诉 redis 我们想要通过 fsync 函数强制 os 写入到磁盘的时机。有三种方式如下（默认是：每秒 fsync 一次）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;appendonly yes // 启用 aof 持久化方式&lt;/li&gt;
&lt;li&gt;appendfsync always // 收到写命令就立即写入磁盘，最慢，但是保证完全的持久化&lt;/li&gt;
&lt;li&gt;appendfsync everysec // 每秒钟写入磁盘一次，在性能和持久化方面做了很好的折中&lt;/li&gt;
&lt;li&gt;appendfsync no // 完全依赖 os，性能最好,持久化没保证&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;aof 的方式也同时带来了另一个问题。持久化文件会变的越来越大。例如我们调用 incr test命令 100 次，文件中必须保存全部的 100 条命令，其实有 99 条都是多余的。因为要恢复数据库的状态其实文件中保存一条 set test 100 就够了。为了压缩 aof 的持久化文件。 redis 提供了 bgrewriteaof 命令。收到此命令 redis 将使用与快照类似的方式将内存中的数据以命令的方式保存到临时文件中，最后替换原来的文件。&lt;/p&gt;</description></item><item><title>Redis 3 版本 集群配置</title><link>https://zhangdapeng.dev/p/redis-3-ban-ben-ji-qun-pei-zhi/</link><pubDate>Thu, 03 Jul 2025 11:08:07 +0000</pubDate><guid>https://zhangdapeng.dev/p/redis-3-ban-ben-ji-qun-pei-zhi/</guid><description>&lt;p&gt;最近项目需要，需要在服务器上做下redis的集群配置。&lt;/p&gt;
&lt;p&gt;这里说下我自己的经验，应该是redis自3版本以后才支持redis，以前的版本也有集群，但是不是真正意义上的集群，从配置文件上就能够分别出来，3以前的版本是没有cluster的相关配置项的，从3版本以后才开始支持的。这个导致我一直以为3以前的版本也是支持的，折腾了好久，不过2版本可以通过master/slave的方式搭建类似集群的功能。&lt;/p&gt;
&lt;p&gt;所以，如果你是想使用redis的集群功能，首先还是把自己的redis升级为至少是3版本的吧。&lt;/p&gt;
&lt;p&gt;我这里记录的是redis 3.2.1版本的。&lt;/p&gt;
&lt;p&gt;整个的配置流程事实上是可以直接使用redis自己提供的create-cluster进行创建，这个工具整个进行管理起来比较方便快捷，就是在配置上都不够便捷。&lt;/p&gt;
&lt;p&gt;首先就是下载redis，下载地址：&lt;a class="link" href="http://download.redis.io/releases/redis-3.2.1.tar.gz" target="_blank" rel="noopener"
 &gt;http://download.redis.io/releases/redis-3.2.1.tar.gz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;下载后解压到目录/usr/local/redis目录【这里不熟悉tar 命令的自行google】&lt;/p&gt;
&lt;p&gt;进入到redis目录后执行&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果需要root权限的话，执行&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我这里因为有人已经在系统里面安装了redis,我有不想去打扰他的，我就自己干一个独立的好了，事实上也是互不干扰的。&lt;/p&gt;
&lt;p&gt;如果是独立安装的话，可以接着执行&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo make install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果跟我一样的话，上面的环节就可以省略了。&lt;/p&gt;
&lt;p&gt;接下来，我按照我的情况来说。&lt;/p&gt;
&lt;p&gt;进入到src目录下面，应该会有很多你熟悉的命令文件了。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╭─zhangdapeng@qeeniao4-HZ /usr/local/redis/src 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;╰─➤ ls
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;adlist.c bio.h db.c intset.c multi.c rand.h redis-cli.o sds.o sparkline.c util.h
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;adlist.h bio.o db.o intset.h multi.o rand.o redis-sentinel sentinel.c sparkline.h util.o
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;adlist.o bitops.c debug.c intset.o networking.c rdb.c redis-server sentinel.o sparkline.o valgrind.sup
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ae.c bitops.o debug.o latency.c networking.o rdb.h redis-trib.rb server.c syncio.c version.h
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ae_epoll.c blocked.c dict.c latency.h notify.c rdb.o release.c server.h syncio.o ziplist.c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ae_evport.c blocked.o dict.h latency.o notify.o redisassert.h release.h server.o testhelp.h ziplist.h
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ae.h cluster.c dict.o lzf_c.c object.c redis-benchmark release.o setproctitle.c t_hash.c ziplist.o
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ae_kqueue.c cluster.h endianconv.c lzf_c.o object.o redis-benchmark.c replication.c setproctitle.o t_hash.o zipmap.c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ae.o cluster.o endianconv.h lzf_d.c pqsort.c redis-benchmark.o replication.o sha1.c t_list.c zipmap.h
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ae_select.c config.c endianconv.o lzf_d.o pqsort.h redis-check-aof rio.c sha1.h t_list.o zipmap.o
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;anet.c config.h fmacros.h lzf.h pqsort.o redis-check-aof.c rio.h sha1.o t_set.c zmalloc.c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;anet.h config.o geo.c lzfP.h pubsub.c redis-check-aof.o rio.o slowlog.c t_set.o zmalloc.h
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;anet.o crc16.c geo.h Makefile pubsub.o redis-check-rdb scripting.c slowlog.h t_string.c zmalloc.o
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aof.c crc16.o geo.o Makefile.dep quicklist.c redis-check-rdb.c scripting.o slowlog.o t_string.o
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aof.o crc64.c help.h memtest.c quicklist.h redis-check-rdb.o sdsalloc.h solarisfixes.h t_zset.c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;asciilogo.h crc64.h hyperloglog.c memtest.o quicklist.o redis-cli sds.c sort.c t_zset.o
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bio.c crc64.o hyperloglog.o mkreleasehdr.sh rand.c redis-cli.c sds.h sort.o util.c
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;太多了，我们重点关注几个就好了，redis-cli,redis-server,redis-trib.rb.&lt;/p&gt;
&lt;p&gt;接下来让我们创建配置文件吧。&lt;/p&gt;
&lt;p&gt;进入/usr/local/etc目录，没有的话，就自己建立一个，或者根据自己的情况来也是可以的。&lt;/p&gt;
&lt;p&gt;建立一个redis的目录，在redis目录下，从原有的redis.conf复制一份改为redis_7001.conf,由于这里我们需要用到6个，所以我们一次建立了6个redis配置文件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r-- &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; root root 45K 7月 &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; 18:32 redis_7001.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r-- &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; root root 45K 7月 &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; 18:32 redis_7002.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r-- &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; root root 45K 7月 &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; 18:33 redis_7003.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r-- &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; root root 45K 7月 &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; 18:33 redis_7004.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r-- &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; root root 45K 7月 &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; 18:33 redis_7005.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-rw-r--r-- &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; root root 45K 7月 &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt; 18:34 redis_7006.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里我简单的列出需要修改的项&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bind 114.xxx.xxx.xxx 127.0.0.1//这里是你要绑定的ip地址【这里有料，下面解说】
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;port 7001//端口号
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;daemonize yes//
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pidfile /var/run/redis_7001.pid
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;logfile &lt;span style="color:#e6db74"&gt;&amp;#34;/var/log/redis/redis_7001.log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;appendonly yes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;appendfilename &lt;span style="color:#e6db74"&gt;&amp;#34;appendonly.aof&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cluster-enabled yes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cluster-config-file nodes-7001.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cluster-node-timeout &lt;span style="color:#ae81ff"&gt;15000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里只是展示了redis_7001.conf这个文件需要修改的地址，其他5个同样的，只是将7001换成对应的数字就好了。&lt;/p&gt;
&lt;p&gt;配置完后，就可以启动喽。&lt;/p&gt;
&lt;p&gt;回到redis/src目录，执行&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./redis-server /usr/local/etc/redis/redis_7001.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./redis-server /usr/local/etc/redis/redis_7002.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./redis-server /usr/local/etc/redis/redis_7003.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./redis-server /usr/local/etc/redis/redis_7004.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./redis-server /usr/local/etc/redis/redis_7005.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./redis-server /usr/local/etc/redis/redis_7006.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看是否已经启动了。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ps -ef | grep redis&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;如果看到如下的结果说明，已经启动成功了，如果有问题，说明还是需要检查一下配置文件。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root &lt;span style="color:#ae81ff"&gt;17979&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; 7月07 ? 00:00:16 ../../../redis/src/redis-server 114.xxx.xxx.xxx:7001 &lt;span style="color:#f92672"&gt;[&lt;/span&gt;cluster&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root &lt;span style="color:#ae81ff"&gt;17988&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; 7月07 ? 00:00:16 ../../../redis/src/redis-server 114.xxx.xxx.xxx:7002 &lt;span style="color:#f92672"&gt;[&lt;/span&gt;cluster&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root &lt;span style="color:#ae81ff"&gt;17997&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; 7月07 ? 00:00:17 ../../../redis/src/redis-server 114.xxx.xxx.xxx:7003 &lt;span style="color:#f92672"&gt;[&lt;/span&gt;cluster&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root &lt;span style="color:#ae81ff"&gt;18006&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; 7月07 ? 00:00:15 ../../../redis/src/redis-server 114.xxx.xxx.xxx:7004 &lt;span style="color:#f92672"&gt;[&lt;/span&gt;cluster&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root &lt;span style="color:#ae81ff"&gt;18015&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; 7月07 ? 00:00:16 ../../../redis/src/redis-server 114.xxx.xxx.xxx:7005 &lt;span style="color:#f92672"&gt;[&lt;/span&gt;cluster&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;root &lt;span style="color:#ae81ff"&gt;18024&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; 7月07 ? 00:00:15 ../../../redis/src/redis-server 114.xxx.xxx.xxx:7006 &lt;span style="color:#f92672"&gt;[&lt;/span&gt;cluster&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;奇怪了，我这里为啥会显示我自己服务器的ip呢？【就是下面要讲的猛料】&lt;/p&gt;
&lt;p&gt;redis是启动成功了，但是我们还要进行一次设置，就是集群的设置，还是在redis/src目录&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./redis-trib.rb create --replicas &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;命令的意义如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;给定 redis-trib.rb 程序的命令是 create ， 这表示我们希望创建一个新的集群。&lt;/li&gt;
&lt;li&gt;选项 &amp;ndash;replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。&lt;/li&gt;
&lt;li&gt;之后跟着的其他参数则是实例的地址列表， 我们希望程序使用这些地址所指示的实例来创建新集群。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;简单来说， 以上命令的意思就是让 redis-trib 程序创建一个包含三个主节点和三个从节点的集群。&lt;/p&gt;
&lt;p&gt;接着， redis-trib 会打印出一份预想中的配置给你看， 如果你觉得没问题的话， 就可以输入 yes ， redis-trib 就会将这份配置应用到集群当中：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; Creating cluster
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Connecting to node 127.0.0.1:7000: OK
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Connecting to node 127.0.0.1:7001: OK
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Connecting to node 127.0.0.1:7002: OK
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Connecting to node 127.0.0.1:7003: OK
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Connecting to node 127.0.0.1:7004: OK
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Connecting to node 127.0.0.1:7005: OK
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; Performing hash slots allocation on &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt; nodes...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Using &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; masters:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;127.0.0.1:7000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;127.0.0.1:7001
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;127.0.0.1:7002
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;M: 2774f156af482b4f76a5c0bda8ec561a8a1719c2 127.0.0.1:7000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; slots:0-5460 &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5461&lt;/span&gt; slots&lt;span style="color:#f92672"&gt;)&lt;/span&gt; master
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;M: 2d03b862083ee1b1785dba5db2987739cf3a80eb 127.0.0.1:7001
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; slots:5461-10922 &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5462&lt;/span&gt; slots&lt;span style="color:#f92672"&gt;)&lt;/span&gt; master
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;M: 0456869a2c2359c3e06e065a09de86df2e3135ac 127.0.0.1:7002
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; slots:10923-16383 &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5461&lt;/span&gt; slots&lt;span style="color:#f92672"&gt;)&lt;/span&gt; master
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;S: 37b251500385929d5c54a005809377681b95ca90 127.0.0.1:7003
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; replicates 2774f156af482b4f76a5c0bda8ec561a8a1719c2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;S: e2e2e692c40fc34f700762d1fe3a8df94816a062 127.0.0.1:7004
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; replicates 2d03b862083ee1b1785dba5db2987739cf3a80eb
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;S: 9923235f8f2b2587407350b1d8b887a7a59de8db 127.0.0.1:7005
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; replicates 0456869a2c2359c3e06e065a09de86df2e3135ac
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Can I set the above configuration? &lt;span style="color:#f92672"&gt;(&lt;/span&gt;type &lt;span style="color:#e6db74"&gt;&amp;#39;yes&amp;#39;&lt;/span&gt; to accept&lt;span style="color:#f92672"&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输入 yes 并按下回车确认之后， 集群就会将配置应用到各个节点， 并连接起（join）各个节点 —— 也即是， 让各个节点开始互相通讯&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Can I set the above configuration? &lt;span style="color:#f92672"&gt;(&lt;/span&gt;type &lt;span style="color:#e6db74"&gt;&amp;#39;yes&amp;#39;&lt;/span&gt; to accept&lt;span style="color:#f92672"&gt;)&lt;/span&gt;: yes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; Nodes configuration updated
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; Assign a different config epoch to each node
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; Sending CLUSTER MEET messages to join the cluster
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Waiting &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; the cluster to join......
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; Performing Cluster Check &lt;span style="color:#f92672"&gt;(&lt;/span&gt;using node 127.0.0.1:7000&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;M: 2774f156af482b4f76a5c0bda8ec561a8a1719c2 127.0.0.1:7000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; slots:0-5460 &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5461&lt;/span&gt; slots&lt;span style="color:#f92672"&gt;)&lt;/span&gt; master
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;M: 2d03b862083ee1b1785dba5db2987739cf3a80eb 127.0.0.1:7001
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; slots:5461-10922 &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5462&lt;/span&gt; slots&lt;span style="color:#f92672"&gt;)&lt;/span&gt; master
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;M: 0456869a2c2359c3e06e065a09de86df2e3135ac 127.0.0.1:7002
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; slots:10923-16383 &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5461&lt;/span&gt; slots&lt;span style="color:#f92672"&gt;)&lt;/span&gt; master
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;M: 37b251500385929d5c54a005809377681b95ca90 127.0.0.1:7003
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; slots: &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; slots&lt;span style="color:#f92672"&gt;)&lt;/span&gt; master
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; replicates 2774f156af482b4f76a5c0bda8ec561a8a1719c2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;M: e2e2e692c40fc34f700762d1fe3a8df94816a062 127.0.0.1:7004
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; slots: &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; slots&lt;span style="color:#f92672"&gt;)&lt;/span&gt; master
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; replicates 2d03b862083ee1b1785dba5db2987739cf3a80eb
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;M: 9923235f8f2b2587407350b1d8b887a7a59de8db 127.0.0.1:7005
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; slots: &lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; slots&lt;span style="color:#f92672"&gt;)&lt;/span&gt; master
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; replicates 0456869a2c2359c3e06e065a09de86df2e3135ac
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;OK&lt;span style="color:#f92672"&gt;]&lt;/span&gt; All nodes agree about slots configuration.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; Check &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; open slots...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; Check slots coverage...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;OK&lt;span style="color:#f92672"&gt;]&lt;/span&gt; All &lt;span style="color:#ae81ff"&gt;16384&lt;/span&gt; slots covered.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一切都正常的话会输出&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;OK&lt;span style="color:#f92672"&gt;]&lt;/span&gt; All nodes agree about slots configuration.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; Check &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; open slots...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt; Check slots coverage...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;OK&lt;span style="color:#f92672"&gt;]&lt;/span&gt; All &lt;span style="color:#ae81ff"&gt;16384&lt;/span&gt; slots covered.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;到这里就一切万事大吉了，如果还是需要其他的额外的帮助，可以到这里看看&lt;a class="link" href="http://www.cnblogs.com/gomysql/p/4395504.html" target="_blank" rel="noopener"
 &gt;http://www.cnblogs.com/gomysql/p/4395504.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;【猛料解析】&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bind 114.xxx.xxx.xxx 127.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里我为哈把地址写成这样呢？主要是是因为，第一个是可以远程了解，换个位置的话也是可以的，但是在远程了解的情况下会出现一个问题，就是在做转向的时候，会由于第一个ip地址的不同而不同，如果是127.0.0.1的话，那么在远程链接的时候就跳转到127.0.0.1这个ip上来了，同理换成其他地址的话，就会跳转到其他地址，自己可以实验一下，可以使用类似node的ioredis的这样库测试，或者直接命令行链接，会比较明显，就是因为这里，如果配置不好的话，后面使用第三方库连接的话，会一直连接不上。&lt;/p&gt;</description></item><item><title>redis-cli 命令总结</title><link>https://zhangdapeng.dev/p/redis-cli-ming-ling-zong-jie/</link><pubDate>Mon, 23 Jun 2025 15:27:39 +0000</pubDate><guid>https://zhangdapeng.dev/p/redis-cli-ming-ling-zong-jie/</guid><description>&lt;p&gt;Redis提供了丰富的命令（command）对数据库和各种数据类型进行操作，这些command可以在Linux终端使用。在编程时，比如使用Redis 的Java语言包，这些命令都有对应的方法。下面将Redis提供的命令做一总结。&lt;/p&gt;
&lt;p&gt;官网命令列表：&lt;a class="link" href="http://redis.io/commands" target="_blank" rel="noopener"
 &gt;http://redis.io/commands&lt;/a&gt; （英文）&lt;/p&gt;
&lt;h3 id="连接操作相关的命令"&gt;&lt;a class="link" href="#1" &gt;连接操作相关的命令&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;quit：关闭连接（connection）&lt;/p&gt;
&lt;p&gt;auth：简单密码认证&lt;/p&gt;
&lt;h3 id="对value操作的命令"&gt;&lt;a class="link" href="#2" &gt;对value操作的命令&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;exists(key)：确认一个key是否存在&lt;/p&gt;
&lt;p&gt;del(key)：删除一个key&lt;/p&gt;
&lt;p&gt;type(key)：返回值的类型&lt;/p&gt;
&lt;p&gt;keys(pattern)：返回满足给定pattern的所有key&lt;/p&gt;
&lt;p&gt;randomkey：随机返回key空间的一个key&lt;/p&gt;
&lt;p&gt;rename(oldname, newname)：将key由oldname重命名为newname，若newname存在则删除newname表示的key&lt;/p&gt;
&lt;p&gt;dbsize：返回当前数据库中key的数目&lt;/p&gt;
&lt;p&gt;expire：设定一个key的活动时间（s）&lt;/p&gt;
&lt;p&gt;ttl：获得一个key的活动时间&lt;/p&gt;
&lt;p&gt;select(index)：按索引查询&lt;/p&gt;
&lt;p&gt;move(key, dbindex)：将当前数据库中的key转移到有dbindex索引的数据库&lt;/p&gt;
&lt;p&gt;flushdb：删除当前选择数据库中的所有key&lt;/p&gt;
&lt;p&gt;flushall：删除所有数据库中的所有key&lt;/p&gt;
&lt;h3 id="对string操作的命令"&gt;&lt;a class="link" href="#3" &gt;对String操作的命令&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;set(key, value)：给数据库中名称为key的string赋予值value&lt;/p&gt;
&lt;p&gt;get(key)：返回数据库中名称为key的string的value&lt;/p&gt;
&lt;p&gt;getset(key, value)：给名称为key的string赋予上一次的value&lt;/p&gt;
&lt;p&gt;mget(key1, key2,…, key N)：返回库中多个string（它们的名称为key1，key2…）的value&lt;/p&gt;
&lt;p&gt;setnx(key, value)：如果不存在名称为key的string，则向库中添加string，名称为key，值为value&lt;/p&gt;
&lt;p&gt;setex(key, time, value)：向库中添加string（名称为key，值为value）同时，设定过期时间time&lt;/p&gt;
&lt;p&gt;mset(key1, value1, key2, value2,…key N, value N)：同时给多个string赋值，名称为key i的string赋值value i&lt;/p&gt;
&lt;p&gt;msetnx(key1, value1, key2, value2,…key N, value N)：如果所有名称为key i的string都不存在，则向库中添加string，名称key i赋值为value i&lt;/p&gt;
&lt;p&gt;incr(key)：名称为key的string增1操作&lt;/p&gt;
&lt;p&gt;incrby(key, integer)：名称为key的string增加integer&lt;/p&gt;
&lt;p&gt;decr(key)：名称为key的string减1操作&lt;/p&gt;
&lt;p&gt;decrby(key, integer)：名称为key的string减少integer&lt;/p&gt;
&lt;p&gt;append(key, value)：名称为key的string的值附加value&lt;/p&gt;
&lt;p&gt;substr(key, start, end)：返回名称为key的string的value的子串&lt;/p&gt;
&lt;h3 id="对list操作的命令"&gt;&lt;a class="link" href="#4" &gt;对List操作的命令&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;rpush(key, value)：在名称为key的list尾添加一个值为value的元素&lt;/p&gt;
&lt;p&gt;lpush(key, value)：在名称为key的list头添加一个值为value的 元素&lt;/p&gt;
&lt;p&gt;llen(key)：返回名称为key的list的长度&lt;/p&gt;
&lt;p&gt;lrange(key, start, end)：返回名称为key的list中start至end之间的元素（下标从0开始，下同）&lt;/p&gt;
&lt;p&gt;ltrim(key, start, end)：截取名称为key的list，保留start至end之间的元素&lt;/p&gt;
&lt;p&gt;lindex(key, index)：返回名称为key的list中index位置的元素&lt;/p&gt;
&lt;p&gt;lset(key, index, value)：给名称为key的list中index位置的元素赋值为value&lt;/p&gt;
&lt;p&gt;lrem(key, count, value)：删除count个名称为key的list中值为value的元素。count为0，删除所有值为value的元素，count&amp;gt;0从 头至尾删除count个值为value的元素，count&amp;lt;0从尾到头删除|count|个值为value的元素。 lpop(key)：返回并删除名称为key的list中的首元素 rpop(key)：返回并删除名称为key的list中的尾元素 blpop(key1, key2,… key N, timeout)：lpop命令的block版本。即当timeout为0时，若遇到名称为key i的list不存在或该list为空，则命令结束。如果timeout&amp;gt;0，则遇到上述情况时，等待timeout秒，如果问题没有解决，则对 keyi+1开始的list执行pop操作。&lt;/p&gt;
&lt;p&gt;brpop(key1, key2,… key N, timeout)：rpop的block版本。参考上一命令。&lt;/p&gt;
&lt;p&gt;rpoplpush(srckey, dstkey)：返回并删除名称为srckey的list的尾元素，并将该元素添加到名称为dstkey的list的头部&lt;/p&gt;
&lt;h3 id="对set操作的命令"&gt;&lt;a class="link" href="#5" &gt;对Set操作的命令&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;sadd(key, member)：向名称为key的set中添加元素member&lt;/p&gt;
&lt;p&gt;srem(key, member) ：删除名称为key的set中的元素member&lt;/p&gt;
&lt;p&gt;spop(key) ：随机返回并删除名称为key的set中一个元素&lt;/p&gt;
&lt;p&gt;smove(srckey, dstkey, member) ：将member元素从名称为srckey的集合移到名称为dstkey的集合&lt;/p&gt;
&lt;p&gt;scard(key) ：返回名称为key的set的基数&lt;/p&gt;
&lt;p&gt;sismember(key, member) ：测试member是否是名称为key的set的元素&lt;/p&gt;
&lt;p&gt;sinter(key1, key2,…key N) ：求交集&lt;/p&gt;
&lt;p&gt;sinterstore(dstkey, key1, key2,…key N) ：求交集并将交集保存到dstkey的集合&lt;/p&gt;
&lt;p&gt;sunion(key1, key2,…key N) ：求并集&lt;/p&gt;
&lt;p&gt;sunionstore(dstkey, key1, key2,…key N) ：求并集并将并集保存到dstkey的集合&lt;/p&gt;
&lt;p&gt;sdiff(key1, key2,…key N) ：求差集&lt;/p&gt;
&lt;p&gt;sdiffstore(dstkey, key1, key2,…key N) ：求差集并将差集保存到dstkey的集合&lt;/p&gt;
&lt;p&gt;smembers(key) ：返回名称为key的set的所有元素&lt;/p&gt;
&lt;p&gt;srandmember(key) ：随机返回名称为key的set的一个元素&lt;/p&gt;
&lt;h3 id="对zsetsorted-set操作的命令"&gt;&lt;a class="link" href="#6" &gt;对zset（sorted set）操作的命令&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;zadd(key, score, member)：向名称为key的zset中添加元素member，score用于排序。如果该元素已经存在，则根据score更新该元素的顺序。&lt;/p&gt;
&lt;p&gt;zrem(key, member) ：删除名称为key的zset中的元素member&lt;/p&gt;
&lt;p&gt;zincrby(key, increment, member) ：如果在名称为key的zset中已经存在元素member，则该元素的score增加increment；否则向集合中添加该元素，其score的值为increment&lt;/p&gt;
&lt;p&gt;zrank(key, member) ：返回名称为key的zset（元素已按score从小到大排序）中member元素的rank（即index，从0开始），若没有member元素，返回“nil”&lt;/p&gt;
&lt;p&gt;zrevrank(key, member) ：返回名称为key的zset（元素已按score从大到小排序）中member元素的rank（即index，从0开始），若没有member元素，返回“nil”&lt;/p&gt;
&lt;p&gt;zrange(key, start, end)：返回名称为key的zset（元素已按score从小到大排序）中的index从start到end的所有元素&lt;/p&gt;
&lt;p&gt;zrevrange(key, start, end)：返回名称为key的zset（元素已按score从大到小排序）中的index从start到end的所有元素&lt;/p&gt;
&lt;p&gt;zrangebyscore(key, min, max)：返回名称为key的zset中score &amp;gt;= min且score &amp;lt;= max的所有元素 zcard(key)：返回名称为key的zset的基数 zscore(key, element)：返回名称为key的zset中元素element的score zremrangebyrank(key, min, max)：删除名称为key的zset中rank &amp;gt;= min且rank &amp;lt;= max的所有元素 zremrangebyscore(key, min, max) ：删除名称为key的zset中score &amp;gt;= min且score &amp;lt;= max的所有元素&lt;/p&gt;
&lt;p&gt;zunionstore / zinterstore(dstkeyN, key1,…,keyN, WEIGHTS w1,…wN, AGGREGATE SUM|MIN|MAX)：对N个zset求并集和交集，并将最后的集合保存在dstkeyN中。对于集合中每一个元素的score，在进行 AGGREGATE运算前，都要乘以对于的WEIGHT参数。如果没有提供WEIGHT，默认为1。默认的AGGREGATE是SUM，即结果集合中元素 的score是所有集合对应元素进行SUM运算的值，而MIN和MAX是指，结果集合中元素的score是所有集合对应元素中最小值和最大值。&lt;/p&gt;
&lt;h3 id="对hash操作的命令"&gt;&lt;a class="link" href="#7" &gt;对Hash操作的命令&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;hset(key, field, value)：向名称为key的hash中添加元素field&amp;lt;—&amp;gt;value&lt;/p&gt;
&lt;p&gt;hget(key, field)：返回名称为key的hash中field对应的value&lt;/p&gt;
&lt;p&gt;hmget(key, field1, …,field N)：返回名称为key的hash中field i对应的value&lt;/p&gt;
&lt;p&gt;hmset(key, field1, value1,…,field N, value N)：向名称为key的hash中添加元素field i&amp;lt;—&amp;gt;value i&lt;/p&gt;
&lt;p&gt;hincrby(key, field, integer)：将名称为key的hash中field的value增加integer&lt;/p&gt;
&lt;p&gt;hexists(key, field)：名称为key的hash中是否存在键为field的域&lt;/p&gt;
&lt;p&gt;hdel(key, field)：删除名称为key的hash中键为field的域&lt;/p&gt;
&lt;p&gt;hlen(key)：返回名称为key的hash中元素个数&lt;/p&gt;
&lt;p&gt;hkeys(key)：返回名称为key的hash中所有键&lt;/p&gt;
&lt;p&gt;hvals(key)：返回名称为key的hash中所有键对应的value&lt;/p&gt;
&lt;p&gt;hgetall(key)：返回名称为key的hash中所有的键（field）及其对应的value&lt;/p&gt;
&lt;h3 id="持久化"&gt;&lt;a class="link" href="#8" &gt;持久化&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;save：将数据同步保存到磁盘&lt;/p&gt;
&lt;p&gt;bgsave：将数据异步保存到磁盘&lt;/p&gt;
&lt;p&gt;lastsave：返回上次成功将数据保存到磁盘的Unix时戳&lt;/p&gt;
&lt;p&gt;shundown：将数据同步保存到磁盘，然后关闭服务&lt;/p&gt;
&lt;h3 id="远程服务控制"&gt;&lt;a class="link" href="#9" &gt;远程服务控制&lt;/a&gt;
&lt;/h3&gt;&lt;p&gt;info：提供服务器的信息和统计&lt;/p&gt;
&lt;p&gt;monitor：实时转储收到的请求&lt;/p&gt;
&lt;p&gt;slaveof：改变复制策略设置&lt;/p&gt;
&lt;p&gt;config：在运行时配置Redis服务器&lt;/p&gt;</description></item></channel></rss>