Redis

三世轮回 提交于 2020-03-10 05:56:43

官网地址:redis.io
中文版官网:redis.cn

redis是一个开源的、遵循BSD协议的、基于内存的而且目前比较流行的键值数据库(key-value-database), 是一个非关系型数据库,也称为NoSQL数据库。由C语言开发。

redis 提供将内存通过网络远程共享的一种服务,提供类似功能的还memcache,但相比 memcache,redis 还提供了易扩展、高性能、具备数据持久性等功能。
Redis 在高并发、低延迟环境要求比较高的环境使用量非常广泛.

目前redis在DB-Engine月排行榜 https://db-engines.com/en/ranking 中一直比较靠前,而且一直是键值型存储类的首位


相对Rdis来说,redis和memcached的对比
  1.支持数据的持久化:可以将内存中的数据保持在磁盘中,重启 redis 服务或服务器之后可以从备份文件中恢复数据到内存继续使用。
   2.支持更多的数据类型:支持 string(字符串)、hash(哈希数据)、list(列表)、set(集合)、zet(有序集合),而memcached仅支持string(字符串)
  3.支持数据的备份:可以实现类似于数据的 master-slave 模式的数据备份,另外也支持使用快照+AOF。
   4.支持更大的 value 数据:memcache 单个 key value 最大只支持 1MB,而 redis 最大支持 512MB。
   5.Redis 是单线程,而 memcache 是多线程,所以单机情况下没有 memcache 并发高,但redis支持分布式集群以实现更高的并发,单Redis实例可以实现数万并发。
   6.支持集群横向扩展:基于 redis cluster 的横向扩展,可以实现分布式集群,大幅提升性能和数据安全性。


redis的典型应用场景
   1.Session 共享:常见于web集群中的Tomcat或者PHP中多web服务器session共享
   2.消息队列:ELK 的日志缓存、部分业务的订阅发布系统
   3.计数器:访问排行榜、商品浏览数等和次数相关的数值统计场景
   4.缓存:数据查询、电商网站商品信息、新闻内容
   5.微博/微信社交场合:共同好友、点赞评论等


安装Redis

yum方式就不介绍了。需要EPEL源,版本过低,过于简单!

[root@centos_7 yum.repos.d]# yum list redis
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Available Packages
redis.x86_64                         3.2.12-2.el7                          Epel1

源码编译: 安装Redis4版本
官网下载地址:http://download.redis.io/releases/

下载:wget http://download.redis.io/releases/redis-4.0.14.tar.gz

--2020-03-09 09:49:48--  http://download.redis.io/releases/redis-4.0.14.tar.gz
Resolving download.redis.io (download.redis.io)... 109.74.203.151
Connecting to download.redis.io (download.redis.io)|109.74.203.151|:80... connected.
HTTP request sent, awaiting response... 302 Found
Location: http://117.128.6.27/cache/download.redis.io/releases/redis-4.0.14.tar.gz?ich_args2=468-09095013012405_3dd269048c70bdf875dc9acff1b71955_10001002_9c896c2fd0c2f9d7953b518939a83798_c8a912a80ccc397fec935bfecdb1cca8 [following]
--2020-03-09 09:49:49--  http://117.128.6.27/cache/download.redis.io/releases/redis-4.0.14.tar.gz?ich_args2=468-09095013012405_3dd269048c70bdf875dc9acff1b71955_10001002_9c896c2fd0c2f9d7953b518939a83798_c8a912a80ccc397fec935bfecdb1cca8
Connecting to 117.128.6.27:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1740967 (1.7M) [application/x-gzip]
Saving to: ‘redis-4.0.14.tar.gz’

100%[======================================>] 1,740,967   11.0MB/s   in 0.2s   

2020-03-09 09:49:49 (11.0 MB/s) - ‘redis-4.0.14.tar.gz’ saved [1740967/1740967]

源码安装四步骤

[root@centos_8 src]# ls
redis-4.0.14.tar.gz
[root@centos_8 src]# tar xf redis-4.0.14.tar.gz 
[root@centos_8 src]# ls
redis-4.0.14  redis-4.0.14.tar.gz
[root@centos_8 src]# cd redis-4.0.14
[root@centos_8 redis-4.0.14]# make MALLOC=libc
[root@centos_8 redis-4.0.14]# make PREFIX=/usr/local/redis install
cd src && make install  以此开始编译
make[1]: Entering directory `/usr/local/src/redis-4.0.14/src'
    CC Makefile.dep
。。。。。
[root@centos_8 redis-4.0.14]# echo $?
0       用此方式查看编译过程中是否存在错误

创建redis用户和数据目录并修改权限

[root@centos_8 redis-4.0.14]# groupadd -g 1000 redis && useradd -u 1000 -g 1000 redis -s /sbin/nologin 
[root@centos_8 redis-4.0.14]# mkdir -pv /usr/local/redis/{etc,logs,data,run} 
[root@centos_8 redis-4.0.14]# chown redis.redis -R /usr/local/redis/

编译完成后,安装目录下会有Redis模板配置文件,将生成的模板配置文件拷贝至自定义配置目录

[root@centos_8 redis-4.0.14]# mkdir /usr/local/redis/etc
[root@centos_8 redis-4.0.14]# cp redis.conf /usr/local/redis/etc/

将redis的可执行命令建立软连接至/usr/bin,添加到环境变量中

 [root@centos_8 redis-4.0.14]# ln -sv /usr/local/redis/bin/redis-* /usr/bin/
 ...中间省略部分信息
 
安装后的工具介绍:
   redis-benchmark:性能测试工具
   redis-check-rdb:文件检查工具
   redis-sentinel  :哨兵
   redis-check-aof:文件检查工具
   redis-cli:客户端工具
   redis-server :服务端工具

刚编译完成后需要设置的三个参数,使用redis默认方式启动就可以看到

[root@centos_8 redis-4.0.14]# redis-server /usr/local/redis/etc/redis.conf
在这里插入图片描述 1.tcp-backlog,backlog 参数控制的是三次握手的时候 server 端收到 client ack 确认号之后的队列值。
编辑内核参数:

[root@centos_8 redis-4.0.14]# vim /etc/sysctl.conf 
net.core.somaxconn = 512
[root@centos_8 redis-4.0.14]# sysctl -p 让其生效
net.core.somaxconn = 512

再次启动时就会少一个报警

2.vm.overcommit_memory
  0:表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许; 否则,内存申请失败,并把错误返回给应用进程。
  1:表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
  2:表示内核允许分配超过所有物理内存和交换空间总和的内存

[root@centos_8 redis-4.0.14]# vim /etc/sysctl.conf 
net.core.somaxconn = 512
vm.overcommit_memory = 1
[root@centos_8 redis-4.0.14]# sysctl -p
net.core.somaxconn = 512
vm.overcommit_memory = 1

3.transparent hugepage: 需要关闭大页内存动态分配,让 redis 负责内存管理。

首先要执行一次下面的命令,然后在写入到文件中
[root@centos_8 redis-4.0.14]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@centos_8 redis-4.0.14]# vim /etc/rc.d/rc.local
...
echo never > /sys/kernel/mm/transparent_hugepage/enabled

如果要开机启动需要将文件加上执行权限
[root@centos_8 redis-4.0.14]# chmod +x /etc/rc.d/rc.local    

大页内存默认2M


编写使用systemd管理的脚本

[root@centos_8 ~]# cat /usr/lib/systemd/system/redis.service 
 [Unit]
 Description=Redis persistent key-value database 
 After=network.target 
 After=network-online.target 
 Wants=network-online.target 
 
 [Service] 
 ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf --supervised systemd
 ExecReload=/bin/kill -s HUP $MAINPID  
 ExecStop=/bin/kill -s QUIT $MAINPID 
 Type=notify 
 User=redis
 Group=redis 
 RuntimeDirectory=redis 
 RuntimeDirectoryMode=0755 
 
 [Install]
 WantedBy=multi-user.target 

启动并验证

[root@centos_8 ~]# systemctl restart redis
[root@centos_8 ~]# ss -nlt
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port 
LISTEN     0      100    127.0.0.1:25                        *:*                  
LISTEN     0      511    127.0.0.1:6379                      *:*                  
LISTEN     0      128           *:22                        *:*                  
LISTEN     0      100       [::1]:25                     [::]:*                  
LISTEN     0      128        [::]:22                     [::]:*                  
[root@centos_8 ~]# redis-cli
127.0.0.1:6379> ping	测试命令,返回 PONG
PONG   

连接主机的方式:
 本机非密码连接: redis-cli
 跨主机非密码连接: redis-cli -h HOSTNAME/IP -p PORT
 跨主机密码连接: redis-cli -h HOSTNAME/IP -p PORT -a PASSWORD

建议:
  如果设置了密码,不要在命令行中直接输入密码,会暴露可以先redis.cli登录进去,使用autu PASSWORD进行认证也是可以的

[root@centos_7 local]# redis-cli 
127.0.0.1:6379> AUTH 123123
OK

持久化模式

  redis 虽然是一个内存级别的缓存程序,即 redis 是使用内存进行数据的缓存的,但是其可以将内存 的数据按照一定的策略保存到硬盘上,从而实现数据持久保存的目的,redis 支持两种不同方式的数据 持久化保存机制,分别是 RDB 和 AOF

RDB
   基于时间的快照,只保留当前最新的一次快照,特点是执行速度比较快,缺点是可能会丢失从上次快照到当前快照之间未完成之间的数据。

RDB 实现的具体过程:
  Redis 从主进程先 fork 出一个子进程,使用写时复制机制,子进程将内存的数据保存为一个临时文件,比如 dump.rdb.temp,当数据保存完成之后再将上一次保存的 RDB 文件替换掉, 然后关闭子进程,这样可以保存每一次做 RDB 快照的时候保存的数据都是完整的,因为直接替换 RDB 文件的时候可能会出现突然断电等问题而导致 RDB 文件还没有保存完整就突然关机停止保存而导致数据丢失的情况,可以手动将每次生成的 RDB 文件进程备份,这样可以最大化保存历史数据。

RDB的优点:
  RDB 快照保存了某个时间点的数据,可以通过脚本执行 bgsave(非阻塞)或者 save(阻塞)命令自定义时间点备份,可以保留多个备份,当出现问题可以恢复到不同时间点的版本。
  可以最大化 io 的性能,因为父进程在保存 RDB 文件的时候唯一要做的是 fork 出一个子进程,然后的操作都会有这个子进程操作,父进程无需任何的 IO 操作
  RDB 在大量数据比如几个 G 的数据,恢复的速度比 AOF 的快

RDB的缺点:
  不能时时的保存数据,会丢失自上一次执行 RDB 备份到当前的内存数据
  数据量非常大的时候,从父进程 fork 出子进程的时候需要一点时间,可能是毫秒或者秒


AOF
  按照操作顺序依次将操作添加到指定的日志文件当中,特点是数据安全性相对较高,缺点是即使有些操作是重复的也会全部记录。

  AOF 和 RDB 一样使用了写时复制机制,AOF 默认为每秒钟 fsync 一次,即将执行的命令保存到 AOF 文 件当中,这样即使 redis 服务器发生故障的话顶多也就丢失 1 秒钟之内的数据,也可以设置不同的 fsync 策略,或者设置每次执行命令的时候执行 fsync,fsync 会在后台执行线程,所以主线程可以继续处理用户的正常请求而不受到写入 AOF 文件的 IO 影响

AOF的优点:
  数据安全性比RDB高

AOF的缺点:
  AOF 的文件大小要大于 RDB 格式的文件
  根据所使用的 fsync 策略(fsync 是同步内存中 redis 所有已经修改的文件到存储设备),由配置文件中 appendfsync everysec 选项定义几秒秒执行一次 fsync

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!