下载安装配置
windows下载
http://redis.io/download
Linux下载
# 安装gcc
yum install gcc
# 把下载好的redis-5.0.3.tar.gz放在/export/sort文件夹下,并解压
cd /export/sort
wget http://download.redis.io/releases/redis-5.0.3.tar.gz
tar -zxvf /export/sort/redis-5.0.3.tar.gz
# 编译文件
cd /export/sort/redis-5.0.3
make
# 安装
make PREFIX=/export/install/redis-5.0.3 install
基本配置
# 后台启动
daemonize yes
# 关闭保护模式,开启的话,只有本机才可以访问redis
protected-mode no
# 需要注释掉bind 代表允许客户端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可
# bind 127.0.0.1
启动服务端
# 复制一份配置文件到bin目录,启动服务
cd /export/install/redis-5.0.3/bin
cp /export/sort/redis-5.0.3/redis.conf /export/install/redis-5.0.3/bin
./redis-server redis.conf
# 验证启动是否成功
ps -ef | grep redis
netstat -lanp | grep 6379
五种数据类型
数据类型 | 实现 |
---|---|
String(字符串) | 简单动态字符串 |
Hash(哈希) | 字典表 |
List(列表) | 双向链表,可以随机写入 |
Set(无序集合) | 字典表 |
zSet(有序集合) | 跳跃表 |
高级指令
指令 | 指令说明 | 示例 |
---|---|---|
keys [MATCH pattern] | 全量遍历键(生产环境推荐禁用) 可选参数pattern: key 的正则模式 | keys test* |
scan cursor [MATCH pattern] [COUNT count] | 渐进式遍历键 可选参数cursor : 游标起始位置 可选参数pattern: key 的正则模式 可选参数count: 扫描的数量 | scan 0 MATCH test* COUNT 10 |
time | 显示服务器时间 , 时间戳(秒), 微秒数 | |
dbsize | 当前数据库的key的数量 | |
Info | 查看redis服务器的信息 |
Redis持久化
RDB
将数据以二进制快照的形式保存在磁盘上,是默认持久化方式
# 表示 在60秒内有1000个key发生改变,就进行一次持久化备份
# save 60 1000
客户端也可以通过命令手动触发持久化备份
-
save
向Redis发起数据备份命令,该命令会使Redis进入阻塞,无法对外提供服务,需等待数据备份完成。
-
bgsave
向Redis发起数据备份命令,该命令会使新创建一个线程来进行数据持久化备份,主线程还是可以继续对外提供服务。
AOF
将修改的每一条命令记录到文件appendonly.aof中
# 表示开启aof备份方式
# appendonly yes
AOF重写会将一些没用的命令进行合并,例如一个数字自增100次,aof只会记录最后的结果;向一个列表中添加多个值时,会将结果进行合并
LPUSH list1 a
LPUSH list1 b
LPUSH list1 c
#合并为
LPUSH list1 a b c
混合持久化
如果开启了混合持久化,AOF在重写时,不再是单纯将内存数据转换为RESP命令写入AOF文件,而是将
重写这一刻之前的内存做RDB快照处理,并且将RDB快照内容和增量的AOF修改内存数据的命令存在一
起,都写入新的AOF文件,新的文件一开始不叫appendonly.aof,等到重写完新的AOF文件才会进行改
名,原子的覆盖原有的AOF文件,完成新旧两个AOF文件的替换
主从复制
相关配置
# 从本机6379的redis实例复制数据,老版本使用slaveof命令
replicaof 192.168.0.60 6379
# 从节点只读
replica‐read‐only yes
全量复制
主从复制主要发生在slave节点启动时,数据同步的过程如下
- 从服务连接到主服务器后,发送SYNC命令
- 主服务器接受到到SYNC命令后,执行bgsave命令保存当前数据快照文件(多个slave只生成1个快照)
- bgsave命令执行完成后,将快照文件发送给slave服务器
- slave服务器接受到快照文件后,会删除本地的数据,开始载入快照数据数据
- 如果主服务器在生成快照–从服务器恢复快照期间存在数据的修改,会将修改过的数据放在缓冲区,并将该数据发送给slave服务器
- salve恢复缓冲区的数据,数据同步完成。
增量复制
Redis2.8后的版本支持快照的增量同步
主服务器会维护一个和他所有slave服务器的数据同步下标offset,当slave服务异常重启后,主服务器会根据slave上一次数据同步的下标生成快照文件并发送给slave服务器(每个slave生成一个快照),进行数据的增量更新.
哨兵机制
相关配置
# quorum是一个数字,指明当有多少个sentinel认为一个master失效时master才算真正失效
# sentinel monitor <master‐name> <ip> <redis‐port> <quorum>
sentinel monitor mymaster 192.168.0.60 6379 2
- 主观下线:单个哨兵察觉到主节点挂了
- 客观下线:有quorum个哨兵察觉到主节点,quorum可以自行配置(默认大小为哨兵节点的一半)
选举机制
1、优先级高的最分最高
Redis提供了一个优先级,可以自定义配置优先级别默认是100,值越小被选中的概率就越高,如果值为0则永远无法被选中。
2、优先级相同时和原主节点同步程序最接近的得分最高;
Redis再同步时会维护一个slave_repl_offset值来记录同步的版本,每次数据从主节点同步到从节点slave_repl_offset都会增加。根据值的大小判断,将版本大的作为新的主节点。
3、ID号最小的从库最分最高。
每一个redis实例启动的时候,系统都会为它分配一个id,如果前面的两轮得分都完成一样的话,那么将会由所有从库中ID号最小的那个从节点来担任新的主节点。
应用场景
- 实现高并发分布式锁
- 计数器使用:记录访问次数,点赞次数
- 分布式session缓存
- 唯一序列号生成
- 用户的单点登入
- 短信验证码
- 表单重复提交
常见问题
缓存穿透
访问一个缓存当中不存在的数据,每次缓存都不会命中。缓存中查询不到就去查询数据库,导致数据库压力过大
解决方案
- 在Redis中维护一个空对象
- 使用布隆过滤器排除大多是的key
缓存击穿
但缓存中的一个热点key失效后,出现大量的请求查询数据库
解决方案
- 在代码中使用互斥锁,一次只允许一个进程访问数据进行查询
缓存雪崩
同一时间内出现大量的key同时失效,导致数据库请求并发量过大甚至挂掉
解决方案
- 给每一个key设置不同的过期时间,在基本的过期时间上再加上一个随机数作为过期时间