GavinZhera 2020-01-04
官网地址https://redis.io/
Redis和 Memcached 是非关系型数据库,也称为NoSQL数据库 ,MySQL 、 Mariadb 、 SQL S erver 、 PostgreSQL 、Oracle 数据库 属于关系型数据 RDBMS, Relational Database Management System
Redis (Remote Dictionary S erver 在 2009 年 发布 开发者 Salvatore Sanfilippo 是意大利 开发者他本想为自己 的 公司开发一个用于替换 MySQL 的产品 Redis ,但是没有想到 他把 Redis 开源后大受 欢迎,短短几年,
Redis 就 有了很大的用户群体,目前 国内外 使用的公司有 知乎网 、新浪微博、 GitHub 等;
redis 是 一个 开源 的、 遵循 BSD 协议 的、 基于 内存 的 而且目前 比较 流行的 键值数据库 key value database是 一个非关系型数据库 redis 提供 将内存 通过 网络远程共享的一种服务 ,
提供 类似功能的还 有memcache,但 相比 memcache redis 还提供了 易 扩展 、高性能 、 具备 数据持久性 等功能。
Redis 在高并发、低延迟环境要求比较高的环境使用量非常 广泛, 目前 redis 在 DB E ngin e 月 排行榜https://db engines.com/en/ranking 中一直比较靠前,而且 一直 是键值型存储类的首位 。
1、支持数据的持久化:可以将内存中的数据保持在磁盘中,重启redis 服务或者服务器之后 可以从 备份文件中 恢复 数据到内存继续使用 。
2、支持更 多 的数据类型:支持 string 字符串 、hash( 哈希 数据 、 list( 列表 、 set( 集合 、 ze t( 有序 集合)。
3、支持数据的备份:可以实现 类似于 数据的 master slave 模式的数据备份,另外 也支持使用快照 +AOF 。
4、支持更大的 value 数据 memcache 单个 key value 最大只支持 1MB ,而 redis 最大 支持 512MB 。
5、Redis 是单线程, 而 memcache 是多线程, 所以 单机 情况下没有 memcache 并发高, 但 redis 支持分布式 集群 以 实现更高的并发 单 Redis 实例可以实现数万并发。
6、支持集群横向扩展:基于 redis cluster 的 横向扩展,可以 实现 分布式集群,大幅提升性能和数据安全性。
7、都是基于 C 语言 开发。
1、Session共享 :常见于 web 集群中的 Tomcat 或者 PHP 中多 web 服务器 session 共享
2、消息队列ELK 的日志 缓存、 部分 业务的订阅发布 系统
3、计数器访问排行榜 、商品 浏览数 等 和次数相关的 数值 统计 场景
4、缓存数据 查询、 电商 网站商品 信息 、 新闻内容
官方下载地址: http://download.redis.io/releases/
在centos 系统 上 需要安装 epel 源。
[]#yum install redis -y []#systemctl start redis
主要分为运维人员的连接和程序的连接
本机非密码连接
# redis-cli
跨主机非密码连接:
# redis-cli -h HOSTNAME/IP -p PORT
跨主机密码连接
# redis-cli -h HOSTNAME/IP -p PORT -a PASSWORD
bind 0.0.0.0 监听地址可以用空格隔开后多个监听IP protected-mode yes #redis3.2之后加入的新特性在没有设置 bind IP和密码的时候只允许访问127.0.0.1 :6379 port 6379 监听端口 tcp-backlog 511 # 三次握手的 时候 server 端收到client ack确认号之后的队列值,默认不需要改。 timeout 0 客户端和Redis服务端的连接超时时间,默认是0,表示永不超时。 tcp-keepalive 300 #tcp会话保持时间 daemonize yes 认情况下redis不是作为守护进程运行的,如果你想让它在后台运行,你就把它改成yes, 当redis作为守护进程运行的时候,它会写一个pid到/var/run/redis.pid文件里面,需要改为yes,进行后端运行。 supervised systemd #和操作系统相关参数可以设置通过upstart和systemd管理Redis守护进程centos7以后都使用systemd pidfile /var/run/redis_6379.pid #pid文件路径 loglevel notice 日志级别,默认即可
以源码编译安装的配置文件为例:配置文件在/apps/redis/目录下,此时我们要配置其他目录文件: 源码编译的redis服务,需要启动redis服务:redis-server /apps/redis/etc/redis.conf
源码编译步骤详见链接:https://www.cnblogs.com/struggle-1216/p/12116664.html
1、监听本地IP地址和回环网卡IP地址,允许远程访问redis服务
[~]#vim /apps/redis/etc/redis.conf bind 127.0.0.1 192.168.37.17 监听本地IP地址和回环地址 protected-mode yes 有此模式就必须监听本地IP地址,否则无法远程连接
2、 创建数据、日志及pid目录,将不同文件存放在不同的目录下
[~]#mkdir /apps/redis/{data,logs,run}
修改redis配置文件,将pid文件指定在新建的目录下,如果想开启多个redis,就新建多个pid的端口,只需要修改端口号即可:
如:pidfile /apps/redis/run/redis_6379.pid ,想再开启一个redis,就将端口号改为一个没人用的端口号:pidfile /apps/redis/run/redis_6378.pid
[~]#vim /apps/redis/etc/redis.conf pidfile /apps/redis/run/redis_6379.pid logfile "/apps/redis/logs/redis_6379.log"
此时启动redis服务,就会发现生成了log和pid文件,如果重新启动redis,需要将配置文件用kill -9 进程号 命令杀死进程号才行。
[]#redis-server /apps/redis/etc/redis.conf []#ll /apps/redis/run/redis_6379.pid -rw-r--r-- 1 root root 5 Dec 29 23:21 /apps/redis/run/redis_6379.pid []#ll /apps/redis/logs/redis_6379.log -rw-r--r-- 1 root root 1692 Dec 29 23:21 /apps/redis/logs/redis_6379.log [~]#ll /apps/redis/data/dump_6379.rdb -rw-r--r-- 1 root root 104 Dec 30 09:33 /apps/redis/data/dump_6379.rdb
databases 16 设置db库数量,默认16个库 always-show-logo yes # 在启动 redis 时是否 显示 log save 900 1 # 在900 秒内有一个键内容发生更改触发快照机制 save 300 10 在300 秒内有10个键内容发生更改触发快照机制 save 60 10000 stop-writes-on-bgsave-error no 快照出错时,是否禁止redis写入操作 rdbcompression yes 持久化到 RDB 文件时,是否压缩,"yes" 为压缩,“no” 则反之 rdbchecksum yes 是否开启RC64校验,默认是开启 dbfilename dump.rdb 快照文件名 dir ./ 快照文件保存路径
1、当我们redis快照备份失败时,如果是yes就无法对redis进行写内容,如果改为no就无法写内容,很重要,改为no。
vim /apps/redis/etc/redis.conf
指定快照存放目录及快照名称:
1、replica-serve-stale-data yes # 当从库同主库失去连接或者复制正在进行,从机库有两种运行方式:
1) 如果 replica serve stale data 设置为 yes( 默认设置 )),从库会继续响应客户端的 读 请求。
2) 如果 replicaserve stale data 设置为 no ,除 去指定的命令之外的任何请求都会返回一个错误 "SYNC with master in progress" 。
2、replica-read-only yes # 是否设置从库只读
3、repl-diskless-sync no 是否使用 socket 方式复制数据, 目前 redis 复制提供两种方式, disk 和 socket 如果新的 slave 连上来或者重连的 slave 无法部分同步,就会执行全量同步, master 会生成 rdb 文件,有2 种方式:
1)disk 方式是 master 创建一个新的进程把 rdb 文件保存到磁盘,再把磁盘上的 rdb 文件传递给 slave socket 是 master 创建一个新的进程,
直接把 rdb 文件以 socket 的方式发给 slave disk 方式的时候,当一个 rdb 保存的过程中,多个 slave 都能共享这个 rdb 文件。
2)socket 的方式就是 一个个 slave顺序复制, 只有在磁盘速度缓慢但是 网络相对较 快的情况下才使用 socket 方式,否则使用默认的disk方式。
4、repl-diskless-sync-delay 30 #diskless 复制的延迟时间, 设置 0为关闭 一旦复制开始还没有结束之前,master 节点不会再接收新 slave 的复制请求, 直到下一次开始。
5、repl-ping-slave-period 10 #slave 根据 master 指定 的时间进行周期性的 PING 监测
6、repl-timeout 60 复制链接超时时间,需要大于 repl ping slave period 否则会 经常 报超时
7、repl-disable-tcp-nodelay no 在 socket 模式下是否在slave 套接字发送 SYNC之后禁用TCP_NODELAY
如果你选择“yes Redis 将使用更少的 TCP 包和带宽来向 slaves 发送数据。但是这 将使数据传输到 slave上有延迟, Linux 内核的默认配置会达到 40毫秒,
如果你选择了 "no" 数据传输到 salve 的延迟将会减少但要使用更多的带宽。
8、repl-backlog-size 1mb 复制缓冲区大小, 只有在 slave 连接之后 才 分配内存 。
9、repl-backlog-ttl 3600 多次时间 master 没有 slave 连接,就清空 backlog 缓冲区 。
10、replica-priority 100 当 master 不可用,Sentinel 会根据 slave 的优先级选举一个 master 。最低的优先级的 slave ,当选 master 。而配置成 0,永远不会被选举。
11、requirepass foobared 设置 redis 连接密码,配置了redis,必须设置密码,防止被入侵之后被黑客搞破坏。
12、rename-command 重命名 一些高 危命令
13、maxclients 10000 最大连接客户端
14、maxmemory 最大内存 单位为 bytes 字节 8G 内存 的 计算方式 8 G ))*1024 ( MB)*1024 ( KB)*1024 Kbyte,用bc命令可以计算;
需要注意的是 slave 的输出缓冲区是不计算在 maxmemory 内 ,此最大内存应该最大占计算机内存的一半,留一部分内存用来做快照使用。
15、appendonly no #是否开启 AOF 日志 记录 默认 red is 使用的是 rdb 方式持久化,这种方式在许多应用中已经足够用了。但是 redis 如果中途宕机,会导致可能有几分钟的数据丢失,
根据 save 来策略进行持久化,Append Only File 是另一种持久化方式,可以提供更好的持久化特性。 Redis 会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时 Redis 都会先把这个文件的数据读入内存里,先忽略 RDB 文件。
16、appendfilename "appendonly.aof" #AOF文件名
17、appendfsync everysec #aof 持久化策略的配置 no 表示不执行 fsync 由操作系统保证数据同步到磁盘 ,always 表示每次写入都执行 fsync ,以保证数据同步到磁盘 ,everysec 表示每秒执行一次 fsync ,
可能会导致丢失这 1s 数据。
18、no-appendfsync-on-rewrite no(推荐为yes) 在 aof rewrite 期间 是否对 aof 新记录的 append 暂缓使用文件同步策略 主要考虑磁盘 IO 开支和请求阻塞时间。默认为 no, 表示不暂缓新的 aof 记录仍然会被立即同步
Linux 的默认fsync策略是30 秒,如果为 yes 可能丢失 30 秒数据 ,但由于yes性能较好,而且会避免出现阻塞, 因此比较推荐 。
19、auto-aof-rewrite-percentage 100 # 当 Aof log 增长超过指定 百分 比例时,重写 logfile设置为0表示不自动重写 Aof 日志,重写是为了使 aof 体积保持最小,而确保保存最完整的数据。
20、auto-aof-rewrite -min size 64mb # 触发 aof rewrite 的最小文件大小
21、aof-load-truncated yes 是否加载 由于 其他原因 导致 的 末尾 异常 的 AOF文件主进程被 kill/ 断电等
当文件存在问题时,可以针对不同的文件进行修复操作:可以修复aof和rdb后缀的文件。
打开此功能,就会在/apps/redis/data/目录下生成appendonly.aof后缀的文件。
22、aof-use-rdb-preamble yes #r edis4.0 新增 RDB AOF 混合持久化格式,在开启了这个功能之后, AOF 重写产生的文件将同时包含 RDB 格式的内容和 AOF 格式的内容,其中 RDB 格式的内容用于记录已有的数
据,而 AOF 格式的内存则用于记录最近发生了变化的数据,这样 Redis 就可以同时兼有 RDB 持久化和AOF 持久化的优点(既能够快速地生成重写文件,也能够在出现问题时,快速地载入数据)。
23、luatime-limit 5000 #lua 脚本 的 最大 执行时间单位为毫秒
24、cluster-enabled yes 是否开启集群模式,默认是单机模式
25、cluster-config-file-nodes 6379.conf 由 node节点自动生成的集群配置 文件
26、cluster-node-timeout 15000 集群中node节点连接 超时时间
27、cluster-replica-validity-factor 10 在 执行故障转移的时候可能有些节点和 master 断开一段时间数据比较旧 这些 节点就 不适用于选举为 master 超过这个时间的就不会被进行故障转移
28、cluster-migration-barrier 1 一个主节点拥有的至少正常工作的从节点 即如果主节点的 slave 节点故障后, 会 将多余的从节点 分配 到当前主节点 成为 其 新的 从节点。
29、cluster-require-full-coverage no 集群 槽位覆盖 如果 一个 主库宕机 且 没有备库就会出现集群槽位不全 那么 yes 情况下 redis 集群 槽位 验证不全就不再对外提供服务,
而 no 则可以继续使用但是会出现查询数据查不到的情况 (因为有数据丢失) 。
#Slow log 是 Redis 用来记录查询执行时间的日志系统 slow log 保存在内存里面,读写速度非常快,因此你可以放心地使用它,不必担心因为开启slow log而损害 Redis 的速度。
30、slowlog-log-slower than 10000 以微秒 为单位 的 慢日志记录, 为 负数会禁用慢日志,为0会记录 每个命令操作。
31、slowlog-max-len 128 # 记录多少条慢日志 保存在 队列,超出后会删除 最早 的,以此滚动删除
测试效果:
127.0.0.1:6379> slowlog len (integer) 14 127.0.0.1:6379> slowlog get 1) 1) (integer) 14 2) (integer) 1544690617 3) (integer) 4 4) 1) "slowlog" 127.0.0.1:6379> SLOWLOG reset
redis虽然是一个内存级别的缓存程序,即 redis 是使用内存进行数据的缓存的,但是其可以将内存的数据按照一定的策略保存到硬盘上,
从而实现数据持久保存的目的, redis 支持两种不同方式的数据持久化保存机制,分别是RDB和AOF:
1、RDB基于时间的快照, 只保留 当前最新的一次快照, 特点 是执行速度比较快,缺点是可能会丢失从上次快照到当 前 快照未完成之间的数据。
2、RDB实现的具体过程 R edis 从主进程先 fork 出一个子进程,使用写时复制机制,子进程将内存的数据保存为一个临时文件,
比如 dump.rdb.temp ,当数据保存完成之后再将上一次保存的 RDB 文件替换掉,然后关闭子进程,这样可以保存每一次做 RDB 快照的时候保存的数据都是完整的,
因为直接替换 RDB文件的时候可能会出现突然断电等问题而导致 RDB 文件还没有保存完整就突然关 机停止保存而导致
数据丢失的情况,可以手动将每次生成的 RDB 文件进程备份,这样可以最大化保存历史数据。
RDB 模式的优缺点:
优点:
1、RDB 快照 保存了某个时间点的数据,可以通过脚本执行 bgsave 非 阻塞 或者 save( 阻塞 命令自定义时
间点北备份,可以保留多个备份,当出现问题可以恢复到不同时间点的版本。
2、可以最大化 o 的性能,因为父进程在保存 RDB 文件的时候唯一要做的是 fork 出一个子进程,然后的
操作都会有这个子进程操作,父进程无需任何的 IO 操作
RDB在大量数据比如几个G的数据,恢复的速度比AOF的快。
缺点
1、不能时时的保存数据,会丢失自上一次执行 RDB 备份到当前的内存数据
2、数据量非常大的时候,从父进程 fork 的时候需要一点时间,可能是毫秒或者秒
1、AOF:按照 操作顺序依次 将 操作 添加 到 指定 的日志文件当中,特点是数据安全性相对较高,缺点是即使有些操作是重复的也会全部记录。
2、AOF和 RDB一样使用了写时复制机制, AOF 默认为每秒钟 fsync 一次,即将执行的命令保存到 AOF 文件当中,这样即使 redis 服务器发生故障的话顶多也就丢失 1 秒钟之内的数据,也可以 设置不同的 fsync
策略,或者设置每次执行命令的时候执行 fsync fsync 会在后台执行线程,所以主线程可以继续处理用户的正常请求而不受到写入 AOF 文件的 IO 影响。
AOF 模式优缺点
1、AOF的文件大小要大于 RDB 格式的文件
2、根据所使用的fsync 策略 (fsync 是同步内存中 redis 所有已经修改的文件到存储设备 )),默认是appendfsync everysec 即每秒执行一次 fsync
字符串是所有编程语言中 最常见 的和最常 用的数据类型,而且也是 redis 最基本的数据类型之一,而且redis中所有的 key 的类型都是字符串。
127.0.0.1:6379> set key1 value1 OK 127.0.0.1:6379> get key1 "value1" 127.0.0.1:6379> TYPE key1 string 127.0.0.1:6379> SET name2 jack2 ex 3 设置自动过期时间 OK
127.0.0.1:6379> get key1 "value1"
127.0.0.1:637 9> DEL key1 (integer) 1
127.0.0.1:6379> MSET key1 value1 key2 value2 OK
127.0.0.1:6379> MSET key1 value1 key2 value2 OK
127.0.0.1:6379> APPEND key1 append (integer) 12 127.0.0.1:6379> get key1 "value1a ppend"
127.0.0.1:6379> set num 10 OK 127.0.0.1:6379> INCR num (integer) 11 127.0.0.1:6379> get num "11"
127.0.0.1:6379> set num 10 OK 127.0.0.1:6379> DECR num (integer) 9 127.0.0.1:6379> get num "9"
127.0. 0.1:6379> STRLEN key1 (integer) 12
列表是一个双向可读写的管道 其头部是左侧尾部是右侧,一个列表最多可以包含 2^32 1 个元素即
4294967295 个 元素。
127.0.0.1:6379> LPUSH list1 jack tom jhon (integer) 3 127.0.0.1:6379> TYPE list1 list
消息队列 主要 分为两种,分别是 生产者 消费者模式和发布者订阅者模式,这两种模式 Redis 都 支持
在生产者消费者 Producer/Consumer 模式下, 上层 应用 接收到 的外部请求 后 开始处理 其 当前步骤的操作,
在执行完成后将 已经 完成的操作发送至 指定的频道 channel 当中 ,并 由其 下层的应用监听该频道并继续下一步的操作, 如果 其处理完成 后 没有下一步的操作就直接返回 数据 给外部请求,如果还有
下一步的操作就 再将任务发布 到另外一个频道, 由 另外一个消费者 继续 监听和处理。
生产者 消费者模式下, 多个 消费者同时监听一个队里,但是 一个 消息只能被 最先抢到消息的消费者消费,即消息任务是一次性 读取 和处理,
此模式在分布式业务 架构 中非常常用 比较 常用 的软件还有RabbitMQ、 K afka 、 RocketMQ 、 ActiveMQ 等。
队列当中的消息由不同的生产者写入也会有不同的消费者取出进行消费处理,但是一个消息一定是只能被取出一次也就是被消费一次。
在 发布者订阅者模式下,发布者将消息发布到指定的 channel 里面 凡是 监听该 channel 的消费者都会 收到 同样的一份消息,
这种模式类 似于是收音机模式,即凡是收听某个频道的听众 都会 收到主持人发布的 相同 的消息 内容。
此模式 常用语 群聊天 、 群通知、群 公告 等场景。
Subscriber :订阅者 Publisher 发布者 Channel 频道
config命令用于查看当前redis配置、以及不重启更改redis配置等,修改的都是临时的配置,重启redis服务就会失效,最终还是需要修改到配置文件中。
改为最大物理机内存的一半大小
127.0.0.1:6379> CONFIG set maxmemory 8589934592 OK 127.0.0.1:6379> CONFIG get maxmemory 1) "maxmemory" 2) "8589934592"
127.0.0.1:6379> CONFIG SET requirepass 123456 OK
获取当前配置内容:
info:显示当前redis运行状态
SELECT:切换数据库
DBSIZE:返回当前库下的所有key数量
keys:查看当前库下的所有key
BGSAVE:手动在后台执行RDB 持久化 操作
FLUSHDB:强制清空当前库中的所有key
FLUSHALL:强制清空当前 redis 服务器所有 数据 库 中的所有 key 即删除所有数据