一、Redis简介
1.1 什么是Redis
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
1.2 为什么要用Redis,应用到什么场景
作用:减轻数据库访问压力
场景:短信验证码时间有效期、session共享解决方案
1.3 Redis的优势
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
1.4 Redis与其他的key-value存储有什么不同
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
二、Redis的安装
2.1 Linux下安装Redis
Redis的官方下载网址是:http://redis.io/download (这里下载的是Linux版的Redis源码包),Redis服务器端的默认端口是6379。
2.1.1 将下载的源码包上传到服务器,一般上传到 /opt 目录下,新建文件夹 redis
2.1.2 解压缩 tar -zxvf xxx.tar.gz
2.1.3 进入解压后的目录,编译 :make
(注意,编译需要C语言编译器gcc的支持,如果没有,需要先安装gcc。可以使用rpm -q gcc查看gcc是否安装)
(利用yum在线安装gcc的命令 yum -y install gcc )
(如果编译出错,请使用make clean清除临时文件。之后,找到出错的原因,解决问题后再来重新安装。 )
2.1.4 进入到 src 目录,执行安装:make install
2.1.5 到此安装完成,可以将可执行文件和配置文件,复制到习惯的 /usr/local 目录下。
2.1.6 在 /usr/local 下新建 redis,里面创建 etc(配置文件)、bin(可执行文件)
cp ./redis.conf /usr/local/redis/etc
cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server redis-sentinel /usr/local/redis/bin
2.1.7 开放 6379 端口
1)编辑 /etc/sysconfig/iptables 文件:vi /etc/sysconfig/iptables,加入内容并保存:-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 6379 -j ACCEPT
2)重启服务:/etc/init.d/iptables restart
3)查看端口是否开放:/sbin/iptables -L -n
2.2 Redis的常用命令
启动:./redis-server /usr/local/redis/etc/redis.conf 为redis-server指定配置文
进入客户端:./redis-cli
查询所有数据:keys *
2.3 修改redis.conf文件
daemonize yes --- 修改为yes 后台启动
requirepass 123456 ----注释取消掉设置账号密码
ps aux | grep '6379' --- 查询端口
service iptables stop 停止防火墙
2.4 Redis的连接方式
./redis-cli -h 127.0.0.1 -p 6379 -a "123456" --- redis 使用账号密码连接
PING结果表示成功
2.5 停止Redis
redis-cli shutdown 或者 kill redis进程的pid
三、Redis的基本数据类型
3.1 字符串类型(string)
redis 127.0.0.1:6379> SET mykey "redis"
OK
redis 127.0.0.1:6379> GET mykey
"redis"
编号 |
命令 |
描述说明 |
1 |
此命令设置指定键的值。 |
|
2 |
获取指定键的值。 |
|
3 |
获取存储在键上的字符串的子字符串。 |
|
4 |
设置键的字符串值并返回其旧值。 |
|
5 |
返回在键处存储的字符串值中偏移处的位值。 |
|
6 |
获取所有给定键的值 |
|
7 |
存储在键上的字符串值中设置或清除偏移处的位 |
|
8 |
使用键和到期时间来设置值 |
|
9 |
设置键的值,仅当键不存在时 |
|
10 |
在指定偏移处开始的键处覆盖字符串的一部分 |
|
11 |
获取存储在键中的值的长度 |
|
12 |
为多个键分别设置它们的值 |
|
13 |
为多个键分别设置它们的值,仅当键不存在时 |
|
14 |
设置键的值和到期时间(以毫秒为单位) |
|
15 |
将键的整数值增加 |
|
16 |
将键的整数值按给定的数值增加 |
|
17 |
将键的浮点值按给定的数值增加 |
|
18 |
将键的整数值减 |
|
19 |
按给定数值减少键的整数值 |
|
20 |
将指定值附加到键 |
3.2 列表类型(list)
3.3 集合(set)
3.4 有序集合(sorted set)
redis127.0.0.1:6379> ZADD runoobkey 1 redis
(integer)1
redis127.0.0.1:6379> ZADD runoobkey 2 mongodb
(integer)1
redis127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer)1
redis127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer)0
redis127.0.0.1:6379> ZADD runoobkey 4 mysql
(integer)0
redis127.0.0.1:6379> ZRANGE runoobkey 010 WITHSCORES
1)"redis"
2)"1"
3)"mongodb"
4)"2"
5)"mysql"
6)"4"
3.5 哈希(Hash)
127.0.0.1:6379> HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
OK
127.0.0.1:6379> HGETALL runoobkey
1)"name"
2)"redis tutorial"
3)"description"
4)"redis basic commands for caching"
5)"likes"
6)"20"
7)"visitors"
8)"23000"
四、Redis与Jedis
4.1 引入依赖
<!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>
4.2 Java代码
public class RedisTool { private Jedis jedis; public void setup() { //连接redis服务器,192.168.0.100:6379 jedis = new Jedis("192.168.0.100", 6379); //权限认证 jedis.auth("admin"); } }
五、SpringBoot集成Redis
5.1 引入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
5.2 配置信息
########################################################
###Redis (RedisConfiguration)
########################################################
spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=123456
spring.redis.pool.max-idle=8
spring.redis.pool.min-idle=0
spring.redis.pool.max-active=8
spring.redis.pool.max-wait=-1
spring.redis.timeout=5000
5.3 Java代码
@Service publicclass RedisService { @Autowired private StringRedisTemplate stringRedisTemplate; publicvoid setStr(String key, String value) { setStr(key, value, null); } publicvoid setStr(String key, String value, Long time) { stringRedisTemplate.opsForValue().set(key, value); if (time != null) stringRedisTemplate.expire(key, time, TimeUnit.SECONDS); } public Object getKey(String key) { returnstringRedisTemplate.opsForValue().get(key); } publicvoid delKey(String key) { stringRedisTemplate.delete(key); } }
六、Redis主从复制
6.1 为什么要做Redis主从复制,集群?
提高性能,高可用(当部分服务器出现问题时,有其他可以使用)
6.2 Redis如何实现高可用?
利用Redis的哨兵机制,哨兵机制会定时监听主从服务器,如果监听到主服务器宕机了,会在从服务器中选个当做主服务器。
6.3 克隆虚拟机
6.4 生成新的Mac地址
6.5 主从复制概述
1)redis的复制功能是支持多个数据库之间的数据同步。一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库。
2)通过redis的复制功能可以很好的实现数据库的读写分离,提高服务器的负载能力。主数据库主要进行写操作,而从数据库负责读操作。
过程:
1)当一个从数据库启动时,会向主数据库发送sync命令,
2)主数据库接收到sync命令后会开始在后台保存快照(执行rdb操作),并将保存期间接收到的命令缓存起来
3)当快照完成后,redis会将快照文件和所有缓存的命令发送给从数据库。
4)从数据库收到后,会载入快照文件并执行收到的缓存的命令。
6.6 修改redis.conf
#主服务器地址
slaveof 192.168.33.130 6379
masterauth 123456---主redis服务器配置了密码,则需要配置
七、哨兵机制
7.1 什么是哨兵机制
Redis的哨兵(sentinel) 系统用于管理多个 Redis 服务器,该系统执行以下三个任务:
• 监控(Monitoring): 哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。
• 提醒(Notification):当被监控的某个 Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。
• 自动故障迁移(Automatic failover):当一个Master不能正常工作时,哨兵(sentinel) 会开始一次自动故障迁移操作,它会将失效Master的其中一个Slave升级为新的Master, 并让失效Master的其他Slave改为复制新的Master; 当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用Master代替失效Master。
哨兵(sentinel) 是一个分布式系统,你可以在一个架构中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(gossipprotocols)来接收关于Master是否下线的信息,并使用投票协议(agreement protocols)来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master.
每个哨兵(sentinel) 会向其它哨兵(sentinel)、master、slave定时发送消息,以确认对方是否”活”着,如果发现对方在指定时间(可配置)内未回应,则暂时认为对方已挂(所谓的”主观认为宕机” Subjective Down,简称sdown).
若“哨兵群”中的多数sentinel,都报告某一master没响应,系统才认为该master"彻底死亡"(即:客观上的真正down机,Objective Down,简称odown),通过一定的vote算法,从剩下的slave节点中,选一台提升为master,然后自动修改相关配置.
虽然哨兵(sentinel) 释出为一个单独的可执行文件 redis-sentinel ,但实际上它只是一个运行在特殊模式下的 Redis 服务器,你可以在启动一个普通 Redis 服务器时通过给定 --sentinel 选项来启动哨兵(sentinel).
哨兵(sentinel) 的一些设计思路和zookeeper非常类似。
7.2 哨兵机制配置修改
1.将Redis解压目录下的sentinel.conf拷贝到etc目录
cp sentinel.conf /usr/local/redis/etc
2.修改sentinel.conf配置文件
sentinel monitor mymast 192.168.110.133 6379 1 #主节点名称IP 端口号选举次数
3. 修改心跳检测 5000毫秒
sentinel down-after-milliseconds mymaster 5000
4.sentinel parallel-syncs mymaster 2 ---最多多少合格(从)节点
5. 启动哨兵模式
./redis-server /usr/local/redis/etc/sentinel.conf --sentinel &
八、Redis事物
先以 MULTI 开始一个事务,然后将多个命令入队到事务中,最后由 EXEC 命令触发事务,一并执行事务中的所有命令。
序号 |
命令及描述 |
1 |
DISCARD |
2 |
EXEC |
3 |
MULTI |
4 |
UNWATCH |
5 |
WATCH
key [key ...] |
九、Redis持久化
Redis的持久化,就是将内存数据保存到硬盘。有RDB(默认)和AOF两种模式
9.1 RDB持久化
RDB 是在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。
优点:使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能
缺点:RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候。
RDB默认开启,redis.conf配置下只需要修改定时备份参数即可:
# 900秒,修改一次存储则保存。
save 900 1
save 300 10
save 60 10000
9.2 AOF持久化
Append-only file,将“操作 + 数据”以格式化指令的方式追加到操作日志文件的尾部,在 append 操作返回后(已经写入到文件或者即将写入),才进行实际的数据变更,“日志文件”保存了历史所有的操作过程;当 server 需要数据恢复时,可以直接 replay 此日志文件,即可还原所有的操作过程。AOF 相对可靠,它和 mysql 中 bin.log、apache.log、zookeeper 中 txn-log 简直异曲同工。AOF 文件内容是字符串,非常容易阅读和解析。
优点:可以保持更高的数据完整性,如果设置追加 file 的时间是 1s,如果 redis 发生故障,最多会丢失 1s 的数据;且如果日志写入不完整支持 redis-check-aof 来进行日志修复;AOF 文件没被 rewrite 之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的 flushall)。
缺点:AOF 文件比 RDB 文件大,且恢复速度慢。
AOF默认关闭,需要修改配置:
##此选项为aof功能的开关,默认为“no”,可以通过“yes”来开启aof功能 ##只有在“yes”下,aof重写/文件同步等特性才会生效 appendonly yes ##指定aof文件名称 appendfilename appendonly.aof ##指定aof操作中文件同步策略,有三个合法值:always everysec no,默认为everysec appendfsync everysec ##在aof-rewrite期间,appendfsync是否暂缓文件同步,"no"表示“不暂缓”,“yes”表示“暂缓”,默认为“no” no-appendfsync-on-rewrite no ##aof文件rewrite触发的最小文件尺寸(mb,gb),只有大于此aof文件大于此尺寸是才会触发rewrite,默认“64mb”,建议“512mb” auto-aof-rewrite-min-size 64mb ##相对于“上一次”rewrite,本次rewrite触发时aof文件应该增长的百分比。 ##每一次rewrite之后,redis都会记录下此时“新aof”文件的大小(例如A),那么当aof文件增长到A*(1 + p)之后 ##触发下一次rewrite,每一次aof记录的添加,都会检测当前aof文件的尺寸。 auto-aof-rewrite-percentage 100
9.3 RDB和AOF的区别
1) AOF 更加安全,可以将数据更加及时的同步到文件中,但是 AOF 需要较多的磁盘 IO 开支,AOF 文件尺寸较大,文件内容恢复数度相对较慢。
2) RDB,安全性较差,它是“正常时期”数据备份以及 master-slave 数据同步的最佳手段,文件尺寸较小,恢复数度较快。
在架构良好的环境中,master 通常使用 AOF,slave 使用 RDB,主要原因是 master 需要首先确保数据完整性,它作为数据备份的第一选择;slave 提供只读服务(目前 slave 只能提供读取服务),它的主要目的就是快速响应客户端 read 请求。
redis 运行在网络稳定性差 / 物理环境糟糕情况下,建议你 master 和 slave 均采取 AOF。
十、Redis的发布订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。
创建了订阅频道名为 redisChat:
redis127.0.0.1:6379> SUBSCRIBE redisChat
Reading messages...(pressCtrl-C to quit)
1)"subscribe"
2)"redisChat"
3)(integer)1
现在,我们先重新开启个 redis 客户端,然后在同一个频道 redisChat 发布两次消息,订阅者就能接收到消息。
redis127.0.0.1:6379> PUBLISH redisChat "Redis is a great caching technique"
(integer)1
redis127.0.0.1:6379> PUBLISH redisChat "Learn redis by runoob.com"
(integer)1
# 订阅者的客户端会显示如下消息
1)"message"
2)"redisChat"
3)"Redis is a great caching technique"
1)"message"
2)"redisChat"
3)"Learn redis by runoob.com"