Redis介绍/安装/配置
1 Redis初识
1.1 Redis是什么
介绍:
Redis 全称 Remote Dictionary Server(即远程字典服务),它是一个基于内存实现的键值型非关系(NoSQL)数据库,由意大利人 Salvatore Sanfilippo 使用 C 语言编写。
Redis 遵守 BSD 协议,实现了免费开源,其最新版本是 6.20,常用版本包括 3.0 、4.0、5.0。自 Redis 诞生以来,它以其超高的性能、完美的文档和简洁易懂的源码广受好评,国内外很多大型互联网公司都在使用 Redis,比如腾讯、阿里、Twitter、Github 等等。
提示:Redis中文官网(http://redis.cn/)提供了完善的社区环境、文档说明,以及更新支持。
常见的内存型数据库,除 Redis 之外,还有 Oracle Berkeley DB(甲骨文旗下的一款产品)、SQlite(轻量级内存数据库)、Memcache(键值型分布式缓存数据库)、Altibase(基于内存的高性能数据库)。
与其他内存型数据库相比,Redis 具有以下特点:
- Redis 不仅可以将数据完全保存在内存中,还可以通过磁盘实现数据的持久存储;
- Redis 支持丰富的数据类型,包括 string、list、set、zset、hash 等多种数据类型,因此它也被称为“数据结构服务器”;
- Redis 支持主从同步,即 master-slave 主从复制模式。数据可以从主服务器向任意数量的从服务器上同步,有效地保证数据的安全性;
- Redis 支持多种编程语言,包括 C、C++、Python、Java、PHP、Ruby、Lua 等语言。
与 SQL 型数据库截然不同,Redis 没有提供新建数据库的操作,因为它自带了 16 (0—15)个数据库(默认使用 0 库)。在同一个库中,key 是唯一存在的、不允许重复的,它就像一把“密钥”,只能打开一把“锁”。键值存储的本质就是使用 key 来标识 value,当想要检索 value 时,必须使用与 value 相对应的 key 进行查找。Redis 数据库没有“表”的概念,它通过不同的数据类型来实现存储数据的需求,不同的数据类型能够适应不同的应用场景,从而满足开发者的需求。
1.2 Redis特性
速度快:10w ops(每秒10w读写),数据存在内存中,c语言实现,单线程模型
持久化:rdb和aof
多种数据结构:
5大数据结构
BitMaps位图:布隆过滤器 本质是 字符串
HyperLogLog:超小内存唯一值计数,12kb HyperLogLog 本质是 字符串
GEO:地理信息定位 本质是有序集合
支持多种编程语言:基于tcp通信协议,各大编程语言都支持
功能丰富:发布订阅(消息) Lua脚本,事务(pipeline)
简单:源代码几万行,不依赖外部库
主从复制:主服务器和从服务器,主服务器可以同步到从服务器中
高可用和分布式:
2.8版本以后使用redis-sentinel支持高可用
3.0版本以后支持分布式
1.3 Redis单线程模型
单线程为什么这么快?
# 数据在内存中(最重要的)
# 用了io多路复用技术
# 没有进程、线程间的切换。线程间数据交互也要消耗资源-->因此有了协程--单线程下的数据并发
为什么Redis不支持windows?
# select、poll和epoll都是io多路复用技术的机制
select(服务器最多监听1024个系统调用),监听的调用放在列表里,轮询的方式,for循环一个一个去看状态有没有变化
poll,本质跟select一样,是select的加强版,监听更多
epoll(理论上监听无上限),主动回调的方式,性能更高
windows上不支持epoll,因此redis不支持windows。windows上装的redis的是第三方迁移过来的,用的还是select,所以性能比Linux上的要低
1.4 Redis架构
Redis体系架构主要分为两个部分:
- Redis服务端
- Redis客户端
客户端和服务端可以位于同一台计算机上,也可以位于不同的计算机上。服务端是整个架构的“大脑”,能够把数据存储到内存中,并起到管理数据的作用。
1.5 Redis与其他数据库对比
名称 | 类型 | 数据存储选项 | 附加功能 |
---|---|---|---|
Redis | 基于内存存储的键值非关系型数据库 | 字符串、列表、散列、有序集合、无序集合 | 发布与订阅、主从复制、持久化存储等 |
Memcached | 基于内存存储的键值缓存型数据库 | 键值之间的映射、只支持字符串 | 为提升性能构建了多线程服务器 |
MySQL | 基于磁盘的关系型数据库 | 每个数据库可以包含多个表,每个表可以包含多条记录; 支持第三方扩展。 |
支持 ACID 性质、主从复制和主主复制 |
MongoDB | 基于磁盘存储的非关系文档型数据库 | 每个数据库可以包含多个集合,每个集合可以插入多个文档 | 支持聚合操作、主从复制、分片和空间索引 |
1.6 Redis应用场景
缓存系统:使用最广泛,用来缓存一些经常被访问的热点数据、或者需要耗费大量资源的内容,通过把这些内容放到 Redis 中,可以让应用程序快速地读取它们。例如,网站的首页需要经常被访问,并且在创建首页的过程中会消耗的较多的资源,此时就可以使用 Redis 将整个首页缓存起来,从而降低网站的压力,减少页面访问的延迟时间。
计数器:网站访问量,转发量,评论数(文章转发,商品销量,单线程模型,不会出现并发问题),计数的东西都先放redis中,不要计一条数就往数据库里放
消息队列:发布订阅,阻塞队列实现(简单的分布式,blpop:阻塞队列,生产者消费者模型)
排行榜:有序集合(阅读排行,点赞排行,推荐排行(销量高的,推荐))
社交网络:很多特性跟社交网络匹配,粉丝数,关注数
实时系统:垃圾邮件处理系统,布隆过滤器
2 Redis单机安装
2.1 下载安装
Linux源码包安装
# 更新系统软件包
yum update -y
# 安装软件管理包和可能使用的依赖
yum -y groupinstall "Development tools"
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel psmisc libffi-devel
# 下载redis源码包
wget http://download.redis.io/releases/redis-5.0.7.tar.gz
# 解压
tar -xzf redis-5.0.7.tar.gz
# 建立软连接(下载新的redis版本解压后,只需要新建软连接不用更改配置和环境 ln -s redis-6.0.7 redis)
ln -s redis-5.0.7 redis
# 编译安装
cd redis
make&&make install
# 编译安装失败,重新安装前,需要清理上次编译失败残留的文件
make distclean && make
# 可执行文件
# 在src目录下可以看到,绿色的是可执行命令。安装完成后,可执行命令会自动拷贝到/use/local/bin 路径下,因此不用指定目录就能直接执行命令
redis-server--->redis服务器
redis-cli--->redis命令行客户端
redis-benchmark--->redis性能测试工具
redis-check-aof--->aof文件修复工具
redis-check-dump--->rdb文件检查工具
redis-sentinel--->sentinel服务器,哨兵
2.2 卸载redis
# 1、查看redis进程;
ps aux|grep redis
# 2、kill掉进程;
kill 进程id
# 3、进入到redis目录
cd /usr/local/
# 4、删除redis对应的文件
rm -f /usr/local/redis/bin/redis*
rm -f /usr/local/bin/redis*
# 5、删除对应的文件
rm -rf redis
2.3 三种启动方式
2.3.1 最简启动
# 最简启动
./src/redis-server
ps -ef|grep redis #查看进程
netstat -antpl|grep redis #查看端口
redis-cli -h ip -p port ping #命令查看
2.3.2 动态参数启动
# 指定一些配置启动
./src/redis-serve --port 6380 #启动,监听6380端口
2.3.3 配置文件启动
# 配置文件启动
# /redis目录下有一个redis.conf文件,可以查看默认配置。
# 在/redis目录下创建/conf目录,cd到conf/ ,创建redis_6379.conf文件,写入常用参数配置(也可以cp redis.conf在它基础上修改):
daemonize yes # 是否以守护进程启动,后台启动
pidfile /var/run/redis.pid # 进程号的位置
port 6379 # 端口号
dir "/opt/zl/redis/data" # 工作目录,数据目录,手动创建/data
logfile “6379.log” # 日志文件名字
#bind 127.0.0.1 # 不支持远程连接,只能本机连接
bind 0.0.0.0
protected-mode no # 关闭保护模式
requirepass 123456 # 如果用docker启动redis,密码写在环境变量中,配置文件os.environ.get从环境变量中获取
# 以redis_6379.conf文件为启动配置文件,而不是默认的redis.conf
./src/redis-server conf/redis_6379.conf
# 查看是否启动
ps aux |grep redis
2.4 Redis 的日志级别有以下四种:
1. debug:会打印出很多信息,适用于开发和测试阶段。
2. verbose(冗长的):包含很多不太有用的信息,但比debug简化一些。
3. notice:适用于生产模式。
4. warning : 警告信息。
Redis 默认设置为 verbose,开发测试阶段可以用 debug,生产模式一般选用 notice。
2.5 端口安全
Redis 默认监听*:6379
,如果当前的服务器主机有外网地址,那么 Redis 的服务将会直接暴露在公网上,别有用心的人使用适当的探测工具就可以对 IP 地址进行端口扫描,从而威胁您的系统安全。
如果 Redis 的服务地址一旦可以被外网直接访问,其内部数据就彻底丧失了安全性。黑客们可以通过 Redis 执行 Lua 脚本拿到服务器权限,然后清空您的 Redis 数据库。因此务必在 Redis 的配置文件中绑定要监听的 IP 地址,避免类似的情况发生。如下所示:
# bind 0.0.0.0 当前的服务器主机有外网地址,所有ip地址都能访问
bind 193.168.1.1 # 绑定你指定的外网ip地址,如运维的ip,只有他可以远程连接redis服务
不仅如此,还可以增加 Redis 的密码访问限制,客户端必须使用 auth 命令传入正确的密码才可以访问 Redis。
requirepass yourspassword
这样即使地址暴露出去了,普通黑客也无法对 Redis 服务器进行任何指令操作。
密码配置也会影响到主从复制。要求从机必须配置与主服务相同的密码才可以进行主从复制。
masterauth yourspassword
2.6 客户端连接(命令)
本地cmd本地客户端 或 Redis可视化工具远程连接服务器 redis server
,需要服务器关闭防火墙
操作 | 指令 | 备注 |
---|---|---|
查看防火墙状态 | systemctl status firewalld / firewall-cmd --state | |
暂时关闭防火墙 | systemctl stop firewalld | |
永久关闭防火墙(禁用开机自启) | systemctl disable firewalld | 下次启动,才生效 |
暂时开启防火墙 | systemctl start firewalld | |
永久开启防火墙(启用开机自启) | systemctl enable firewalld | 下次启动,才生效 |
开放指定端口 | firewall-cmd --zone=public --add-port=8080/tcp --permanent | 需要重新加载生效 |
关闭指定端口 | firewall-cmd --zone=public --remove-port=8080/tcp --permanent | 需要重新加载生效 |
立即生效(重新加载) | firewall-cmd --reload | |
查看开放端口 | firewall-cmd --zone=public --list-ports |
###客户端连接###
redis-cli -h 地址 -p 端口号
redis-cli # 默认连接本地6379
ping #返回PONG
# 关闭redis-server
kill -9 进程id号
redis-cli shutdown
## 有密码的情况可以两种登陆方式
# 方式一
redis-cli -h 127.0.0.1 -p 6379 -a 123456
# 方式二 先登陆,再通过auth输入密码
redis-cli -h 127.0.0.1 -p 6379
auth 123456
## redis-cli进入,查看和更改redis的配置信息(直接在交互式命令行下修改)
## 正因为可以修改配置信息,redis入侵,就是把公钥写入配置文件,入侵者机器上配置私钥就能远程连入你的redis
CONFIG GET * # 查看所有配置信息
CONFIG GET 配置名称 # 查看某项配置信息
CONFIG SET 配置项名称 配置项参数值 # 更改配置项信息
CONFIG SET maxmemory 128M # 设置最大使用的内存,0表示无限制,生产环境不会让redis占用所有内存,一般会进行配置
CONFIG set requirepass 123456 # 设置密码
CONFIG REWRITE # 把修改保存到配置文件
2.7 redis返回值
####redis返回值
状态回复:ping---》PONG
错误回复:hget hello field ---》(error)WRONGTYPE Operation against
整数回复:incr hello---》(integer) 1
字符串回复:get hello---》"world"
多行字符串回复:mget hello foo---》"world" "bar"
2.8 配置项说明
配置项 | 参数 | 说明 |
---|---|---|
daemonize | no/yes | 默认为 no,表示 Redis 不是以守护进程的方式运行,通过修改为 yes 启用守护进程。 |
pidfile | 文件路径 | 当 Redis 以守护进程方式运行时,会把进程 pid 写入自定义的文件中。 |
port | 6379 | 指定 Redis 监听端口,默认端口为 6379。 |
bind | 127.0.0.1 | 绑定的主机地址。 |
timeout | 0 | 客户端闲置多长秒后关闭连接,若指定为 0 ,表示不启用该功能。 |
loglevel | notice | 指定日志记录级别,支持四个级别:debug、verbose、notice、warning,默认为 notice。 |
logfile | stdout | 日志记录方式,默认为标准输出。 |
databases | 16 | 设置数据库的数量(0-15个)共16个,Redis 默认选择的是 0 库,可以使用 SELECT 命令来选择使用哪个数据库储存数据。 |
save[seconds] [changes] |
可以同时配置三种模式: save 900 1 save 300 10 save 60 10000 |
表示在规定的时间内,执行了规定次数的写入或修改操作,Redis 就会将数据同步到指定的磁盘文件中。比如 900s 内做了一次更改,Redis 就会自动执行数据同步。 |
rdbcompression | yes/no | 当数据存储至本地数据库时是否要压缩数据,默认为 yes。 |
dbfilename | dump.rdb | 指定本地存储数据库的文件名,默认为 dump.rdb。 |
dir | ./ | 指定本地数据库存放目录。 |
slaveof <masterip> <masterport> |
主从复制配置选项 | 当本机为 slave 服务时,设置 master 服务的 IP 地址及端口,在 Redis 启动时,它会自动与 master 主机进行数据同步。 |
requirepass | foobared 默认关闭 | 密码配置项,默认关闭,用于设置 Redis 连接密码。如果配置了连接密码,客户端连接 Redis 时需要通过<password> 密码认证。 |
maxmemory <bytes> |
最大内存限制配置项 | 指定 Redis 最大内存限制,Redis 在启动时会把数据加载到内存中,达到最大内存后,Redis 会尝试清除已到期或即将到期的 Key,当此方法处理 后,若仍然到达最大内存设置,将无法再进行写入操作,但可以进行读取操作。 |
appendfilename | appendonly.aof | 指定 AOF 持久化时保存数据的文件名,默认为 appendonly.aof。 |
glueoutputbuf | yes | 设置向客户端应答时,是否把较小的包合并为一个包发送,默认开启状态。 |
3 Redis可视化工具
Redis 存在许多第三方可视化工具,可以让您更加直观形象地的操作 Redis 数据库,常见的 Redis GUI 工具有 Redis Desktop Manager(又称 RDM)、Another Redis DeskTop Manager 及 FastoRedis。
Redis Desktop Manager(简称 RDM)是一个跨平台 Redis 桌面管理软件(客户端软件),支持 Windows、Liunx 和 Mac。该工具为用户提供了易于使用的 Redis 可视化操作,同时支持 SSL/TLS加密,以及 SSH 隧道技术。它托管在 GitHub 上,下载地址:点击前往。