哈喽,大家好,我是有勇气的牛排(全网同名)🐮🐮🐮
有问题的小伙伴欢迎在文末评论,点赞、收藏是对我最大的支持!!!。
1 前言
1.1 NoSQL简介
目前市场主流数据存储都是使用关系型数据库。每次操作关系型数据库都是I/O操作,I/O操作是主要影响程序性能的原因之一,连接、关闭数据库都是消耗性能的过程.
因此,尽量减少对数据库的操作,能明显提升程序运行效率。
关系型数据库索引都是树状数据结构,当数据量超大时,树的深度就会越深,查询性能就会降低。
针对关系型数据库的缺点,市面上就有有了NoSQL(Not Only SQL)
常见的NoSQL有
memcached
:键值对、内存型数据库。
redis
:与memcached类似,且具有持久化能力。
HBase
:大数据海量数据、以列为存储。
MongoDB
:以document做存储,特别像关系型数据库。
1.2 Redis简介
Redis 是一个开源(BSD 许可)的内存数据结构存储,用作数据库、缓存和消息代理。Redis 提供数据结构,例如字符串、散列、列表、集合、具有范围查询的排序集合、位图、超日志、地理空间索引和流。Redis 具有内置复制、Lua 脚本、LRU 驱逐、事务和不同级别的磁盘持久性,并通过 Redis Sentinel 和 Redis Cluster 自动分区提供高可用性。
Redis是由C语言编写,并且用Key-value形式进行存储的NoSQL开源数据库,效率非常高。其以solt(槽) 作为数据存储单元,每个槽中可以存储N个键值对,固定有1638个槽,理论上可以实现一个槽是一个redis,每个槽受限于服务器的大小。
Redis默认16个数据库,从0开始,其中0号也为默认库。
其支持多种数据存储类型:string、lsit、set、zset、hash。这些数据类型都支持 push/pop、add/remove,交、并、差集等操作,且这些操作都是原子性的。
同时通过 Redis Sentinel(哨兵)提供高可用,通过Redis Cluster集群提供自动分区。
Reids 将数据存储在内存中,并且周期性的将数据写入磁盘中,或者修改操作写入追加的记录文件。并且在此基础上实现了 master-slave(主从) 同步。
推荐文档:https://www.redis.com.cn/commands.html
1.2.1 Reids 是单线程+多路复用技术
多路复用是指使用一个线程来检查多个文件描述(Socket)的就绪状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启动线程执行(比如线程池)。
Redis官网
下载:https://download.redis.io/releases/
1.3 应用场景
1.3.1 配合关系型数据库做高速缓存(边路缓存)
(1)高频次:可以降低对热门数据访问数据库IO的操作数量。
(2)分布式架构,做session共享
cache aside pattern 边路缓存是一种指导思想,其中包括:
(1)查询的的时候先查缓存,如果缓存不存在,再查询数据库。
(2)修改缓存的时候,先修改数据库,后修改缓存。
1.3.2 多样的数据结构存储持久化数据
场景 |
技术 |
最新N个数据 |
通过List实现按自然时间排序的数据 |
排行榜,TopN |
利用zset有序集合 |
时效性数据,如验证码 |
Expire过期 |
计数器:秒杀 |
原子性,自增方法INCR、DECR |
去除大量数据中的重复数据 |
利用set集合 |
构建队列 |
利用list集合 |
发布订阅消息系统 |
pub/sub模式 |
2 Centos单机版安装
2.1 环境准备及安装
安装前必须具备gcc环境、C++库环境
gcc -v
yum -y install gcc-c++
查看是否已经装redis
redis-server -v
下载
mkdir /usr/local/redis
cd /usr/local/redis
wget https://download.redis.io/releases/redis-7.0.0.tar.gz
tar -xvf redis-7.0.0.tar.gz
cd redis-7.0.0
安装
make && make install
默认会安装到:/usr/local/bin
, 生成如下文件
redis-benchmark:性能测试工具
redis-check-aof:修复有问题的AOF文件
redis-check-rdb:修复有问题的RDB文件
redis-cli :客户端,操作入口
redis-sentinel :Redis集群使用
redis-server :Redis服务器启动命令
2.2 配置文件
mkdir /usr/local/redis/logs
mkdir /usr/local/redis/data
# 309 是否守护进程运行(后台运行)
daemonize yes
# 111 默认yes, 限制为本地访问
protected-mode no
# 87 设置绑定的ip(或者注释,关闭限制远程)
bind 0.0.0.0
# 设置端口号
port 6379
# 1036 密码
requirepass 123456
# 定期检测cli连接是否存活
tcp-keepalive 300
# 日志级别
# 可选项有:
# warning(仅有部分重要、关键信息才会被记录)。
loglevel notice
# 日志文件的位置
#logfile "/usr/local/redis/logs"
# 最大连接数
# maxclients 10000
# 数据库个数(可选)
databases 16
# 输入本地redis数据库存放文件夹(可选)
dir /usr/local/redis/data
# 持久化操作设置 900秒内触发一次请求进行持久化,300秒内触发10次请求进行持久化操作,60s内触发10000次请求进行持久化操作
save 900 1
save 300 10
save 60 10000
# redis持久化(可选)
appendonly yes
2.3 启动
后台启动
redis-server /usr/local/redis/redis.conf
查看进程
ps -ef | grep redis | grep -v gerp
连接客户端
redis-cli -p 6379 -a 123456
auth 123456
关闭
# 内部关闭
shutdonw
# 远程关闭
redis-cli -a 123456 -p 6379 shutdown
# 查看端口占用
lsof -i:6379

2.4 卸载
ls -l /usr/local/bin/redis-*
rm -rf /usr/local/bin/redis-*
3 docker 安装Redis
初始化映射目录
mkdir /usr/local/docker/redis/data
mkdir /usr/local/docker/redis/logs
安装
docker run -d \
-p 6379:6379 \
--privileged=true \
-v /usr/local/docker/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/docker/redis/data:/data \
-v /usr/local/docker/redis/logs:/usr/local/logs \
--name cs_myredis redis \
--requirepass "123456"
docker exec -it 96238796c979 /bin/bash
# 进入容器
docker exec -it cs_myredis /bin/bash
redis-cli
或者
docker exec -it cs_myredis redis-cli
4 常见报错
make指令
cd src && make all
make[1]: Entering directory `/usr/cstor/redis/src'
CC adlist.o
/bin/sh: cc: command not found
make[1]: *** [adlist.o] Error 127
make[1]: Leaving directory `/usr/cstor/redis/src'
make: *** [all] Error 2
解决方法
yum -y install gcc gcc-c++ libstdc++-devel
yum -y install gcc automake autoconf libtool make
一系列安装货如果还报错,就是上次安装报错残留报错问题
make distclean
<p><font face="楷体,华文行楷,隶书,黑体" color="red" size="4"><strong>哈喽,大家好,我是有勇气的牛排(全网同名)🐮🐮🐮</strong></font></p>
<p><font face="楷体,华文行楷,隶书,黑体" color="blue" size="4"><strong>有问题的小伙伴欢迎在文末评论,点赞、收藏是对我最大的支持!!!。</strong></font></p>
<h2><a id="1__4"></a>1 前言</h2>
<h3><a id="11_NoSQL_6"></a>1.1 NoSQL简介</h3>
<p>目前市场主流数据存储都是使用关系型数据库。每次操作关系型数据库都是I/O操作,I/O操作是主要影响程序性能的原因之一,连接、关闭数据库都是消耗性能的过程.<br />
因此,尽量减少对数据库的操作,能明显提升程序运行效率。</p>
<p>关系型数据库索引都是树状数据结构,当数据量超大时,树的深度就会越深,查询性能就会降低。</p>
<p>针对关系型数据库的缺点,市面上就有有了NoSQL(Not Only SQL)</p>
<p><strong>常见的NoSQL有</strong><br />
<code>memcached</code>:键值对、内存型数据库。<br />
<code>redis</code>:与memcached类似,且具有持久化能力。<br />
<code>HBase</code>:大数据海量数据、以列为存储。<br />
<code>MongoDB</code>:以document做存储,特别像关系型数据库。</p>
<h3><a id="12_Redis_21"></a>1.2 Redis简介</h3>
<p>Redis 是一个开源(BSD 许可)的内存数据结构存储,用作数据库、缓存和消息代理。Redis 提供数据结构,例如字符串、散列、列表、集合、具有范围查询的排序集合、位图、超日志、地理空间索引和流。Redis 具有内置复制、Lua 脚本、LRU 驱逐、事务和不同级别的磁盘持久性,并通过 Redis Sentinel 和 Redis Cluster 自动分区提供高可用性。</p>
<p>Redis是由C语言编写,并且用Key-value形式进行存储的NoSQL开源数据库,效率非常高。其以solt(槽) 作为数据存储单元,每个槽中可以存储N个键值对,固定有1638个槽,理论上可以实现一个槽是一个redis,每个槽受限于服务器的大小。</p>
<p>Redis默认16个数据库,从0开始,其中0号也为默认库。</p>
<p>其支持多种数据存储类型:string、lsit、set、zset、hash。这些数据类型都支持 push/pop、add/remove,交、并、差集等操作,且这些操作都是<strong>原子性</strong>的。</p>
<p>同时通过 Redis Sentinel(哨兵)提供高可用,通过Redis Cluster集群提供自动分区。</p>
<p>Reids 将数据存储在内存中,并且周期性的将数据写入磁盘中,或者修改操作写入追加的记录文件。并且在此基础上实现了 <strong>master-slave(主从)</strong> 同步。</p>
<p>推荐文档:<a href="https://www.redis.com.cn/commands.html" target="_blank">https://www.redis.com.cn/commands.html</a></p>
<h4><a id="121_Reids__37"></a>1.2.1 Reids 是单线程+多路复用技术</h4>
<p>多路复用是指使用一个线程来检查多个文件描述(Socket)的就绪状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启动线程执行(比如线程池)。</p>
<p><a href="https://redis.io/" target="_blank">Redis官网</a></p>
<p>下载:<a href="https://download.redis.io/releases/" target="_blank">https://download.redis.io/releases/</a></p>
<h3><a id="13__49"></a>1.3 应用场景</h3>
<h4><a id="131__51"></a>1.3.1 配合关系型数据库做高速缓存(边路缓存)</h4>
<p>(1)高频次:可以降低对热门数据访问数据库IO的操作数量。<br />
(2)分布式架构,做session共享</p>
<p><strong>cache aside pattern 边路缓存</strong>是一种指导思想,其中包括:</p>
<p>(1)查询的的时候先查缓存,如果缓存不存在,再查询数据库。<br />
(2)修改缓存的时候,先修改数据库,后修改缓存。</p>
<h4><a id="132__61"></a>1.3.2 多样的数据结构存储持久化数据</h4>
<table>
<thead>
<tr>
<th>场景</th>
<th>技术</th>
</tr>
</thead>
<tbody>
<tr>
<td>最新N个数据</td>
<td>通过List实现按自然时间排序的数据</td>
</tr>
<tr>
<td>排行榜,TopN</td>
<td>利用zset有序集合</td>
</tr>
<tr>
<td>时效性数据,如验证码</td>
<td>Expire过期</td>
</tr>
<tr>
<td>计数器:秒杀</td>
<td>原子性,自增方法INCR、DECR</td>
</tr>
<tr>
<td>去除大量数据中的重复数据</td>
<td>利用set集合</td>
</tr>
<tr>
<td>构建队列</td>
<td>利用list集合</td>
</tr>
<tr>
<td>发布订阅消息系统</td>
<td>pub/sub模式</td>
</tr>
</tbody>
</table>
<h2><a id="2_Centos_75"></a>2 Centos单机版安装</h2>
<h3><a id="21__77"></a>2.1 环境准备及安装</h3>
<p>安装前必须具备gcc环境、C++库环境</p>
<pre><div class="hljs"><code class="lang-shell">gcc -v
</code></div></pre>
<pre><div class="hljs"><code class="lang-shell">yum -y install gcc-c++
</code></div></pre>
<p>查看是否已经装redis</p>
<pre><div class="hljs"><code class="lang-shell">redis-server -v
</code></div></pre>
<p>下载</p>
<pre><div class="hljs"><code class="lang-shell">mkdir /usr/local/redis
cd /usr/local/redis
wget https://download.redis.io/releases/redis-7.0.0.tar.gz
tar -xvf redis-7.0.0.tar.gz
cd redis-7.0.0
</code></div></pre>
<p>安装</p>
<pre><div class="hljs"><code class="lang-shell">make && make install
</code></div></pre>
<p>默认会安装到:<code>/usr/local/bin</code>, 生成如下文件</p>
<pre><div class="hljs"><code class="lang-shell">redis-benchmark:性能测试工具
redis-check-aof:修复有问题的AOF文件
redis-check-rdb:修复有问题的RDB文件
redis-cli :客户端,操作入口
redis-sentinel :Redis集群使用
redis-server :Redis服务器启动命令
</code></div></pre>
<h3><a id="22__124"></a>2.2 配置文件</h3>
<pre><div class="hljs"><code class="lang-shell">mkdir /usr/local/redis/logs
mkdir /usr/local/redis/data
</code></div></pre>
<pre><div class="hljs"><code class="lang-shell"><span class="hljs-meta"># </span><span class="language-bash">309 是否守护进程运行(后台运行)</span>
daemonize yes
<span class="hljs-meta">
# </span><span class="language-bash">111 默认<span class="hljs-built_in">yes</span>, 限制为本地访问</span>
protected-mode no
<span class="hljs-meta">
# </span><span class="language-bash">87 设置绑定的ip(或者注释,关闭限制远程)</span>
bind 0.0.0.0
<span class="hljs-meta">
# </span><span class="language-bash">设置端口号</span>
port 6379
<span class="hljs-meta">
# </span><span class="language-bash">1036 密码</span>
requirepass 123456
<span class="hljs-meta">
# </span><span class="language-bash">定期检测cli连接是否存活</span>
tcp-keepalive 300
<span class="hljs-meta">
# </span><span class="language-bash">日志级别</span>
<span class="hljs-meta"># </span><span class="language-bash">可选项有: <span class="hljs-comment"># debug(记录大量日志信息,适用于开发、测试阶段); # verbose(较多日志信息); # notice(适量日志信息,使用于生产环境);</span></span>
<span class="hljs-meta"># </span><span class="language-bash">warning(仅有部分重要、关键信息才会被记录)。</span>
loglevel notice
<span class="hljs-meta">
# </span><span class="language-bash">日志文件的位置</span>
<span class="hljs-meta">#</span><span class="language-bash">logfile <span class="hljs-string">"/usr/local/redis/logs"</span></span>
<span class="hljs-meta">
# </span><span class="language-bash">最大连接数</span>
<span class="hljs-meta"># </span><span class="language-bash">maxclients 10000</span>
<span class="hljs-meta">
# </span><span class="language-bash">数据库个数(可选)</span>
databases 16
<span class="hljs-meta">
# </span><span class="language-bash">输入本地redis数据库存放文件夹(可选)</span>
dir /usr/local/redis/data
<span class="hljs-meta">
# </span><span class="language-bash">持久化操作设置 900秒内触发一次请求进行持久化,300秒内触发10次请求进行持久化操作,60s内触发10000次请求进行持久化操作</span>
save 900 1
save 300 10
save 60 10000
<span class="hljs-meta">
# </span><span class="language-bash">redis持久化(可选)</span>
appendonly yes
</code></div></pre>
<h3><a id="23__178"></a>2.3 启动</h3>
<p>后台启动</p>
<pre><div class="hljs"><code class="lang-shell">redis-server /usr/local/redis/redis.conf
</code></div></pre>
<p>查看进程</p>
<pre><div class="hljs"><code class="lang-shell">ps -ef | grep redis | grep -v gerp
</code></div></pre>
<p>连接客户端</p>
<pre><div class="hljs"><code class="lang-shell">redis-cli -p 6379 -a 123456
auth 123456
</code></div></pre>
<p>关闭</p>
<pre><div class="hljs"><code class="lang-shell"><span class="hljs-meta"># </span><span class="language-bash">内部关闭</span>
shutdonw
<span class="hljs-meta">
# </span><span class="language-bash">远程关闭</span>
redis-cli -a 123456 -p 6379 shutdown
<span class="hljs-meta">
# </span><span class="language-bash">查看端口占用</span>
lsof -i:6379
</code></div></pre>
<p><img src="https://static.couragesteak.com/article/d244d180a940f0e178f8097132d26fde.png" alt="Redis 6379端口占用情况.png" /></p>
<h3><a id="24__215"></a>2.4 卸载</h3>
<pre><div class="hljs"><code class="lang-shell">ls -l /usr/local/bin/redis-*
rm -rf /usr/local/bin/redis-*
</code></div></pre>
<h2><a id="3_docker_Redis_224"></a>3 docker 安装Redis</h2>
<p>初始化映射目录</p>
<pre><div class="hljs"><code class="lang-shell">mkdir /usr/local/docker/redis/data
mkdir /usr/local/docker/redis/logs
</code></div></pre>
<p>安装</p>
<pre><div class="hljs"><code class="lang-shell">docker run -d \
-p 6379:6379 \
--privileged=true \
-v /usr/local/docker/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/docker/redis/data:/data \
-v /usr/local/docker/redis/logs:/usr/local/logs \
--name cs_myredis redis \
--requirepass "123456"
docker exec -it 96238796c979 /bin/bash
</code></div></pre>
<pre><div class="hljs"><code class="lang-shell"><span class="hljs-meta"># </span><span class="language-bash">进入容器</span>
docker exec -it cs_myredis /bin/bash
redis-cli
或者
docker exec -it cs_myredis redis-cli
</code></div></pre>
<h2><a id="4__260"></a>4 常见报错</h2>
<p>make指令</p>
<pre><div class="hljs"><code class="lang-shell">cd src && make all
make[1]: Entering directory `/usr/cstor/redis/src'
CC adlist.o
/bin/sh: cc: command not found
make[1]: *** [adlist.o] Error 127
make[1]: Leaving directory `/usr/cstor/redis/src'
make: *** [all] Error 2
</code></div></pre>
<p>解决方法</p>
<pre><div class="hljs"><code class="lang-shell">yum -y install gcc gcc-c++ libstdc++-devel
</code></div></pre>
<pre><div class="hljs"><code class="lang-shell">yum -y install gcc automake autoconf libtool make
</code></div></pre>
<p>一系列安装货如果还报错,就是上次安装报错残留报错问题</p>
<pre><div class="hljs"><code class="lang-shell">make distclean
</code></div></pre>
留言