安装</h3>
因为笔者的主机是 linux 系统,因此我们只介绍 linux 环境下的安装方式。
<pre><code>wget http://download.redis.io/releases/redis-5.0.8.tar.gz
tar xzf redis-5.0.8.tar.gz
cd redis-5.0.8/
make
</code></pre>
由于 Redis 是开源软件,所以我们可以选择在线安装。第一句是下载源码,第二句是解压,后面三句是进入安装目录并执行安装。这也是 linux 环境下,大部分软件安装的流程和方式。
安装完成后,我们需要添加环境变量,以便于在任何位置启动 redis 。
<pre><code># 切换到root用户,修改/etc/profile文件,添加:
export PATH=$PATH:<redis-server和redis-cli所在目录>
</code></pre>
启动 redis 服务器:
<pre><code>jincheng@jincheng:~$ redis-server
2492:C 13 Apr 2020 14:55:23.175 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
2492:C 13 Apr 2020 14:55:23.175 # Redis version=5.0.8, bits=64, commit=00000000, modified=0, pid=2492, just started
2492:C 13 Apr 2020 14:55:23.175 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
2492:M 13 Apr 2020 14:55:23.176 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 5.0.8 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 2492
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
2492:M 13 Apr 2020 14:55:23.178 # Server initialized
2492:M 13 Apr 2020 14:55:23.178 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
2492:M 13 Apr 2020 14:55:23.178 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
2492:M 13 Apr 2020 14:55:23.178 * Ready to accept connections
</code></pre>
启动 redis 命令行客户端:
<pre><code>jincheng@jincheng:~$ redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
</code></pre>
可以看到,服务器已响应。其中,127.0.0.1 是本机 IP ,6379 是 redis 默认的服务端口。
<h3>数据类型</h3>
Redis 支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及 zset(sorted set:有序集合)。
具体如下表所示:
图片-2
String(字符串)
string 是 redis 最基本的类型,可以理解为与 Memcached 一模一样的类型,一个 key 对应一个 value 。string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如 jpg 图片或者序列化的对象。string 类型的值最大能存储 512MB 。
<pre><code class="lang-bash hljs">jincheng@jincheng:~$ redis-cli
127.0.0.1:6379<span class="token operator">></span> SET jincheng <span class="token string">"ok"</span>
OK
127.0.0.1:6379<span class="token operator">></span> get jincheng
<span class="token string">"ok"</span>
127.0.0.1:6379<span class="token operator">></span>
</code></pre>
redis 中的命令不区分大小写。在以上实例中我们使用了 SET 和 GET 命令。键为 jincheng,对应的值为 ok 。
注意:一个键最大能存储 512MB。
Hash(哈希)
Redis hash 是一个键值对 (key=>value) 集合。是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
<pre><code class="lang-bash hljs">127.0.0.1:6379<span class="token operator">></span> hmset person name <span class="token string">"jincheng"</span> age <span class="token string">"18"</span> sex <span class="token string">"male"</span>
OK
127.0.0.1:6379<span class="token operator">></span> hget person name
<span class="token string">"jincheng"</span>
127.0.0.1:6379<span class="token operator">></span> hget person age
<span class="token string">"18"</span>
127.0.0.1:6379<span class="token operator">></span> hget person sex
<span class="token string">"male"</span>
127.0.0.1:6379<span class="token operator">></span>
</code></pre>
上述实例中我们使用了 HMSET, HGET 命令,HMSET 设置了三个 field=>value 对, HGET 获取对应 field 对应的 value。每个 hash 可以存储 2^32 -1 个键值对。
List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
<pre><code class="lang-bash hljs">127.0.0.1:6379<span class="token operator">></span> lpush phones nokia
<span class="token punctuation">(</span>integer<span class="token punctuation">)</span> 1
127.0.0.1:6379<span class="token operator">></span> lpush phones huawei oppo vivo
<span class="token punctuation">(</span>integer<span class="token punctuation">)</span> 4
127.0.0.1:6379<span class="token operator">></span> lrange phones 0 10
1<span class="token punctuation">)</span> <span class="token string">"vivo"</span>
2<span class="token punctuation">)</span> <span class="token string">"oppo"</span>
3<span class="token punctuation">)</span> <span class="token string">"huawei"</span>
4<span class="token punctuation">)</span> <span class="token string">"nokia"</span>
127.0.0.1:6379<span class="token operator">></span>
</code></pre>
一个列表最多可存储 2^32 - 1 个元素。
Set(集合)
Redis 的 Set 是 string 类型的无序集合。集合是通过哈希表实现的,所以添加、删除、查找的复杂度都是 O(1)。
<pre><code class="lang-bash hljs">127.0.0.1:6379<span class="token operator">></span> sadd <span class="token function">date</span> <span class="token string">"today"</span>
<span class="token punctuation">(</span>integer<span class="token punctuation">)</span> 1
127.0.0.1:6379<span class="token operator">></span> sadd <span class="token function">date</span> <span class="token string">"yesterday"</span>
<span class="token punctuation">(</span>integer<span class="token punctuation">)</span> 1
127.0.0.1:6379<span class="token operator">></span> sadd <span class="token function">date</span> <span class="token string">"tomorrow"</span>
<span class="token punctuation">(</span>integer<span class="token punctuation">)</span> 1
127.0.0.1:6379<span class="token operator">></span> sadd <span class="token function">date</span> <span class="token string">"today"</span> <span class="token string">"yesterday"</span>
<span class="token punctuation">(</span>integer<span class="token punctuation">)</span> 0
127.0.0.1:6379<span class="token operator">></span> smembers <span class="token function">date</span>
1<span class="token punctuation">)</span> <span class="token string">"tomorrow"</span>
2<span class="token punctuation">)</span> <span class="token string">"yesterday"</span>
3<span class="token punctuation">)</span> <span class="token string">"today"</span>
127.0.0.1:6379<span class="token operator">></span>
</code></pre>
sadd 命令:添加一个 string 元素到 key 对应的 set 集合中,成功返回 1,如果元素已经在集合中返回 0。
一个集合中最大的成员数为 2^32 - 1 个,且不保存重复的值。
zset(sorted set:有序集合)
Redis zset 和 set 一样也是 string 类型元素的集合,但不允许重复的成员。不同的是每个元素都会关联一个double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。zset 的成员是唯一的,但分数(score) 却可以重复。
<pre><code class="lang-bash hljs">127.0.0.1:6379<span class="token operator">></span> zadd fruit 0 apple 0 banana
<span class="token punctuation">(</span>integer<span class="token punctuation">)</span> 2
127.0.0.1:6379<span class="token operator">></span> zadd fruit 0 pear
<span class="token punctuation">(</span>integer<span class="token punctuation">)</span> 1
127.0.0.1:6379<span class="token operator">></span> zadd fruit 1 apple
<span class="token punctuation">(</span>integer<span class="token punctuation">)</span> 0
127.0.0.1:6379<span class="token operator">></span> zrangebyscore fruit 0 10000
1<span class="token punctuation">)</span> <span class="token string">"banana"</span>
2<span class="token punctuation">)</span> <span class="token string">"pear"</span>
3<span class="token punctuation">)</span> <span class="token string">"apple"</span>
127.0.0.1:6379<span class="token operator">></span>
</code></pre>
zadd 命令:<code>zadd key score member</code> 添加元素到集合,元素在集合中存在则更新对应 score 。
<h3>命令</h3>
Redis 命令用于在 redis 服务上执行操作。要在 redis 服务上执行命令需要一个 redis 客户端。
在本机上执行命令:
在本机上执行 redis 命令,仅需在命令行中输入 redis-cli 即可:
<pre><code class="lang-bash hljs">jincheng@LAPTOP-E4NSNKIT:~$ redis-cli
127.0.0.1:6379<span class="token operator">></span> <span class="token function">ping</span>
PONG
127.0.0.1:6379<span class="token operator">></span>
</code></pre>
在远程服务上执行命令:
此时我们需要登录远程主机的 redis 服务器,那么我们就需要知道服务器的 IP 地址、端口号、登陆密码。
由于默认的配置文件中配置的是不需要密码,所以我们先来创建密码:
<pre><code class="lang-bash hljs">jincheng@LAPTOP-E4NSNKIT:~$ redis-cli
127.0.0.1:6379<span class="token operator">></span> config <span class="token keyword">set</span> requirepass codingbook
OK
127.0.0.1:6379<span class="token operator">></span>
</code></pre>
上面的操作已经在 redis 上设置了密码:codingbook 。当我们再次登录时,若不提供密码,则 redis 服务器会提示需要认证:
<pre><code class="lang-bash hljs">jincheng@LAPTOP-E4NSNKIT:~$ redis-cli
127.0.0.1:6379<span class="token operator">></span> keys *
<span class="token punctuation">(</span>error<span class="token punctuation">)</span> NOAUTH Authentication required.
127.0.0.1:6379<span class="token operator">></span>
</code></pre>
所以,在 redis 设置了密码以后,我们在登陆上服务器之后,一定先进行认证:
<pre><code class="lang-bash hljs">jincheng@LAPTOP-E4NSNKIT:~$ redis-cli
127.0.0.1:6379<span class="token operator">></span> auth codingbook
OK
127.0.0.1:6379<span class="token operator">></span> keys *
<span class="token punctuation">(</span>empty list or set<span class="token punctuation">)</span>
127.0.0.1:6379<span class="token operator">></span>
</code></pre>
有了密码以后,下面我们再来演示如何登陆远程 redis 服务器:
<pre><code class="lang-bash hljs">jincheng@LAPTOP-E4NSNKIT:~$ redis-cli -h 127.0.0.1 -p 6379 -a <span class="token string">"codingbook"</span>
127.0.0.1:6379<span class="token operator">></span> <span class="token function">ping</span>
PONG
127.0.0.1:6379<span class="token operator">></span>
</code></pre>
上面的命令表示:登录 IP 地址为 127.0.0.1 、端口号为 6379 、密码为 codingbook 的 redis 服务器。
<h3>HyperLogLog</h3>
Redis 在 2.8.9 版本添加了 HyperLogLog 结构。
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的.
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
什么是基数?
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为 5 。 基数估计就是在误差可接受的范围内,快速计算基数。
<pre><code class="lang-bash hljs">127.0.0.1:6379<span class="token operator">></span> PFADD num 1 2 3 4 5
<span class="token punctuation">(</span>integer<span class="token punctuation">)</span> 1
127.0.0.1:6379<span class="token operator">></span> PFADD num 2 4 6 8 0
<span class="token punctuation">(</span>integer<span class="token punctuation">)</span> 1
127.0.0.1:6379<span class="token operator">></span> PFCOUNT num
<span class="token punctuation">(</span>integer<span class="token punctuation">)</span> 8
127.0.0.1:6379<span class="token operator">></span>
</code></pre>
与 HyperLogLog 相关的命令
图-9
<h3>事务</h3>
Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
<ul><li>批量操作在发送 <code>EXEC</code> 命令前被放入队列缓存。</li><li>收到 <code>EXEC</code> 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。</li><li>在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。</li></ul>一个事务从开始到执行会经历以下三个阶段:开始事务、命令入队、执行事务。
以下是一个事务的例子, 它先以 <code>MULTI</code> 开始一个事务, 然后将多个命令入队到事务中, 最后由 <code>EXEC</code> 命令触发事务, 一并执行事务中的所有命令:
<pre><code class="lang-bash hljs">127.0.0.1:6379<span class="token operator">></span> MULTI
OK
127.0.0.1:6379<span class="token operator">></span> SET person-name <span class="token string">"jincheng"</span>
QUEUED
127.0.0.1:6379<span class="token operator">></span> GET person-name
QUEUED
127.0.0.1:6379<span class="token operator">></span> SADD pets <span class="token string">"dog"</span>
QUEUED
127.0.0.1:6379<span class="token operator">></span> SMEMBERS pets
QUEUED
127.0.0.1:6379<span class="token operator">></span> EXEC
1<span class="token punctuation">)</span> OK
2<span class="token punctuation">)</span> <span class="token string">"jincheng"</span>
3<span class="token punctuation">)</span> <span class="token punctuation">(</span>integer<span class="token punctuation">)</span> 1
4<span class="token punctuation">)</span> 1<span class="token punctuation">)</span> <span class="token string">"dog"</span>
127.0.0.1:6379<span class="token operator">></span>
</code></pre>
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
与事务相关的命令
图-13
<h3>安全</h3>
我们可以通过 redis 的配置文件设置密码参数,这样客户端连接到 redis 服务就需要密码验证,这样可以让你的 redis 服务更安全。
我们可以通过以下命令查看是否设置了密码验证:
<pre><code class="lang-bash hljs">127.0.0.1:6379<span class="token operator">></span> CONFIG GET requirepass
1<span class="token punctuation">)</span> <span class="token string">"requirepass"</span>
2<span class="token punctuation">)</span> <span class="token string">""</span>
127.0.0.1:6379<span class="token operator">></span>
</code></pre>
默认情况下 requirepass 参数是空的,这就意味着你无需通过密码验证就可以连接到 redis 服务。你可以通过以下命令来修改该参数:
<pre><code class="lang-bash hljs">127.0.0.1:6379<span class="token operator">></span> CONFIG SET requirepass <span class="token string">"codingbook"</span>
OK
127.0.0.1:6379<span class="token operator">></span> CONFIG GET requirepass
1<span class="token punctuation">)</span> <span class="token string">"requirepass"</span>
2<span class="token punctuation">)</span> <span class="token string">"codingbook"</span>
</code></pre>
设置密码后,客户端连接 redis 服务就需要密码验证,否则无法执行命令。
使用 <code>AUTH</code> 命令进行认证:
<pre><code class="lang-bash hljs">127.0.0.1:6379<span class="token operator">></span> AUTH codingbook
OK
127.0.0.1:6379<span class="token operator">></span>
</code></pre>
<h3>分区</h3>
分区是分割数据到多个 Redis 实例的处理过程,因此每个实例只保存 key 的一个子集。
分区的优势:
<ul><li>通过利用多台计算机内存的和值,允许我们构造更大的数据库。</li><li>通过多核和多台计算机,允许我们扩展计算能力;通过多台计算机和网络适配器,允许我们扩展网络带宽。</li></ul>分区的不足:
<ul><li>redis 的一些特性在分区方面表现的不是很好:</li><li>涉及多个 key 的操作通常是不被支持的。举例来说,当两个 set 映射到不同的 redis 实例上时,你就不能对这两个 set 执行交集操作。</li><li>涉及多个 key 的 redis 事务不能使用。</li><li>当使用分区时,数据处理较为复杂,比如你需要处理多个 rdb/aof 文件,并且从多个实例和主机备份持久化文件。</li><li>增加或删除容量也比较复杂。redis 集群大多数支持在运行时增加、删除节点的透明数据平衡的能力,但是类似于客户端分区、代理等其他系统则不支持这项特性。然而,一种叫做 presharding 的技术对此是有帮助的。</li></ul>分区类型:
Redis 有两种类型分区。 假设有 4 个 Redis 实例 R0,R1,R2,R3,和类似 user:1,user:2 这样的表示用户的多个 key ,对既定的 key 有多种不同方式来选择这个 key 存放在哪个实例中。也就是说,有不同的系统来映射某个 key 到某个 Redis 服务。
范围分区
最简单的分区方式是按范围分区,就是映射一定范围的对象到特定的 Redis 实例。
比如,ID 从 0 到 10000 的用户会保存到实例 R0,ID 从 10001 到 20000 的用户会保存到R1,以此类推。
这种方式是可行的,并且在实际中使用,不足就是要有一个区间范围到实例的映射表。这个表要被管理,同时还需要各 种对象的映射表,通常对 Redis 来说并非是好的方法。
哈希分区
另外一种分区方法是 hash 分区。这对任何 key 都适用,也无需是 object_name: 这种形式,像下面描述的一样简单:
<ul><li>用一个 hash 函数将 key 转换为一个数字,比如使用 crc32 hash 函数。对 key foobar 执行 crc32(foobar) 会输出类似 93024922 的整数。</li><li>对这个整数取模,将其转化为 0-3 之间的数字,就可以将这个整数映射到 4 个 Redis 实例中的一个了。93024922 % 4 = 2,就是说 key foobar 应该被存到 R2 实例中。注意:取模操作是取除的余数,通常在多种编程语言中用 % 操作符实现。</li></ul>
<blockquote class="layui-elem-quote" style="width: 100%;overflow:hidden">
作者: qq_42247231
链接: https://blog.csdn.net/qq_42247231/article/details/106482394
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
</blockquote>
到此这篇关于“Redis基础教程”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!
您可能感兴趣的文章:
PHP Redis相关操作大全
REDIS基础, GO语言
PHP操作Redis数据库常用方法(总结)
PHP操作Redis数据库常用方法
PHP操作Redis的基本方法
redis的基础数据结构之 sds
PHP Redis发布订阅
30 个 php 操作 redis 常用方法代码示例
超全的!Redis的安装和基础操作
Golang基础学习-redis使用