<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Redis归档 - 枫阿雨&#039;s blog</title>
	<atom:link href="https://www.crazyfay.com/tag/redis/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.crazyfay.com/tag/redis/</link>
	<description>CrazyFay</description>
	<lastBuildDate>Tue, 04 Apr 2023 07:03:10 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.2</generator>

<image>
	<url>https://www.crazyfay.com/wp-content/uploads/2023/04/cropped-DockerGopher-32x32.png</url>
	<title>Redis归档 - 枫阿雨&#039;s blog</title>
	<link>https://www.crazyfay.com/tag/redis/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Redis学习笔记(一)&#8211;基础命令</title>
		<link>https://www.crazyfay.com/2021/12/11/redis%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%b8%80-%e5%9f%ba%e7%a1%80%e5%91%bd%e4%bb%a4/</link>
					<comments>https://www.crazyfay.com/2021/12/11/redis%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%b8%80-%e5%9f%ba%e7%a1%80%e5%91%bd%e4%bb%a4/#respond</comments>
		
		<dc:creator><![CDATA[crazyfay]]></dc:creator>
		<pubDate>Sat, 11 Dec 2021 03:32:28 +0000</pubDate>
				<category><![CDATA[学习笔记]]></category>
		<category><![CDATA[Redis]]></category>
		<guid isPermaLink="false">http://net.crazyfay.xyz/?p=174</guid>

					<description><![CDATA[<p>Redis 基础 第一节 基本命令 通用命令 select 示例： select 0 # 选择0号数据库 ke [&#8230;]</p>
<p><a rel="nofollow" href="https://www.crazyfay.com/2021/12/11/redis%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%b8%80-%e5%9f%ba%e7%a1%80%e5%91%bd%e4%bb%a4/">Redis学习笔记(一)&#8211;基础命令</a>最先出现在<a rel="nofollow" href="https://www.crazyfay.com">枫阿雨&#039;s blog</a>。</p>
]]></description>
										<content:encoded><![CDATA[<h1>Redis 基础</h1>
<h2>第一节 基本命令</h2>
<h3>通用命令</h3>
<ul>
<li>
<p><font color=red><strong>select</strong></font></p>
<p>示例：</p>
<pre><code class="language-shell">select 0
# 选择0号数据库</code></pre>
</li>
<li>
<p><font color=red><strong>keys</strong></font></p>
<p>示例：</p>
<pre><code class="language-shell">keys he*
keys he[h-l]*
keys ph?
# 根据Pattern表达式查询符合条件的Key
# 注意：不要在生产环境中使用，会阻塞线程</code></pre>
</li>
<li>
<p><font color=red><strong>dbsize</strong></font></p>
<p>示例：</p>
<pre><code class="language-shell">dbsize
# 返回key的总数</code></pre>
</li>
<li>
<p><font color=red><strong>exists</strong></font></p>
<p>示例：</p>
<pre><code class="language-shell">exists a
# 查询key=a是否存在</code></pre>
</li>
<li>
<p><font color=red><strong>del</strong></font></p>
<p>示例：</p>
<pre><code class="language-shell">del a
# 删除key=a的数据</code></pre>
</li>
<li>
<p><font color=red><strong>expire</strong></font></p>
<p>示例：</p>
<pre><code class="language-shell">expire hello 20
# 设置key=hello 在20s后过期</code></pre>
</li>
<li>
<p><font color=red><strong>ttl</strong></font></p>
<p>示例：</p>
<pre><code class="language-shell">ttl hello
# 查看key=a的过期剩余时间</code></pre>
</li>
<li>
<p><font color=red><strong>flashdb</strong></font></p>
<p>示例：</p>
<pre><code class="language-shell">flashdb
# 清空当前数据库中的所有数据</code></pre>
</li>
<li>
<p><font color=red><strong>flashall</strong></font></p>
<p>示例：</p>
<pre><code class="language-shell">flashall
# 删除所有数据库中的所有数据</code></pre>
</li>
</ul>
<h2>第二节 Redis 常用的五种数据结构</h2>
<h3>Redis 数据类型 - 字符串</h3>
<p>value可以是字符串，可以是数字，可以是位数字</p>
<p>String最大512MB，建议单个KV不超过100KB</p>
<h4>字符串结构应用类型</h4>
<ol>
<li>缓存</li>
<li>秒杀</li>
<li>分布式锁</li>
<li>配置中心</li>
<li>对象序列化</li>
<li>计数器</li>
</ol>
<h4>Redis 字符串指令</h4>
<ul>
<li>
<p><font color=red><strong>get</strong></font></p>
<p>示例：</p>
<pre><code class="language-shell">get hello
# 获得key=hello的结果</code></pre>
</li>
<li>
<p><font color=red><strong>set</strong></font></p>
<p>示例：</p>
<pre><code class="language-shell">set hello world
# 设置key=hello , value=world</code></pre>
</li>
<li>
<p><font color=red><strong>mset /  mget</strong></font></p>
<p>示例：</p>
<pre><code class="language-shell">mset hello world java best
mget hello java
# 一次性 设置 或者 获取 多个kv</code></pre>
</li>
<li>
<p><font color=red><strong>getset</strong></font></p>
<p>示例：</p>
<pre><code class="language-shell">setget db mongodb
# 设置新值返回旧值，若没有旧值则返回null并赋予新值</code></pre>
</li>
<li>
<p><font color=red><strong>setnx</strong></font></p>
<pre><code class="language-shell">setnx job programmer
setnx job farmer # 执行失败
# 指定key不存在时设置，若存在则不设置</code></pre>
</li>
<li>
<p><font color=red><strong>del</strong></font></p>
<p>示例：</p>
<pre><code class="language-shell">del hello
# 删除key=hello的数据</code></pre>
</li>
<li>
<p><font color=red><strong>incr / decr</strong></font></p>
<p>示例：</p>
<pre><code class="language-shell">incr count
decr count
# key值 自增 / 自减 1</code></pre>
</li>
<li>
<p><font color=red><strong>incrby / decrby</strong></font></p>
<p>示例：</p>
<pre><code class="language-shell">incrby count 99
decrby count 99
# key值 自增 / 自减 指定步长</code></pre>
</li>
</ul>
<h3>Redis 数据类型 - hash</h3>
<p>Redis hash 是一个 string 类型的 field (字段) 和 value (值) 的映射表，hash 特别适合用于存储对象。Redis 中<strong>每个 hash</strong> 可以存储 2^32^ -1 个键值对（40多亿）。可以理解为每个key存储了一个HashMap对象，通过一个Key可以保存一个数据结构。</p>
<h4>hash应用场景</h4>
<p>Hash用于存储结构化数据，比如员工i谢谢你，用户信息等等</p>
<h4>Redis Hash 命令</h4>
<ul>
<li>
<p><font color=red><strong>hset</strong></font></p>
<p>示例：</p>
<pre><code class="language-shell">hset myhash field "foo"
# 设置单个hash字值段</code></pre>
</li>
<li>
<p><font color=red><strong>hmset</strong></font></p>
<pre><code class="language-shell">hmset myhash field1 "hello" field2 "world"
# 设置多个hash字值段</code></pre>
</li>
<li>
<p><font color=red><strong>hget</strong></font></p>
<pre><code class="language-shell">hget myhash field1
# 提取一个redis的key的某个哈希值</code></pre>
</li>
<li>
<p><font color=red><strong>hgetall</strong></font></p>
<pre><code class="language-shell">hgetall myhash
# 提取一个redis的key的所有哈希值，以键/n值/n的形式返回</code></pre>
</li>
<li>
<p><font color=red><strong>hexists</strong></font></p>
<pre><code class="language-shell">hexists myhash field</code></pre>
</li>
<li>
<p><font color=red><strong>hdel</strong></font></p>
<pre><code class="language-shell">hdel myhash field1 filed2
# 删除n条记录</code></pre>
</li>
<li>
<p><font color=red><strong>hval</strong></font></p>
<pre><code class="language-shell">hval myhash
# 返回hash的value的列表，key不存在返回空表</code></pre>
</li>
</ul>
<h3>Redis 数据类型 - List</h3>
<p>List列表是简单的字符串列表，按照插入顺序排序。可以添加元素到列表的头部（左边）或者尾部（右边）</p>
<p>一个列表最多可以包含 2^32^-1个元素</p>
<h4>List 应用场景</h4>
<p>保存有需数据队列，例如：排行榜ID队列 / XX购物车商品ID队列 / XX班级ID队列</p>
<p>获取到ID队列后，再根据每一个ID获取对应的HASH对象</p>
<h4>Redis List 命令</h4>
<ul>
<li>
<p><font color=red><strong>rpush</strong></font></p>
<pre><code class="language-shell">rpush listkey c b a
# 在队尾插入新数据</code></pre>
</li>
<li>
<p><font color=red><strong>lpush</strong></font></p>
<pre><code class="language-shell">lpush listkey f e d
# 在队首插入新数据</code></pre>
</li>
<li>
<p><font color=red><strong>lrange</strong></font></p>
<pre><code class="language-shell">lrange listkey 0 -1
# d e f c b a
# 获取所有
lrange listkey 0 2
# d e f
# 获取队列数据</code></pre>
</li>
<li>
<p><font color=red><strong>rpop</strong></font></p>
<pre><code class="language-shell">rpop listkey
# a
# 从右侧弹出数据</code></pre>
</li>
<li>
<p><font color=red><strong>lpop</strong></font></p>
<pre><code class="language-shell">lpop listkey
# d
# 从左侧弹出数据</code></pre>
</li>
</ul>
<h3>Redis 数据类型 - Set</h3>
<p>Redis 的 Set 是 String 类型的<strong>无序</strong>集合。集合成员是唯一的，即不会存在重复的数据</p>
<p>Redis 中 Set 集合是通过 哈希表 实现的，故添加、删除。查找的复杂度都是O(1)，对Set操作的执行效率极高</p>
<p>集合中的最大成员数为 2^32^-1 个元素</p>
<h4>Redis Set 应用场景</h4>
<p>Set数据类型常用于交际 / 并集 / 差集 运算</p>
<p>典型场景为：</p>
<ul>
<li>我与XX位好友共同关注了XXX</li>
<li>将两个数据源的数据清单进行合并</li>
<li>找出X与Y集合的差异</li>
<li>抽奖活动</li>
</ul>
<h4>Redis Set 命令</h4>
<ul>
<li>
<p><font color=red><strong>sadd</strong></font></p>
<pre><code class="language-shell">sadd user:1:follow fay
sadd user:1:follow kirov faye harry
# 新增set数据</code></pre>
</li>
<li>
<p><font color=red><strong>smembers</strong></font></p>
<pre><code class="language-shell">smembers user:1:follow 
# fay harry faye kirov (不保证顺序)
# 查看set数据</code></pre>
</li>
<li>
<p><font color=red><strong>srandmember</strong></font></p>
<pre><code class="language-shell">srandmember user:1:follow 2
# fay kirov (不保证顺序,不改变原集合中的顺序)</code></pre>
</li>
<li>
<p><font color=red><strong>spop</strong></font></p>
<pre><code class="language-shell">spop user:1:follow
# fay (随机且改变原集合)
# 随机弹出一个元素</code></pre>
</li>
<li>
<p><font color=red><strong>sdiff</strong></font></p>
<pre><code class="language-shell">sdiff user:2:follow user:1:follow
# sports ent news
# sdiff计算的是以左侧Set为基准，查找在右侧Set不存在的条目</code></pre>
</li>
<li>
<p><font color=red><strong>sinter</strong></font></p>
<pre><code class="language-shell">sinter user:1:follow user:2:follow
# 计算交集</code></pre>
</li>
<li>
<p><font color=red><strong>sunion</strong></font></p>
<pre><code class="language-shell">sunion user:1:follow user:2:follow
# 计算并集</code></pre>
</li>
</ul>
<h3>Redis 数据类型 - ZSet</h3>
<p>Redis 的 ZSet 是 String 类型的<strong>有序</strong>Set集合。集合成员是唯一的，即不会存在重复的数据</p>
<p>ZSet 和 List 的区别</p>
<p>List 强调数据是按存储顺序有序排列，存储顺序与迭代顺序是一致的</p>
<p>ZSet 则是给出分数进行排序，存储顺序与迭代顺序是不一致的</p>
<h4>Redis ZSet 应用场景</h4>
<p>各种多维度排行榜</p>
<h4>Redis ZSet 命令</h4>
<ul>
<li>
<p><font color=red><strong>zadd</strong></font></p>
<pre><code class="language-shell">zadd player:ranke 1000 fay 900 kirov 800 pinkman 600 grovy
# 新增数据</code></pre>
</li>
<li>
<p><font color=red><strong>zrange</strong></font></p>
<pre><code class="language-shell">zrange player:rank 0 -1
# grovy pinkman kirov fay
zrange player:rank 0 -1 with scores
# grovy 600 pinkman 800 kirov 900 fay 1000 (将分值一并写出)
# 根据分值从小到大进行排列</code></pre>
</li>
<li>
<p><font color=red><strong>zscore</strong></font></p>
<pre><code class="language-shell">zscore play:rank fay
# 获取分数</code></pre>
</li>
<li>
<p><font color=red><strong>zrank</strong></font></p>
<pre><code class="language-shell">zrank play:rank fay
# 获取排名</code></pre>
</li>
<li>
<p><font color=red><strong>zrevrank</strong></font></p>
<pre><code class="language-shell">zrank play:rank fay
# 反向排名</code></pre>
</li>
<li>
<p><font color=red><strong>zrevrange</strong></font></p>
<pre><code class="language-shell">zrevrange player:rank 0 -1
zrevrange player:rank 0 -1 with scores
# 反向排序</code></pre>
</li>
<li>
<p><font color=red><strong>zrem</strong></font></p>
<pre><code class="language-shell">zrem play:rank grovy
# 移除指定元素</code></pre>
</li>
<li>
<p><font color=red><strong>zcount</strong></font></p>
<pre><code class="language-shell">zcount player:rank 700 1000
# 3
# 获取符合分数要求数据量</code></pre>
</li>
<li>
<p><font color=red><strong>zrangebyscore</strong></font></p>
<pre><code class="language-shell">zrangebyscore player:rank 700 1000 wiht scores
# pinkman 800 kirov 900 fay 1000</code></pre>
</li>
</ul>
<h2>第三节 Redis 开发规约</h2>
<h3>Key 的设计</h3>
<p><img decoding="async" src="https://img-1307890592.cos.ap-chengdu.myqcloud.com/image-20220413002604596.png" alt="image-20220413002604596" /></p>
<h3>不同类型的应用场景</h3>
<p><img decoding="async" src="https://img-1307890592.cos.ap-chengdu.myqcloud.com/image-20220413002627850.png" alt="image-20220413002627850" /></p>
<h3>Redis 的安全建议</h3>
<ul>
<li>Redis 不要在外网被访问，禁止：bind 0.0.0.0
<ul>
<li>- bind 192.168.132.128</li>
</ul>
</li>
<li>更改 Redis 端口，不要6379
<ul>
<li>port : 8838</li>
</ul>
</li>
<li>Redis 使用非 root 启动</li>
<li>Redis 没有设置密码或者弱密码，不要与登陆密码相同
<ul>
<li>requirepass 与 masterauth</li>
</ul>
</li>
<li>定期备份，save 命令</li>
<li>配置号 Linux 防火墙规则</li>
</ul>
<p><a rel="nofollow" href="https://www.crazyfay.com/2021/12/11/redis%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%b8%80-%e5%9f%ba%e7%a1%80%e5%91%bd%e4%bb%a4/">Redis学习笔记(一)&#8211;基础命令</a>最先出现在<a rel="nofollow" href="https://www.crazyfay.com">枫阿雨&#039;s blog</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.crazyfay.com/2021/12/11/redis%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0%e4%b8%80-%e5%9f%ba%e7%a1%80%e5%91%bd%e4%bb%a4/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
