Fork me on GitHub

Redis学习笔记

什么是 Redis?

Redis是一个开源的使用 ANSI C 语言编写、遵守BSD协议、基于内存并可持久化的 K-V 非关系型数据库。

Redis 和 Memcache的区别

  • Redis 数据类型丰富。Redis不仅仅支持简单的数据类型,还支持list、set、sortedset、hash等数据结构。

  • Redis可利用虚拟内存。Redis 当物理内存用完时,可以将一些很久没用到的 value 交换到磁盘。

  • Redis 支持数据持久化。当 Memcache 挂掉后,数据就没了。而 Redis 可以定期将数据保存到磁盘。

  • Redis 支持灾难恢复。当Memcache挂掉后,数据不可恢复; 而 Redis 数据丢失后可以通过AOF 恢复。

  • Redis 支持数据的备份。Redis支持master-slave模式的数据备份。

Redis 数据结构

  • String (字符串)

  • List (列表)

  • Hash(散列)

  • Set (集合)

  • SortedSet (有序集合)

  • HyperLogLog

Redis 各种数据类型的使用场景举例分析 https://mengkang.net/356.html

Redis 操作命令

参考:

Redis 的一些配置/命令

配置表示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
==配置文件全解===


==基本配置
daemonize no 是否以后台进程启动
databases 16 创建database的数量(默认选中的是database 0)


save 900 1 #刷新快照到硬盘中,必须满足两者要求才会触发,即900秒之后至少1个关键字发生变化。
save 300 10 #必须是300秒之后至少10个关键字发生变化。
save 60 10000 #必须是60秒之后至少10000个关键字发生变化。
stop-writes-on-bgsave-error yes #后台存储错误停止写。
rdbcompression yes #使用LZF压缩rdb文件。
rdbchecksum yes #存储和加载rdb文件时校验。
dbfilename dump.rdb #设置rdb文件名。
dir ./ #设置工作目录,rdb文件会写入该目录。


==主从配置
slaveof <masterip> <masterport> 设为某台机器的从服务器
masterauth <master-password> 连接主服务器的密码
slave-serve-stale-data yes # 当主从断开或正在复制中,从服务器是否应答
slave-read-only yes #从服务器只读
repl-ping-slave-period 10 #从ping主的时间间隔,秒为单位
repl-timeout 60 #主从超时时间(超时认为断线了),要比period大
slave-priority 100 #如果master不能再正常工作,那么会在多个slave中,选择优先值最小的一个slave提升为master,优先值为0表示不能提升为master。

repl-disable-tcp-nodelay no #主端是否合并数据,大块发送给slave
slave-priority 100 从服务器的优先级,当主服挂了,会自动挑slave priority最小的为主服


===安全
requirepass foobared # 需要密码
rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 #如果公共环境,可以重命名部分敏感命令 如config



===限制
maxclients 10000 #最大连接数
maxmemory <bytes> #最大使用内存

maxmemory-policy volatile-lru #内存到极限后的处理
volatile-lru -> LRU算法删除过期key
allkeys-lru -> LRU算法删除key(不区分过不过期)
volatile-random -> 随机删除过期key
allkeys-random -> 随机删除key(不区分过不过期)
volatile-ttl -> 删除快过期的key
noeviction -> 不删除,返回错误信息

#解释 LRU ttl都是近似算法,可以选N个,再比较最适宜T踢出的数据
maxmemory-samples 3

====日志模式
appendonly no #是否仅要日志
appendfsync no # 系统缓冲,统一写,速度快
appendfsync always # 系统不缓冲,直接写,慢,丢失数据少
appendfsync everysec #折衷,每秒写1次

no-appendfsync-on-rewrite no #为yes,则其他线程的数据放内存里,合并写入(速度快,容易丢失的多)
auto-AOF-rewrite-percentage 100 当前aof文件是上次重写是大N%时重写
auto-AOF-rewrite-min-size 64mb aof重写至少要达到的大小

====慢查询
slowlog-log-slower-than 10000 #记录响应时间大于10000微秒的慢查询
slowlog-max-len 128 # 最多记录128条


====服务端命令
time 返回时间戳+微秒
dbsize 返回key的数量
bgrewriteaof 重写aof
bgsave 后台开启子进程dump数据
save 阻塞进程dump数据
lastsave

slaveof host port 做host port的从服务器(数据清空,复制新主内容)
slaveof no one 变成主服务器(原数据不丢失,一般用于主服失败后)

flushdb 清空当前数据库的所有数据
flushall 清空所有数据库的所有数据(误用了怎么办?)

shutdown [save/nosave] 关闭服务器,保存数据,修改AOF(如果设置)

slowlog get 获取慢查询日志
slowlog len 获取慢查询日志条数
slowlog reset 清空慢查询


info []

config get 选项(支持*通配)
config set 选项 值
config rewrite 把值写到配置文件
config restart 更新info命令的信息

debug object key #调试选项,看一个key的情况
debug segfault #模拟段错误,让服务器崩溃
object key (refcount|encoding|idletime)
monitor #打开控制台,观察命令(调试用)
client list #列出所有连接
client kill #杀死某个连接 CLIENT KILL 127.0.0.1:43501
client getname #获取连接的名称 默认nil
client setname "名称" #设置连接名称,便于调试



====连接命令===
auth 密码 #密码登陆(如果有密码)
ping #测试服务器是否可用
echo "some content" #测试服务器是否正常交互
select 0/1/2... #选择数据库
quit #退出连接

关于 Redis 的持久化

Redis 中有两种方法进行持久化,一种是快照,一种是Append-only。

快照

Redis 以快照的形式将数据保存到一个二进制文件中(dump.rdb,名字可更改),在配置在N秒之内,至少发生M次修改则抓快照到磁盘(配置项:save N M)。我们也可以手动执行save 或者 bgsave(异步)做快照。

优点:不会太影响性能

缺点:Redis 挂掉后,最近的数据会丢失。当业务量很大时,会丢失很多数据(丢失数据的多少取决于你 save 策略的配置)。

Append-only

使用 Append-only 方法(Redis 配置项:appendonly yes/no),Redis 可以每执行一个命令或者每隔1秒,都会添加到 AOF 文件中(取决于 Redis 配置项:appendfsync everysec/always/no)。当 Redis 关闭后,将会读取 AOF 文件进行“重放”以恢复到关闭时刻的数据。

优点:丢失数据较少

缺点:较影响 Redis 性能

我们一般将 快照 + AOF 结合起来做数据的同步。

Redis 同步机制

Redis 可以使用主从同步,从从同步。第一次同步时,主节点做一次 bgsave,并同时将后续修改操作记录到内存 buffer,待完成后将 rdb 文件全量同步到复制节点,复制节点接受完成后将 rdb 镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。

Redis 事务

Redis 开启事务后(执行 multi)后,执行 Redis 命令 后,会将 Redis 执行命令放到队列里,并不真正执行,执行 exec 后,会出现有的 Redis 命令执行成功,有的执行失败。Redis 中的事务不像 mysql 的事务,有一个命令执行失败,commit后,一组 sql 操作全部执行失败、回滚操作。

使用 discard 会清空事务队列里的 Redis 命令,不执行 Redis 命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#开启事务
> multi

#提交事务
> exec

#取消执行Redis命令
> discard

#监视 key 值的变化, 如果key发生变化,事务取消
> watch key

#取消监视 key 的变化
> unwatch

使用 watch命令 示例:
Redis事务

监控工具 sentinel

Sentinel不断与master通信,获取master的slave信息.
监听master与slave的状态
如果某slave失效,直接通知master去除该slave.

PHP 操作 Redis

PHP 操作 Redis,可查看 phpredis 的 github 仓库:https://github.com/phpredis/phpredis

Python 中操作 Redis

Redis 客户端工具

Redis的使用场景

  • 会话缓存

  • 热点数据缓存

  • 队列

  • 排行榜/计数器

  • 发布/订阅

其它链接

Redis在线测试 http://try.redis.io/

天下无难试之Redis面试刁难大全 https://mp.weixin.qq.com/s/507jyNbL4xCkxyW6Xk15Xg

------本文结束感谢阅读------
欣赏此文?求鼓励,求支持!