Python操作Redis,你要的都在这了!
<p>Redis是一个基于内存的高效的键值型非关系型数据库,存取效率极高,而且支持多种存储数据结构,使用也非常简单。本节中,我们就来介绍一下Python的Redis操作,主要介绍RedisPy这个库的用法。</p><h2 id="1.-%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C">1. 准备工作</h2>
<p>在开始之前,请确保已经安装好了Redis及RedisPy库。如果要做数据导入/导出操作的话,还需要安装RedisDump。</p>
<h2 id="2.-Redis-%E5%92%8C-StrictRedis">2. Redis 和 StrictRedis</h2>
<p>RedisPy库提供两个类<code>Redis</code>和<code>StrictRedis</code>来实现Redis的命令操作。</p>
<p><code>StrictRedis</code>实现了绝大部分官方的命令,参数也一一对应,比如<code>set()</code>方法就对应Redis命令的<code>set</code>方法。而<code>Redis</code>是<code>StrictRedis</code>的子类,它的主要功能是用于向后兼容旧版本库里的几个方法。为了做兼容,它将方法做了改写,比如<code>lrem()</code>方法就将<code>value</code>和<code>num</code>参数的位置互换,这和Redis命令行的命令参数不一致。</p>
<p>官方推荐使用<code>StrictRedis</code>,所以本节中我们也用<code>StrictRedis类</code>的相关方法作演示。</p>
<h2 id="3.-%E8%BF%9E%E6%8E%A5Redis">3. 连接Redis</h2>
<p>现在我们已经在本地安装了Redis并运行在6379端口,密码设置为foobared。那么,可以用如下示例连接Redis并测试:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">from</span> redis <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> StrictRedis
redis </span>= StrictRedis(host=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">localhost</span><span style="color: rgba(128, 0, 0, 1)">'</span>, port=6379, db=0, password=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">foobared</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
redis.set(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Bob</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">print</span>(redis.get(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">'</span>))</pre>
</div>
<p> </p>
<p>这里我们传入了Redis的地址、运行端口、使用的数据库和密码信息。在默认不传的情况下,这4个参数分别为<code>localhost</code>、<code>6379</code>、<code>0</code>和<code>None</code>。首先声明了一个<code>StrictRedis</code>对象,接下来调用<code>set()</code>方法,设置一个键值对,然后将其获取并打印。</p>
<p>运行结果如下:</p>
<div class="cnblogs_code">
<pre>b<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Bob</span><span style="color: rgba(128, 0, 0, 1)">'</span></pre>
</div>
<p> </p>
<p>这说明我们连接成功,并可以执行<code>set()</code>和<code>get()</code>操作了。</p>
<p>当然,我们还可以使用<code>ConnectionPool</code>来连接,示例如下:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">from</span> redis <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> StrictRedis, ConnectionPool
pool </span>= ConnectionPool(host=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">localhost</span><span style="color: rgba(128, 0, 0, 1)">'</span>, port=6379, db=0, password=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">foobared</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
redis </span>= StrictRedis(connection_pool=pool)</pre>
</div>
<p> </p>
<p>这样的连接效果是一样的。观察源码可以发现,<code>StrictRedis</code>内其实就是用<code>host</code>和<code>port</code>等参数又构造了一个<code>ConnectionPool</code>,所以直接将<code>ConnectionPool</code>当作参数传给<code>StrictRedis</code>也一样。</p>
<p>另外,<code>ConnectionPool</code>还支持通过URL来构建。URL的格式支持有如下3种:</p>
<div class="cnblogs_code">
<pre>redis://[:password]@host:port/<span style="color: rgba(0, 0, 0, 1)">db
rediss:</span>//[:password]@host:port/<span style="color: rgba(0, 0, 0, 1)">db
unix:</span>//[:password]@/path/to/socket.sock?db=db</pre>
</div>
<p> </p>
<p>这3种URL分别表示创建Redis TCP连接、Redis TCP+SSL连接、Redis UNIX socket连接。我们只需要构造上面任意一种URL即可,其中<code>password</code>部分如果有则可以写,没有则可以省略。下面再用URL连接演示一下:</p>
<div class="cnblogs_code">
<pre>url = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">redis://:foobared@localhost:6379/0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
pool </span>=<span style="color: rgba(0, 0, 0, 1)"> ConnectionPool.from_url(url)
redis </span>= StrictRedis(connection_pool=pool)</pre>
</div>
<p> </p>
<p>这里我们使用第一种连接字符串进行连接。首先,声明一个Redis连接字符串,然后调用<code>from_url()</code>方法创建<code>ConnectionPool</code>,接着将其传给<code>StrictRedis</code>即可完成连接,所以使用URL的连接方式还是比较方便的。</p>
<h2 id="4.-%E9%94%AE%E6%93%8D%E4%BD%9C">4. 键操作</h2>
<p>下表总结了键的一些判断和操作方法。</p>
<div class="table-wrapper">
<table style="height: 778px; width: 1063px">
<thead>
<tr><th>
<div class="table-header">
<p>方法</p>
</div>
</th><th>
<div class="table-header">
<p>作用</p>
</div>
</th><th>
<div class="table-header">
<p>参数说明</p>
</div>
</th><th>
<div class="table-header">
<p>示例</p>
</div>
</th><th>
<div class="table-header">
<p>示例说明</p>
</div>
</th><th>
<div class="table-header">
<p>示例结果</p>
</div>
</th></tr>
</thead>
<tbody>
<tr>
<td>
<div class="table-cell">
<p>exists(name)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>判断一个键是否存在</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.exists('name')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>是否存在name这个键</p>
</div>
</td>
<td>
<div class="table-cell">
<p>True</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>delete(name)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>删除一个键</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.delete('name')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>删除name这个键</p>
</div>
</td>
<td>
<div class="table-cell">
<p>1</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>type(name)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>判断键类型</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.type('name')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>判断name这个键类型</p>
</div>
</td>
<td>
<div class="table-cell">
<p>b'string'</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>keys(pattern)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>获取所有符合规则的键</p>
</div>
</td>
<td>
<div class="table-cell">
<p>pattern:匹配规则</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.keys('n*')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>获取所有以n开头的键</p>
</div>
</td>
<td>
<div class="table-cell">
<p></p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>randomkey()</p>
</div>
</td>
<td>
<div class="table-cell">
<p>获取随机的一个键</p>
</div>
</td>
<td> </td>
<td>
<div class="table-cell">
<p>randomkey()</p>
</div>
</td>
<td>
<div class="table-cell">
<p>获取随机的一个键</p>
</div>
</td>
<td>
<div class="table-cell">
<p>b'name'</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>rename(src, dst)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>重命名键</p>
</div>
</td>
<td>
<div class="table-cell">
<p>src:原键名;dst:新键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.rename('name', 'nickname')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>将name重命名为nickname</p>
</div>
</td>
<td>
<div class="table-cell">
<p>True</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>dbsize()</p>
</div>
</td>
<td>
<div class="table-cell">
<p>获取当前数据库中键的数目</p>
</div>
</td>
<td> </td>
<td>
<div class="table-cell">
<p>dbsize()</p>
</div>
</td>
<td>
<div class="table-cell">
<p>获取当前数据库中键的数目</p>
</div>
</td>
<td>
<div class="table-cell">
<p>100</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>expire(name, time)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>设定键的过期时间,单位为秒</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;time:秒数</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.expire('name', 2)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>将name键的过期时间设置为2秒</p>
</div>
</td>
<td>
<div class="table-cell">
<p>True</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>ttl(name)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>获取键的过期时间,单位为秒,-1表示永久不过期</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.ttl('name')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>获取name这个键的过期时间</p>
</div>
</td>
<td>
<div class="table-cell">
<p>-1</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>move(name, db)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>将键移动到其他数据库</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;db:数据库代号</p>
</div>
</td>
<td>
<div class="table-cell">
<p>move('name', 2)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>将name移动到2号数据库</p>
</div>
</td>
<td>
<div class="table-cell">
<p>True</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>flushdb()</p>
</div>
</td>
<td>
<div class="table-cell">
<p>删除当前选择数据库中的所有键</p>
</div>
</td>
<td> </td>
<td>
<div class="table-cell">
<p>flushdb()</p>
</div>
</td>
<td>
<div class="table-cell">
<p>删除当前选择数据库中的所有键</p>
</div>
</td>
<td>
<div class="table-cell">
<p>True</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>flushall()</p>
</div>
</td>
<td>
<div class="table-cell">
<p>删除所有数据库中的所有键</p>
</div>
</td>
<td> </td>
<td>
<div class="table-cell">
<p>flushall()</p>
</div>
</td>
<td>
<div class="table-cell">
<p>删除所有数据库中的所有键</p>
</div>
</td>
<td>
<div class="table-cell">
<p>True</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<h4 id="5.-%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%93%8D%E4%BD%9C"><strong>5. 字符串操作</strong></h4>
<p>Redis支持最基本的键值对形式存储,用法总结如下表所示。</p>
<div class="table-wrapper">
<table style="height: 1785px; width: 1066px">
<thead>
<tr><th>
<div class="table-header">
<p>方法</p>
</div>
</th><th>
<div class="table-header">
<p>作用</p>
</div>
</th><th>
<div class="table-header">
<p>参数说明</p>
</div>
</th><th>
<div class="table-header">
<p>示例</p>
</div>
</th><th>
<div class="table-header">
<p>示例说明</p>
</div>
</th><th>
<div class="table-header">
<p>示例结果</p>
</div>
</th></tr>
</thead>
<tbody>
<tr>
<td>
<div class="table-cell">
<p>set(name, value)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>给数据库中键为name的string赋予值value</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name: 键名;value: 值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.set('name', 'Bob')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>给name这个键的value赋值为Bob</p>
</div>
</td>
<td>
<div class="table-cell">
<p>True</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>get(name)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回数据库中键为name的string的value</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.get('name')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回name这个键的value</p>
</div>
</td>
<td>
<div class="table-cell">
<p>b'Bob'</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>getset(name, value)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>给数据库中键为name的string赋予值value并返回上次的value</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;value:新值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.getset('name', 'Mike')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>赋值name为Mike并得到上次的value</p>
</div>
</td>
<td>
<div class="table-cell">
<p>b'Bob'</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>mget(keys, *args)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回多个键对应的value</p>
</div>
</td>
<td>
<div class="table-cell">
<p>keys:键的列表</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.mget(['name', 'nickname'])</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回name和nickname的value</p>
</div>
</td>
<td>
<div class="table-cell">
<p></p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>setnx(name, value)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>如果不存在这个键值对,则更新value,否则不变</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.setnx('newname', 'James')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>如果newname这个键不存在,则设置值为James</p>
</div>
</td>
<td>
<div class="table-cell">
<p>第一次运行结果是True,第二次运行结果是False</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>setex(name, time, value)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>设置可以对应的值为string类型的value,并指定此键值对应的有效期</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name: 键名;time: 有效期; value:值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.setex('name', 1, 'James')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>将name这个键的值设为James,有效期为1秒</p>
</div>
</td>
<td>
<div class="table-cell">
<p>True</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>setrange(name, offset, value)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>设置指定键的value值的子字符串</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;offset:偏移量;value:值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.set('name', 'Hello') redis.setrange('name', 6, 'World')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>设置name为Hello字符串,并在index为6的位置补World</p>
</div>
</td>
<td>
<div class="table-cell">
<p>11,修改后的字符串长度</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>mset(mapping)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>批量赋值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>mapping:字典</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.mset({'name1': 'Durant', 'name2': 'James'})</p>
</div>
</td>
<td>
<div class="table-cell">
<p>将name1设为Durant,name2设为James</p>
</div>
</td>
<td>
<div class="table-cell">
<p>True</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>msetnx(mapping)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>键均不存在时才批量赋值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>mapping:字典</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.msetnx({'name3': 'Smith', 'name4': 'Curry'})</p>
</div>
</td>
<td>
<div class="table-cell">
<p>在name3和name4均不存在的情况下才设置二者值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>True</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>incr(name, amount=1)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>键为name的value增值操作,默认为1,键不存在则被创建并设为amount</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;amount:增长的值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.incr('age', 1)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>age对应的值增1,若不存在,则会创建并设置为1</p>
</div>
</td>
<td>
<div class="table-cell">
<p>1,即修改后的值</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>decr(name, amount=1)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>键为name的value减值操作,默认为1,键不存在则被创建并将value设置为-amount</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名; amount:减少的值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.decr('age', 1)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>age对应的值减1,若不存在,则会创建并设置为-1</p>
</div>
</td>
<td>
<div class="table-cell">
<p>-1,即修改后的值</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>append(key, value)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>键为name的string的值附加value</p>
</div>
</td>
<td>
<div class="table-cell">
<p>key:键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.append('nickname', 'OK')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>向键为nickname的值后追加OK</p>
</div>
</td>
<td>
<div class="table-cell">
<p>13,即修改后的字符串长度</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>substr(name, start, end=-1)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为name的string的子串</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;start:起始索引;end:终止索引,默认为-1,表示截取到末尾</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.substr('name', 1, 4)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为name的值的字符串,截取索引为1~4的字符</p>
</div>
</td>
<td>
<div class="table-cell">
<p>b'ello'</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>getrange(key, start, end)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>获取键的value值从start到end的子字符串</p>
</div>
</td>
<td>
<div class="table-cell">
<p>key:键名;start:起始索引;end:终止索引</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.getrange('name', 1, 4)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为name的值的字符串,截取索引为1~4的字符</p>
</div>
</td>
<td>
<div class="table-cell">
<p>b'ello'</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<h2 id="6.-%E5%88%97%E8%A1%A8%E6%93%8D%E4%BD%9C">6. 列表操作</h2>
<p>Redis还提供了列表存储,列表内的元素可以重复,而且可以从两端存储,用法如下表所示。</p>
<div class="table-wrapper">
<table style="height: 826px; width: 1066px">
<thead>
<tr><th>
<div class="table-header">
<p>方法</p>
</div>
</th><th>
<div class="table-header">
<p>作用</p>
</div>
</th><th>
<div class="table-header">
<p>参数说明</p>
</div>
</th><th>
<div class="table-header">
<p>示例</p>
</div>
</th><th>
<div class="table-header">
<p>示例说明</p>
</div>
</th><th>
<div class="table-header">
<p>示例结果</p>
</div>
</th></tr>
</thead>
<tbody>
<tr>
<td>
<div class="table-cell">
<p>rpush(name, *values)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>在键为name的列表末尾添加值为value的元素,可以传多个</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;values:值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.rpush('list', 1, 2, 3)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>向键为list的列表尾添加1、2、3</p>
</div>
</td>
<td>
<div class="table-cell">
<p>3,列表大小</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>lpush(name, *values)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>在键为name的列表头添加值为value的元素,可以传多个</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;values:值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.lpush('list', 0)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>向键为list的列表头部添加0</p>
</div>
</td>
<td>
<div class="table-cell">
<p>4,列表大小</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>llen(name)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为name的列表的长度</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.llen('list')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为list的列表的长度</p>
</div>
</td>
<td>
<div class="table-cell">
<p>4</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>lrange(name, start, end)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为name的列表中start至end之间的元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;start:起始索引;end:终止索引</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.lrange('list', 1, 3)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回起始索引为1终止索引为3的索引范围对应的列表</p>
</div>
</td>
<td>
<div class="table-cell">
<p></p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>ltrim(name, start, end)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>截取键为name的列表,保留索引为start到end的内容</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;start:起始索引;end:终止索引</p>
</div>
</td>
<td>
<div class="table-cell">
<p>ltrim('list', 1, 3)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>保留键为list的索引为1到3的元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>True</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>lindex(name, index)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为name的列表中index位置的元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;index:索引</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.lindex('list', 1)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为list的列表索引为1的元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>b’2’</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>lset(name, index, value)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>给键为name的列表中index位置的元素赋值,越界则报错</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;index:索引位置;value:值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.lset('list', 1, 5)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>将键为list的列表中索引为1的位置赋值为5</p>
</div>
</td>
<td>
<div class="table-cell">
<p>True</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>lrem(name, count, value)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>删除count个键的列表中值为value的元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;count:删除个数;value:值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.lrem('list', 2, 3)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>将键为list的列表删除两个3</p>
</div>
</td>
<td>
<div class="table-cell">
<p>1,即删除的个数</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>lpop(name)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回并删除键为name的列表中的首元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.lpop('list')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回并删除名为list的列表中的第一个元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>b'5'</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>rpop(name)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回并删除键为name的列表中的尾元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.rpop('list')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回并删除名为list的列表中的最后一个元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>b'2'</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>blpop(keys, timeout=0)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回并删除名称在keys中的list中的首个元素,如果列表为空,则会一直阻塞等待</p>
</div>
</td>
<td>
<div class="table-cell">
<p>keys:键列表;timeout: 超时等待时间,0为一直等待</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.blpop('list')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回并删除键为list的列表中的第一个元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p></p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>brpop(keys, timeout=0)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回并删除键为name的列表中的尾元素,如果list为空,则会一直阻塞等待</p>
</div>
</td>
<td>
<div class="table-cell">
<p>keys:键列表;timeout:超时等待时间,0为一直等待</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.brpop('list')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回并删除名为list的列表中的最后一个元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p></p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>rpoplpush(src, dst)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回并删除名称为src的列表的尾元素,并将该元素添加到名称为dst的列表头部</p>
</div>
</td>
<td>
<div class="table-cell">
<p>src:源列表的键;dst:目标列表的key</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.rpoplpush('list', 'list2')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>将键为list的列表尾元素删除并将其添加到键为list2的列表头部,然后返回</p>
</div>
</td>
<td>
<div class="table-cell">
<p>b'2'</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<h2 id="7.-%E9%9B%86%E5%90%88%E6%93%8D%E4%BD%9C">7. 集合操作</h2>
<p>Redis还提供了集合存储,集合中的元素都是不重复的,用法如下表所示。</p>
<div class="table-wrapper">
<table style="height: 894px; width: 1075px">
<thead>
<tr><th>
<div class="table-header">
<p>方法</p>
</div>
</th><th>
<div class="table-header">
<p>作用</p>
</div>
</th><th>
<div class="table-header">
<p>参数说明</p>
</div>
</th><th>
<div class="table-header">
<p>示例</p>
</div>
</th><th>
<div class="table-header">
<p>示例说明</p>
</div>
</th><th>
<div class="table-header">
<p>示例结果</p>
</div>
</th></tr>
</thead>
<tbody>
<tr>
<td>
<div class="table-cell">
<p>sadd(name, *values)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>向键为name的集合中添加元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;values:值,可为多个</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.sadd('tags', 'Book', 'Tea', 'Coffee')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>向键为tags的集合中添加Book、Tea和Coffee这3个内容</p>
</div>
</td>
<td>
<div class="table-cell">
<p>3,即插入的数据个数</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>srem(name, *values)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>从键为name的集合中删除元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;values:值,可为多个</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.srem('tags', 'Book')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>从键为tags的集合中删除Book</p>
</div>
</td>
<td>
<div class="table-cell">
<p>1,即删除的数据个数</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>spop(name)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>随机返回并删除键为name的集合中的一个元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.spop('tags')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>从键为tags的集合中随机删除并返回该元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>b'Tea'</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>smove(src, dst, value)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>从src对应的集合中移除元素并将其添加到dst对应的集合中</p>
</div>
</td>
<td>
<div class="table-cell">
<p>src:源集合;dst:目标集合;value:元素值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.smove('tags', 'tags2', 'Coffee')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>从键为tags的集合中删除元素Coffee并将其添加到键为tags2的集合</p>
</div>
</td>
<td>
<div class="table-cell">
<p>True</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>scard(name)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为name的集合的元素个数</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.scard('tags')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>获取键为tags的集合中的元素个数</p>
</div>
</td>
<td>
<div class="table-cell">
<p>3</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>sismember(name, value)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>测试member是否是键为name的集合的元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.sismember('tags', 'Book')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>判断Book是否是键为tags的集合元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>True</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>sinter(keys, *args)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回所有给定键的集合的交集</p>
</div>
</td>
<td>
<div class="table-cell">
<p>keys:键列表</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.sinter(['tags', 'tags2'])</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为tags的集合和键为tags2的集合的交集</p>
</div>
</td>
<td>
<div class="table-cell">
<p>{b'Coffee'}</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>sinterstore(dest, keys, *args)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>求交集并将交集保存到dest的集合</p>
</div>
</td>
<td>
<div class="table-cell">
<p>dest:结果集合;keys:键列表</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.sinterstore('inttag', ['tags', 'tags2'])</p>
</div>
</td>
<td>
<div class="table-cell">
<p>求键为tags的集合和键为tags2的集合的交集并将其保存为inttag</p>
</div>
</td>
<td>
<div class="table-cell">
<p>1</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>sunion(keys, *args)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回所有给定键的集合的并集</p>
</div>
</td>
<td>
<div class="table-cell">
<p>keys:键列表</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.sunion(['tags', 'tags2'])</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为tags的集合和键为tags2的集合的并集</p>
</div>
</td>
<td>
<div class="table-cell">
<p>{b'Coffee', b'Book', b'Pen'}</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>sunionstore(dest, keys, *args)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>求并集并将并集保存到dest的集合</p>
</div>
</td>
<td>
<div class="table-cell">
<p>dest:结果集合;keys:键列表</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.sunionstore('inttag', ['tags', 'tags2'])</p>
</div>
</td>
<td>
<div class="table-cell">
<p>求键为tags的集合和键为tags2的集合的并集并将其保存为inttag</p>
</div>
</td>
<td>
<div class="table-cell">
<p>3</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>sdiff(keys, *args)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回所有给定键的集合的差集</p>
</div>
</td>
<td>
<div class="table-cell">
<p>keys:键列表</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.sdiff(['tags', 'tags2'])</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为tags的集合和键为tags2的集合的差集</p>
</div>
</td>
<td>
<div class="table-cell">
<p>{b'Book', b'Pen'}</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>sdiffstore(dest, keys, *args)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>求差集并将差集保存到dest集合</p>
</div>
</td>
<td>
<div class="table-cell">
<p>dest:结果集合;keys:键列表</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.sdiffstore('inttag', ['tags', 'tags2'])</p>
</div>
</td>
<td>
<div class="table-cell">
<p>求键为tags的集合和键为tags2的集合的差集并将其保存为inttag`</p>
</div>
</td>
<td>
<div class="table-cell">
<p>3</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>smembers(name)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为name的集合的所有元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.smembers('tags')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为tags的集合的所有元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>{b'Pen', b'Book', b'Coffee'}</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>srandmember(name)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>随机返回键为name的集合中的一个元素,但不删除元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.srandmember('tags')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>随机返回键为tags的集合中的一个元素</p>
</div>
</td>
<td> </td>
</tr>
</tbody>
</table>
</div>
<h2 id="8.-%E6%9C%89%E5%BA%8F%E9%9B%86%E5%90%88%E6%93%8D%E4%BD%9C">8. 有序集合操作</h2>
<p>有序集合比集合多了一个分数字段,利用它可以对集合中的数据进行排序,其用法总结如下表所示。</p>
<div class="table-wrapper">
<table style="height: 986px; width: 1086px">
<thead>
<tr><th>
<div class="table-header">
<p>方法</p>
</div>
</th><th>
<div class="table-header">
<p>作用</p>
</div>
</th><th>
<div class="table-header">
<p>参数说明</p>
</div>
</th><th>
<div class="table-header">
<p>示例</p>
</div>
</th><th>
<div class="table-header">
<p>示例说明</p>
</div>
</th><th>
<div class="table-header">
<p>示例结果</p>
</div>
</th></tr>
</thead>
<tbody>
<tr>
<td>
<div class="table-cell">
<p>zadd(name, *args, **kwargs)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>向键为name的zset中添加元素member,score用于排序。如果该元素存在,则更新其顺序</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name: 键名;args:可变参数</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.zadd('grade', 100, 'Bob', 98, 'Mike')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>向键为grade的zset中添加Bob(其score为100),并添加Mike(其score为98)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>2,即添加的元素个数</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>zrem(name, *values)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>删除键为name的zset中的元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;values:元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.zrem('grade', 'Mike')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>从键为grade的zset中删除Mike</p>
</div>
</td>
<td>
<div class="table-cell">
<p>1,即删除的元素个数</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>zincrby(name, value, amount=1)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>如果在键为name的zset中已经存在元素value,则将该元素的score增加amount;否则向该集合中添加该元素,其score的值为amount</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:key名;value:元素;amount:增长的score值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.zincrby('grade', 'Bob', -2)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>键为grade的zset中Bob的score减2</p>
</div>
</td>
<td>
<div class="table-cell">
<p>98.0,即修改后的值</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>zrank(name, value)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为name的zset中元素的排名,按score从小到大排序,即名次</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;value:元素值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.zrank('grade', 'Amy')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>得到键为grade的zset中Amy的排名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>1</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>zrevrank(name, value)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为name的zset中元素的倒数排名(按score从大到小排序),即名次</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;value:元素值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.zrevrank('grade', 'Amy')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>得到键为grade的zset中Amy的倒数排名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>2</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>zrevrange(name, start, end, withscores=False)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为name的zset(按score从大到小排序)中index从start到end的所有元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键值;start:开始索引;end:结束索引;withscores:是否带score</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.zrevrange('grade', 0, 3)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为grade的zset中前四名元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p></p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>zrangebyscore(name, min, max, start=None, num=None, withscores=False)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为name的zset中score在给定区间的元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;min:最低score;max:最高score; start:起始索引;num:个数;withscores:是否带score</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.zrangebyscore('grade', 80, 95)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为grade的zset中score在80和95之间的元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p></p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>zcount(name, min, max)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为name的zset中score在给定区间的数量</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;min:最低score;max:最高score</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.zcount('grade', 80, 95)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为grade的zset中score在80到95的元素个数</p>
</div>
</td>
<td>
<div class="table-cell">
<p>2</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>zcard(name)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为name的zset的元素个数</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.zcard('grade')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>获取键为grade的zset中元素的个数</p>
</div>
</td>
<td>
<div class="table-cell">
<p>3</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>zremrangebyrank(name, min, max)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>删除键为name的zset中排名在给定区间的元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;min:最低位次;max:最高位次</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.zremrangebyrank('grade', 0, 0)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>删除键为grade的zset中排名第一的元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>1,即删除的元素个数</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>zremrangebyscore(name, min, max)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>删除键为name的zset中score在给定区间的元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;min:最低score;max:最高score</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.zremrangebyscore('grade', 80, 90)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>删除score在80到90之间的元素</p>
</div>
</td>
<td>
<div class="table-cell">
<p>1,即删除的元素个数</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<h2 id="9.-%E6%95%A3%E5%88%97%E6%93%8D%E4%BD%9C">9. 散列操作</h2>
<p>Redis还提供了散列表的数据结构,我们可以用<code>name</code>指定一个散列表的名称,表内存储了各个键值对,用法总结如下表所示。</p>
<div class="table-wrapper">
<table style="height: 781px; width: 1088px">
<thead>
<tr><th>
<div class="table-header">
<p>方法</p>
</div>
</th><th>
<div class="table-header">
<p>作用</p>
</div>
</th><th>
<div class="table-header">
<p>参数说明</p>
</div>
</th><th>
<div class="table-header">
<p>示例</p>
</div>
</th><th>
<div class="table-header">
<p>示例说明</p>
</div>
</th><th>
<div class="table-header">
<p>示例结果</p>
</div>
</th></tr>
</thead>
<tbody>
<tr>
<td>
<div class="table-cell">
<p>hset(name, key, value)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>向键为name的散列表中添加映射</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;key:映射键名;value:映射键值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>hset('price', 'cake', 5)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>向键为price的散列表中添加映射关系,cake的值为5</p>
</div>
</td>
<td>
<div class="table-cell">
<p>1,即添加的映射个数</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>hsetnx(name, key, value)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>如果映射键名不存在,则向键为name的散列表中添加映射</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;key:映射键名;value:映射键值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>hsetnx('price', 'book', 6)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>向键为price的散列表中添加映射关系,book的值为6</p>
</div>
</td>
<td>
<div class="table-cell">
<p>1,即添加的映射个数</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>hget(name, key)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为name的散列表中key对应的值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;key:映射键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.hget('price', 'cake')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>获取键为price的散列表中键名为cake的值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>5</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>hmget(name, keys, *args)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>返回键为name的散列表中各个键对应的值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;keys:映射键名列表</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.hmget('price', ['apple', 'orange'])</p>
</div>
</td>
<td>
<div class="table-cell">
<p>获取键为price的散列表中apple和orange的值</p>
</div>
</td>
<td>
<div class="table-cell">
<p></p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>hmset(name, mapping)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>向键为name的散列表中批量添加映射</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;mapping:映射字典</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.hmset('price', {'banana': 2, 'pear': 6})</p>
</div>
</td>
<td>
<div class="table-cell">
<p>向键为price的散列表中批量添加映射</p>
</div>
</td>
<td>
<div class="table-cell">
<p>True</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>hincrby(name, key, amount=1)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>将键为name的散列表中映射的值增加amount</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;key:映射键名;amount:增长量</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.hincrby('price', 'apple', 3)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>key为price的散列表中apple的值增加3</p>
</div>
</td>
<td>
<div class="table-cell">
<p>6,修改后的值</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>hexists(name, key)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>键为name的散列表中是否存在键名为键的映射</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;key:映射键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.hexists('price', 'banana')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>键为price的散列表中banana的值是否存在</p>
</div>
</td>
<td>
<div class="table-cell">
<p>True</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>hdel(name, *keys)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>在键为name的散列表中,删除键名为键的映射</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名;keys:映射键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.hdel('price', 'banana')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>从键为price的散列表中删除键名为banana的映射</p>
</div>
</td>
<td>
<div class="table-cell">
<p>True</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>hlen(name)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>从键为name的散列表中获取映射个数</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name: 键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.hlen('price')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>从键为price的散列表中获取映射个数</p>
</div>
</td>
<td>
<div class="table-cell">
<p>6</p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>hkeys(name)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>从键为name的散列表中获取所有映射键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.hkeys('price')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>从键为price的散列表中获取所有映射键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p></p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>hvals(name)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>从键为name的散列表中获取所有映射键值</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.hvals('price')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>从键为price的散列表中获取所有映射键值</p>
</div>
</td>
<td>
<div class="table-cell">
<p></p>
</div>
</td>
</tr>
<tr>
<td>
<div class="table-cell">
<p>hgetall(name)</p>
</div>
</td>
<td>
<div class="table-cell">
<p>从键为name的散列表中获取所有映射键值对</p>
</div>
</td>
<td>
<div class="table-cell">
<p>name:键名</p>
</div>
</td>
<td>
<div class="table-cell">
<p>redis.hgetall('price')</p>
</div>
</td>
<td>
<div class="table-cell">
<p>从键为price的散列表中获取所有映射键值对</p>
</div>
</td>
<td>
<div class="table-cell">
<p>{b'cake': b'5', b'book': b'6', b'orange': b'7', b'pear': b'6'}</p>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<h2 id="10.-RedisDump">10. RedisDump</h2>
<p>RedisDump提供了强大的Redis数据的导入和导出功能,现在就来看下它的具体用法。</p>
<p>首先,确保已经安装好了RedisDump。</p>
<p>RedisDump提供了两个可执行命令:<code>redis-dump</code>用于导出数据,<code>redis-load</code>用于导入数据。</p>
<h2 id="redis-dump">redis-dump</h2>
<p>首先,可以输入如下命令查看所有可选项:</p>
<div class="cnblogs_code">
<pre>redis-dump -h</pre>
</div>
<p> </p>
<p>运行结果如下:</p>
<div class="cnblogs_code">
<pre>Usage: redis-dump [<span style="color: rgba(0, 0, 255, 1)">global</span><span style="color: rgba(0, 0, 0, 1)"> options] COMMAND
</span>-u, --uri=S Redis URI (e.g. redis://<span style="color: rgba(0, 0, 0, 1)">hostname[:port])
</span>-d, --database=S Redis database (e.g. -d 15<span style="color: rgba(0, 0, 0, 1)">)
</span>-s, --sleep=S Sleep <span style="color: rgba(0, 0, 255, 1)">for</span> S seconds after dumping (<span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> debugging)
</span>-c, --count=S Chunk size (default: 10000<span style="color: rgba(0, 0, 0, 1)">)
</span>-f, --filter=S Filter selected keys (passed directly to redis<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)"> KEYS command)</span>
-O, --<span style="color: rgba(0, 0, 0, 1)">without_optimizations Disable run time optimizations
</span>-V, --<span style="color: rgba(0, 0, 0, 1)">version Display version
</span>-D, --<span style="color: rgba(0, 0, 0, 1)">debug
</span>--nosafe</pre>
</div>
<p> </p>
<p>其中<code>-u</code>代表Redis连接字符串,<code>-d</code>代表数据库代号,<code>-s</code>代表导出之后的休眠时间,<code>-c</code>代表分块大小,默认是10000,<code>-f</code>代表导出时的过滤器,<code>-O</code>代表禁用运行时优化,<code>-V</code>用于显示版本,<code>-D</code>表示开启调试。</p>
<p>我们拿本地的Redis做测试,运行在6379端口上,密码为foobared,导出命令如下:</p>
<div class="cnblogs_code">
<pre>redis-dump -u :foobared@localhost:6379</pre>
</div>
<p> </p>
<p>如果没有密码的话,可以不加密码前缀,命令如下:</p>
<div class="cnblogs_code">
<pre>redis-dump -u localhost:6379</pre>
</div>
<p> </p>
<p>运行之后,可以将本地0至15号数据库的所有数据输出出来,例如:</p>
<div class="cnblogs_code">
<pre>{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">db</span><span style="color: rgba(128, 0, 0, 1)">"</span>:0,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">key</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ttl</span><span style="color: rgba(128, 0, 0, 1)">"</span>:-1,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">string</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">value</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">James</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">size</span><span style="color: rgba(128, 0, 0, 1)">"</span>:5<span style="color: rgba(0, 0, 0, 1)">}
{</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">db</span><span style="color: rgba(128, 0, 0, 1)">"</span>:0,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">key</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name2</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ttl</span><span style="color: rgba(128, 0, 0, 1)">"</span>:-1,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">string</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">value</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Durant</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">size</span><span style="color: rgba(128, 0, 0, 1)">"</span>:6<span style="color: rgba(0, 0, 0, 1)">}
{</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">db</span><span style="color: rgba(128, 0, 0, 1)">"</span>:0,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">key</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name3</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ttl</span><span style="color: rgba(128, 0, 0, 1)">"</span>:-1,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">string</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">value</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Durant</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">size</span><span style="color: rgba(128, 0, 0, 1)">"</span>:6<span style="color: rgba(0, 0, 0, 1)">}
{</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">db</span><span style="color: rgba(128, 0, 0, 1)">"</span>:0,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">key</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name4</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ttl</span><span style="color: rgba(128, 0, 0, 1)">"</span>:-1,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">string</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">value</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">HelloWorld</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">size</span><span style="color: rgba(128, 0, 0, 1)">"</span>:10<span style="color: rgba(0, 0, 0, 1)">}
{</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">db</span><span style="color: rgba(128, 0, 0, 1)">"</span>:0,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">key</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name5</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ttl</span><span style="color: rgba(128, 0, 0, 1)">"</span>:-1,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">string</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">value</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">James</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">size</span><span style="color: rgba(128, 0, 0, 1)">"</span>:5<span style="color: rgba(0, 0, 0, 1)">}
{</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">db</span><span style="color: rgba(128, 0, 0, 1)">"</span>:0,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">key</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name6</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ttl</span><span style="color: rgba(128, 0, 0, 1)">"</span>:-1,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">string</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">value</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">James</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">size</span><span style="color: rgba(128, 0, 0, 1)">"</span>:5<span style="color: rgba(0, 0, 0, 1)">}
{</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">db</span><span style="color: rgba(128, 0, 0, 1)">"</span>:0,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">key</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">age</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ttl</span><span style="color: rgba(128, 0, 0, 1)">"</span>:-1,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">string</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">value</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">size</span><span style="color: rgba(128, 0, 0, 1)">"</span>:1<span style="color: rgba(0, 0, 0, 1)">}
{</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">db</span><span style="color: rgba(128, 0, 0, 1)">"</span>:0,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">key</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">age2</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ttl</span><span style="color: rgba(128, 0, 0, 1)">"</span>:-1,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">string</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">value</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-5</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">size</span><span style="color: rgba(128, 0, 0, 1)">"</span>:2}</pre>
</div>
<p> </p>
<p>每条数据都包含6个字段,其中<code>db</code>即数据库代号,<code>key</code>即键名,<code>ttl</code>即该键值对的有效时间,<code>type</code>即键值类型,<code>value</code>即内容,<code>size</code>即占用空间。</p>
<p>如果想要将其输出为JSON行文件,可以使用如下命令:</p>
<div class="cnblogs_code">
<pre>redis-dump -u :foobared@localhost:6379 > ./redis_data.jl</pre>
</div>
<p> </p>
<p>这样就可以成功将Redis的所有数据库的所有数据导出成JSON行文件了。</p>
<p>另外,可以使用<code>-d</code>参数指定某个数据库的导出,例如只导出1号数据库的内容:</p>
<div class="cnblogs_code">
<pre>redis-dump -u :foobared@localhost:6379 -d 1 > ./redis.data.jl</pre>
</div>
<p> </p>
<p>如果只想导出特定的内容,比如想导出以<code>adsl</code>开头的数据,可以加入<code>-f</code>参数用来过滤,命令如下:</p>
<div class="cnblogs_code">
<pre>redis-dump -u :foobared@localhost:6379 -f adsl:* > ./redis.data.jl</pre>
</div>
<p> </p>
<p>其中<code>-f</code>参数即Redis的<code>keys</code>命令的参数,可以写一些过滤规则。</p>
<h2 id="redis-load">redis-load</h2>
<p>同样,我们可以首先输入如下命令查看所有可选项:</p>
<div class="cnblogs_code">
<pre>redis-load -h</pre>
</div>
<p> </p>
<p>运行结果如下:</p>
<div class="cnblogs_code">
<pre>redis-load --<span style="color: rgba(0, 0, 0, 1)">help
Try: redis</span>-load [<span style="color: rgba(0, 0, 255, 1)">global</span><span style="color: rgba(0, 0, 0, 1)"> options] COMMAND
</span>-u, --uri=S Redis URI (e.g. redis://<span style="color: rgba(0, 0, 0, 1)">hostname[:port])
</span>-d, --database=S Redis database (e.g. -d 15<span style="color: rgba(0, 0, 0, 1)">)
</span>-s, --sleep=S Sleep <span style="color: rgba(0, 0, 255, 1)">for</span> S seconds after dumping (<span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> debugging)
</span>-n, --<span style="color: rgba(0, 0, 0, 1)">no_check_utf8
</span>-V, --<span style="color: rgba(0, 0, 0, 1)">version Display version
</span>-D, --<span style="color: rgba(0, 0, 0, 1)">debug
</span>--nosafe</pre>
</div>
<p> </p>
<p>其中<code>-u</code>代表Redis连接字符串,<code>-d</code>代表数据库代号,默认是全部,<code>-s</code>代表导出之后的休眠时间,<code>-n</code>代表不检测UTF-8编码,<code>-V</code>表示显示版本,<code>-D</code>表示开启调试。</p>
<p>我们可以将JSON行文件导入到Redis数据库中:</p>
<div class="cnblogs_code">
<pre>< redis_data.json redis-load -u :foobared@localhost:6379</pre>
</div>
<p> </p>
<p>这样就可以成功将JSON行文件导入到数据库中了。</p>
<p>另外,下面的命令同样可以达到同样的效果:</p>
<div class="cnblogs_code">
<pre>cat redis_data.json | redis-load -u :foobared@localhost:6379</pre>
</div>
<p> </p>
<p>本节中,我们不仅了解了RedisPy对Redis数据库的一些基本操作,还演示了RedisDump对数据的导入导出操作。</p><br><br>
来源:https://www.cnblogs.com/john-xiong/p/12089103.html
頁:
[1]