1.安装
1 | 1. 下载 |
2.Redis 注意点
REmote DIctionary Server(Redis)
Redis 常被称作是一款 key-value 内 存存储系统或者内存数据库,同时由于它支持丰富的数据结构,又被称为一种数据结构服务 器(Data Structure Server)。
因为值(value)可以是字符串(String),哈希(Map),列表(list), 集合(sets)和有序集合(sorted sets)等类型。
与其他 key-value 缓存产品比较独有特点
1、Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载 进行使用。
2、Redis 不仅仅支持简单的 key-value 类型的数据,同时还提供 list,set,zset,hash 等数据 结构的存储。
3、Redis 支持数据的备份,即 master-slave 模式的数据备份。
Redis优势
1、性能极高:Redis 能读的速度是 110000 次/s,写的速度是 81000 次/s 。
2、丰富的数据类型:Redis 支持二进制案例的 String, List, Hash, Set 及 Sorted Set 数据类型操 作。
3、原子操作:Redis 的所有操作都是原子性的,同时 Redis 还支持对几个操作全并后的原子 性执行。
4、丰富的特性:Redis 还支持 Publish/Subscribe,通知 key 过期,支持高可用集群等等特性。
5、数据持久化机制
持久化机制有两种:
1、RDB 方式:定期将内存数据 dump 到磁盘
2、AOF(append only file)持久化机制:用记日志的方式记录每一条数据更新操作,一旦 出现灾难事件,可以通过日志重放来恢复整个数据库
Redis适用场景
1、TopN 需求:取最新的 n 个数据,如读取作家博客最新的 50 篇文章,通过 List 实现按时 间排序的数据的高效获取
2、排行榜应用:以特定条件为排序标准,将其设成 sorted set 的 score,进而实现高效获取
3、需要精准设定过期时间的应用:把 sorted set 的 score 值设置成过期时间的时间戳,那么 就可以简单地通过过期时间排序,定时清除过期数据了
4、计数器应用:Redis 的命令都是原子性的,可以轻松地利用 INCR,DECR 命令来构建计数 器系统。
5、去除大量数据中的重复数据:将数据放入 set 中,就能实现对重复数据的排除
6、构建队列系统:使用 list 可以构建队列系统,使用 sorted set 甚至可以构建有优先级的队 列系统。
7、实时系统,反垃圾系统:通过上面说到的 set 功能,你可以知道一个终端用户是否进行 了某个操作,可以找到其操作的集合并进行分析统计对比等。
8、Publish/SubScribe 构建实时消息系统
9、缓存(会话,商品列表,评论列表,经常查询的数据等)
3.Redis基本操作
3.1 字符串
3.1.1 String shell
String 类型是二进制安全的。意思是 Redis 的 String 可以包含任何数据。比如 jpg 图片或者序 列化的对象 。
String 类型是 Redis 最基本的数据类型,一个键最大能存储 512MB。
1 | 如果给定了 NX 选项,那么命令仅在键 key 不存在的情况下,才进行设置操作;如果键 key 已经存 在,那么 SET ... NX 命令不做动作(不会覆盖旧值)。===> not exist |
3.1.2 String 使用案例
3.2 list
3.2.1 List常用操作示例
1 | # 从头部(左边left)插入数据 |
3.2.2 list应用案例
3.3 Set 集合
3.3.1 Set 的 shell 使用
Redis 的 Set 是 string 类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
1 | # 插入 set 数据 & 查询 set 数据 |
3.3.2 set 使用案例
3.4 ZSet–有序集合
Zset 和 Set 一样也是 String 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。Redis 正是通过分数来为集合中的成员 进行从小到大的排序。
Zset 的成员是唯一的,但分数(score)却可以重复。
3.4.1 zset shell操作
1 | # 往 redis 库中插入一条 sortedset 数据 |
3.4.2 案例
Lol 盒子英雄数据排行榜:
1、在 redis 中需要一个榜单所对应的 sortedset 数据
2、玩家每选择一个英雄打一场游戏,就对 sortedset 数据的相应的英雄分数+1
3、Lol 盒子上查看榜单时,就调用 zrange 来看榜单中的排序结果
3.5 散列 – Hash– 哈希表
一个散列由多个域值对(field-value pair)组成,散列的键和值都可以是文字、整数、浮点数或者二 进制数据。
同一个散列里面的各个域必 须是独一无二的,但不同域的 值可以是重复的。
尽量使用散列键而不是字符串键来储存键值对数据,因为散列键管理方便、能够避免键名冲突、并且还能够节约内存。
Redis Hash 是一个键值对集合。
Redis Hash 类型可以看成具有 String Key 和 String Value 的 map 容器
Redis Hash 是一个 String 类型的 field 和 value 的映射表,Hash 特别适合用于存储对象。
3.5.1 shell 操作
1 | # 散列(hash) |
3.5.2 案例: 实现购物车
需求点:
加入购物车
查询购物车
修改购物车
清空购物车
3.6 键值相关命令
shell简单实用
1 | # 查询所有 cart 开头的 key |
3.7 服务器相关命令
简单测试
1 | # 选择数据库 (redis 默认数据库编号 0-15) |
3.8 pom 文件
1 | <?xml version="1.0" encoding="UTF-8"?> |
5. Redis高可用
在 Redis 中,实现高可用的技术主要包括持久化、复制、哨兵和集群
第一:持久化
持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份, 即将数据存储在硬盘,保证数据不会因进程退出而丢失。
第二:主从复制
复制是高可用 Redis 的基础,哨兵和集群都是在复制基础上实现高可用的。复制主要实现 了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复。缺陷:故障恢复无 法自动化;写操作无法负载均衡;存储能力受到单机的限制。
第三:哨兵
哨兵在复制的基础上,哨兵实现了自动化的故障恢复。缺陷:写操作无法负载均衡;存 储能力受到单机的限制。
第四:集群
通过集群,Redis 解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现 了较为完善的高可用方案。
5.1 Redis 持久化
Redis 持久化分为 RDB 持久化和 AOF 持久化:
RDB:将当前数据保存到硬盘
AOF:将每次执行的写命令保存到硬盘(类似于 MySQL 的 binlog)
由于 AOF 持久化的实时性更好,即当进程意外退出时丢失的数据更少,因此 AOF 是目前主 流的持久化方式,不过 RDB 持久化仍然有其用武之地。
5.1.1 RDB
手动方式
- save
- save 命令会阻塞 Redis 服务器进程,直到 RDB 文件创建完毕为止
- bgsave
- bgsave 命令会创建一个子进程,由子进程来负责创建 RDB 文件,父进程(即 Redis 主 进程)则继续处理请求。
- save
自动触发
在配置文件
redis.conf
中配置save m n
save 900 1
save 300 10
save 60 10000
#900 秒内如果超过 1 个 key 被修改,则发起快照保存
#300 秒内容如超过 10 个 key 被修改,则发起快照保存
#60 秒内容如超过 10000 个 key 被修改,则发起快照保存
5.1.2 AOF 方式
AOF 比快照方式有更好的持久化性,是由于在使用 AOF 持久化方式时,Redis 会将每一个收 到的写命令都通过 write 函数追加到文件中(默认是 appendonly.aof)。当 Redis 重启时会通过 重新执行文件中保存的写命令来在内存中重建整个数据库的内容。
我们可以通过配置文件告诉 redis 我们想要 通过 fsync 函数强制 os 写入到磁盘的时机。
三种方式如下(默认是:每秒 fsync 一次):
5.2 Redis 主从复制
Redis 主从复制配置和使用都非常简单。通过主从复制可以允许多个 slave server 拥有和 master server 相同的数据库副本。下面是关于
redis 主从复制的一些特点:
1、master 可以有多个 slave
2、除了多个 slave 连到相同的 master 外,slave 也可以连接其他 slave 形成图状结构
3、主从复制不会阻塞 master。也就是说当一个或多个 slave 与 master 进行初次同步数据时, master 可以继续处理 client 发来的请求。相反 slave 在初次同步数据时则会阻塞不能处理 client 的请求。
4、主从复制可以用来提高系统的可伸缩性,我们可以用多个 slave 专门用于 client 的读请求, 比如 sort 操作可以使用 slave 来处理。也可以用来做简单的数据冗余
5、可以在 master 禁用数据持久化,只需要注释掉 master 配置文件中的所有 save 配置,然 后只在 slave 上配置数据持久化。
主从复制的过程
当设置好 slave 服务器后,slave 会建立和 master 的连接,然后发送 sync 命令。
无论是第一 次同步建立的连接还是连接断开后的重新连接,master 都会启动(fork)一个后台进程,将数 据库快照保存到文件中(fork 一个进程入内在也被复制了,即内存会是原来的两倍),同时 master 主进程会开始收集新的写命令并缓存起来。
后台进程完成写文件后,master 就发送 文件给 slave,slave 将文件保存到磁盘上,然后加载到内存恢复数据库快照到 slave 上。
接着 master 就会把缓存的命令转发给 slave。
而且后续 master 收到的写命令都会通过开始建立 的连接发送给 slave。
从 master 到 slave 的同步数据的命令和从 client 发送的命令使用相同的 协议格式。
当 master 和 slave 的连接断开时 slave 可以自动重新建立连接。
如果 master 同时 收到多个 slave 发来的同步连接命令,只会使用启动一个进程来写数据库镜像,然后发送给 所有 slave。
配置 slave 服务器只需要在配置文件中加入如下配置:
slaveof cs1 6379 #指定 master 的 ip 和端口
注意:主节点不用加!!!
5.3 Redis 集群
1 | 1. 拿到本机的 ip |
5.4 开源 redis GUI 管理界面
推荐使用的可视化工具为TreeSoft
,其官方网站地址为:TreeSoft地址,你可以在其官网上下载相应的软件,然后解压完有相应的使用说明文件,详细如下:
默认用户名:treesoft,密码:treesoft ,用户:admin,密码:treesoft
由于其内嵌了Tomcat
,很是不方便,我想使用自己部署的Tomcat
来运行此服务,则可以将webapps
目录下treenms
项目拷贝之后放到我们自己Tomcat
的webapps
目录,然后浏览器输入http://cs1:8080/treenms/treesoft 即可
6.Redis.conf配置文件参数说明
redis.conf 配置项说明如下:
1、Redis 默认不是以守护进程的方式运行,可以通过该配置项修改,使用 yes 启用守护进 程
daemonize no
2、当 Redis 以守护进程方式运行时,Redis 默认会把 pid 写入/var/run/redis.pid 文件,可以 通过 pidfile 指定
pidfile /var/run/redis.pid
3、指定 Redis 监听端口,默认端口为 6379,作者在自己的一篇博文中解释了为什么选用 6379 作为默认端口,因为 6379 在手机按键上 MERZ 对应的号码,而 MERZ 取自意大利歌 女 Alessia Merz 的名字
port 6379
4、绑定的主机地址
bind 127.0.0.1
5、当客户端闲置多长时间后关闭连接,如果指定为 0,表示关闭该功能
timeout 300
6、指定日志记录级别,Redis 总共支持四个级别:debug、verbose、notice、warning,默 认为 verbose
loglevel verbose
7、日志记录方式,默认为标准输出,如果配置 Redis 为守护进程方式运行,而这里又配 置为日志记录方式为标准输出,则日志将会发送给/dev/null
logfile stdout
8、设置数据库的数量,默认数据库为 0,可以使用 SELECT
databases 16
9、指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配 合
save \<seconds> \<changes>
Redis 默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
分别表示 900 秒(15 分钟)内有 1 个更改,300 秒(5 分钟)内有 10 个更改以及 60 秒 内有 10000 个更改。
10、指定存储至本地数据库时是否压缩数据,默认为 yes,Redis 采用 LZF 压缩,如果为了 节省 CPU 时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes
11、指定本地数据库文件名,默认值为 dump.rdb
dbfilename dump.rdb
12、指定本地数据库存放目录
dir ./
13、设置当本机为 slave 服务时,设置 master 服务的 IP 地址及端口,在 Redis 启动时,它 会自动从 master 进行数据同步
slaveof \<masterip> \<masterport>
14、当 master 服务设置了密码保护时,slav 服务连接 master 的密码
masterauth \<master-password>
15、设置 Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需要通过 AUTH \<password>命令提供密码,默认关闭
requirepass foobared
16、设置同一时间最大客户端连接数,默认无限制,Redis 可以同时打开的客户端连接数 为 Redis 进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当 客户端连接数到达限制时,Redis 会关闭新的连接并向客户端返回 max number of clients reached 错误信息
maxclients 128
17、指定 Redis 最大内存限制,Redis 在启动时会把数据加载到内存中,达到最大内存后, Redis 会先尝试清除已到期或即将到期的 Key,当此方法处理 后,仍然到达最大内存设置, 将无法再进行写入操作,但仍然可以进行读取操作。Redis 新的 vm 机制,会把 Key 存放 内存,Value 会存放在 swap 区
maxmemory \<bytes>
18、指定是否在每次更新操作后进行日志记录,Redis 在默认情况下是异步的把数据写入 磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis 本身同步数 据文件是按上面 save 条件来同步的,所以有的数据会在一段时间内只存在于内存中。默 认为 no
appendonly no
19、指定更新日志文件名,默认为 appendonly.aof
appendfilename appendonly.aof
20、指定更新日志条件,共有 3 个可选值:
no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用 fsync()将数据写到磁盘(慢,安全)
everysec:表示每秒同步一次(折衷,默认值)
appendfsync everysec
21、指定是否启用虚拟内存机制,默认值为 no,简单的介绍一下,VM 机制将数据分页 存放,由 Redis 将访问量较少的页即冷数据 swap 到磁盘上,访问多的页面由磁盘自动换 出到内存中(在后面的文章我会仔细分析 Redis 的 VM 机制)
vm-enabled no
22、虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个 Redis 实例共享
vm-swap-file /tmp/redis.swap
23、将所有大于 vm-max-memory 的数据存入虚拟内存,无论 vm-max-memory 设置多小,所 有索引数据都是内存存储的(Redis 的索引数据 就是 keys),也就是说,当 vm-max-memory 设 置为 0 的时候,其实是所有 value 都存在于磁盘。默认值为 0
vm-max-memory 0
24、Redis swap 文件分成了很多的 page,一个对象可以保存在多个 page 上面,但一个 page 上不能被多个对象共享,vm-page-size 是要根据存储的 数据大小来设定的,作者建议如 果存储很多小对象,page 大小最好设置为 32 或者 64bytes;如果存储很大大对象,则可 以使用更大的 page,如果不 确定,就使用默认值
vm-page-size 32
25、设置 swap 文件中的 page 数量,由于页表(一种表示页面空闲或使用的 bitmap)是 在放在内存中的,,在磁盘上每 8 个 pages 将消耗 1byte 的内存。
vm-pages 134217728
26、设置访问 swap 文件的线程数,最好不要超过机器的核数,如果设置为 0,那么所有对 swap 文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为 4
vm-max-threads 4
27、设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启
glueoutputbuf yes
28、指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算 法
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
29、指定是否激活重置哈希,默认为开启(后面在介绍 Redis 的哈希算法时具体介绍)
activerehashing yes
30、指定包含其它的配置文件,可以在同一主机上多个 Redis 实例之间使用同一份配置文 件,而同时各个实例又拥有自己的特定配置文件
include /path/to/local.conf
7.其它需要了解的
添加注释的技巧:
最好的注释方式: 少而精
完成一段小逻辑的代码就加个注释
容易费解的地方加注释
拓展: 缓存淘汰算法 :TODO
NRU(Not recently used)
FIFO(First-in, first-out)
Second-chance
LRU(Least recently Used)
redis 的内存模型
Hadoop3.0 新特性机制
纠删码
机制
事务
1 | # 基本操作 |
监听
1 | watch xx |
Redis 中的事务 :TODO
- 参考 CZ 的 word 文档
8.Redis 错误
1 | # 错误1 |