Redis
Redis概念和根底
Redis是一种支撑key-value等多种数据结构的存储体系。可用于缓存,事情发布或订阅,高速行列等场景。支撑网络,供给字符串,哈希,列表,行列,调集结构直接存取,依据内存,可耐久化。
什么是Redis
Redis是一款内存高速缓存数据库。支撑key-value存储体系,支撑丰厚的数据类型,如:string,list,set,zset,hash
可用于缓存,事情发布和订阅,高速行列,分布式锁等场景
用c言语开发,效率高
为什么运用Redis
- 读写功用优异
- 数据类型丰厚
- 原子性
- 丰厚的特性
- 耐久化
- 发布订阅
- 分布式
Redis下载与装置
下载地址: Redis中文网
Windows版
只需将紧缩包解压到对应的文件夹即可
发动: 直接点击redis-server.exe敞开redis即可
linux版
-
将Redis装置包传到linux中
-
解压装置包
tar -zxvf redis-4.0.0.tar.gz -C /usr/local
-
装置Redis的依靠环境gcc
yum install gcc-c++
-
进入
/usr/local/redis-4.0.0
目录,进行编译# 进入目录 cd /usr/local/redis-4.0.0
敞开编译 make
-
进入Redis的src目录,进行装置
# 进入src目录 cd src
进行装置 make install
发动与中止
-
运用Redis-server发动,默许端口号为6379
# 进入目录
cd /usr/local/redis-4.0.0/src
发动
./redis-server
-
衔接服务
这时咱们的页面应该是Redis体系界面,咱们需求重开一个页面进行Redis操作
咱们经过cli衔接服务
进入目录
cd /usr/local/redis-4.0.0/src
衔接服务
./redis-cli
检查数据
keys *
能够运用Ctrl+C退出体系
Ctrl+C
-
封闭Redis服务
# 查找Redis服务器进程号
ps -ef|grep redis
封闭进程
kill -9 进程号
Redis装备
方位:坐落Redis装置目录下,文件名为redis.conf
检查装备
能够经过CONFIG
指令检查或设置装备项
语法:
Redis config 指令格局如下:
redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME
redis 127.0.0.1:6379> CONFIG GET loglevel
1) "loglevel"
2) "notice"
运用*
号能够获取一切装备项
redis 127.0.0.1:6379> CONFIG GET *
1) "dbfilename"
2) "dump.rdb"
3) "requirepass"
4) ""
5) "masterauth"
6) ""
7) "unixsocket"
8) ""
9) "logfile"
10) ""
11) "pidfile"
12) "/var/run/redis.pid"
13) "maxmemory"
14) "0"
15) "maxmemory-samples"
16) "3"
17) "timeout"
18) "0"
19) "tcp-keepalive"
20) "0"
21) "auto-aof-rewrite-percentage"
22) "100"
23) "auto-aof-rewrite-min-size"
24) "67108864"
25) "hash-max-ziplist-entries"
26) "512"
27) "hash-max-ziplist-value"
28) "64"
29) "list-max-ziplist-entries"
30) "512"
31) "list-max-ziplist-value"
32) "64"
33) "set-max-intset-entries"
34) "512"
35) "zset-max-ziplist-entries"
36) "128"
37) "zset-max-ziplist-value"
38) "64"
39) "hll-sparse-max-bytes"
40) "3000"
41) "lua-time-limit"
42) "5000"
43) "slowlog-log-slower-than"
44) "10000"
45) "latency-monitor-threshold"
46) "0"
47) "slowlog-max-len"
48) "128"
49) "port"
50) "6379"
51) "tcp-backlog"
52) "511"
53) "databases"
54) "16"
55) "repl-ping-slave-period"
56) "10"
57) "repl-timeout"
58) "60"
59) "repl-backlog-size"
60) "1048576"
61) "repl-backlog-ttl"
62) "3600"
63) "maxclients"
64) "4064"
65) "watchdog-period"
66) "0"
67) "slave-priority"
68) "100"
69) "min-slaves-to-write"
70) "0"
71) "min-slaves-max-lag"
72) "10"
73) "hz"
74) "10"
75) "no-appendfsync-on-rewrite"
76) "no"
77) "slave-serve-stale-data"
78) "yes"
79) "slave-read-only"
80) "yes"
81) "stop-writes-on-bgsave-error"
82) "yes"
83) "daemonize"
84) "no"
85) "rdbcompression"
86) "yes"
87) "rdbchecksum"
88) "yes"
89) "activerehashing"
90) "yes"
91) "repl-disable-tcp-nodelay"
92) "no"
93) "aof-rewrite-incremental-fsync"
94) "yes"
95) "appendonly"
96) "no"
97) "dir"
98) "/home/deepak/Downloads/redis-2.8.13/src"
99) "maxmemory-policy"
100) "volatile-lru"
101) "appendfsync"
102) "everysec"
103) "save"
104) "3600 1 300 100 60 10000"
105) "loglevel"
106) "notice"
107) "client-output-buffer-limit"
108) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"
109) "unixsocketperm"
110) "0"
111) "slaveof"
112) ""
113) "notify-keyspace-events"
114) ""
115) "bind"
116) ""
修正装备
能够经过修正redis.conf
文件 或 CONFIG set
指令来修正装备
语法
CONFIG SET 指令根本语法:
redis 127.0.0.1:6379> CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE
实例
redis 127.0.0.1:6379> CONFIG SET loglevel "notice"OKredis 127.0.0.1:6379> CONFIG GET loglevel 1) "loglevel"2) "notice"
参数阐明:
redis.conf 装备项阐明如下:
- Redis默许不是以看护进程的办法运转,能够经过该装备项修正,运用yes启用看护进程
daemonize no
- 当Redis以看护进程办法运转时,Redis默许会把pid写入/var/run/redis.pid文件,能够经过pidfile指定
pidfile /var/run/redis.pid
- 指定Redis监听端口,默许端口为6379,作者在自己的一篇博文中解说了为什么选用6379作为默许端口,由于6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的姓名
port 6379
- 绑定的主机地址
bind 127.0.0.1
5.当客户端搁置多长时刻后封闭衔接,假如指定为0,表明封闭该功用
timeout 300
- 指定日志记载等级,Redis一共支撑四个等级:debug、verbose、notice、warning,默许为verbose
loglevel verbose
- 日志记载办法,默许为规范输出,假如装备Redis为看护进程办法运转,而这儿又装备为日志记载办法为规范输出,则日志将会发送给/dev/null
logfile stdout
- 设置数据库的数量,默许数据库为0,能够运用SELECT
<dbid>
指令在衔接上指定数据库id
databases 16
- 指定在多长时刻内,有多少次更新操作,就将数据同步到数据文件,能够多个条件合作
save <seconds>
<changes>
Redis默许装备文件中供给了三个条件:
save 900 1
save 300 10
save 60 10000
别离表明900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
- 指定存储至本地数据库时是否紧缩数据,默许为yes,Redis选用LZF紧缩,假如为了节约CPU时刻,能够封闭该选项,但会导致数据库文件变的巨大
rdbcompression yes
- 指定本地数据库文件名,默许值为dump.rdb
dbfilename dump.rdb
- 指定本地数据库寄存目录
dir ./
- 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis发动时,它会主动从master进行数据同步
slaveof <masterip>
<masterport>
- 当master服务设置了暗码保护时,slav服务衔接master的暗码
masterauth <master-password>
- 设置Redis衔接暗码,假如装备了衔接暗码,客户端在衔接Redis时需求经过AUTH
<password>
指令供给暗码,默许封闭
requirepass foobared
- 设置同一时刻最大客户端衔接数,默许无约束,Redis能够一起翻开的客户端衔接数为Redis进程能够翻开的最大文件描绘符数,假如设置 maxclients 0,表明不作约束。当客户端衔接数抵达约束时,Redis会封闭新的衔接并向客户端回来max number of clients reached错误信息
maxclients 128
- 指定Redis最大内存约束,Redis在发动时会把数据加载到内存中,抵达最大内存后,Redis会先测验铲除已到期或行将到期的Key,当此办法处理 后,依然抵达最大内存设置,将无法再进行写入操作,但依然能够进行读取操作。Redis新的vm机制,会把Key寄存内存,Value会寄存在swap区
maxmemory <bytes>
- 指定是否在每次更新操作后进行日志记载,Redis在默许情况下是异步的把数据写入磁盘,假如不敞开,或许会在断电时导致一段时刻内的数据丢掉。由于 redis自身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时刻内只存在于内存中。默许为no
appendonly no
- 指定更新日志文件名,默许为appendonly.aof
appendfilename appendonly.aof
-
指定更新日志条件,共有3个可选值:
no:表明等操作体系进行数据缓存同步到磁盘(快)
always:表明每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
everysec:表明每秒同步一次(折衷,默许值)
appendfsync everysec
- 指定是否启用虚拟内存机制,默许值为no,简略的介绍一下,VM机制将数据分页寄存,由Redis将拜访量较少的页即冷数据swap到磁盘上,拜访多的页面由磁盘主动换出到内存中(在后边的文章我会仔细分析Redis的VM机制)
vm-enabled no
- 虚拟内存文件途径,默许值为/tmp/redis.swap,不行多个Redis实例同享
vm-swap-file /tmp/redis.swap
- 将一切大于vm-max-memory的数据存入虚拟内存,不管vm-max-memory设置多小,一切索引数据都是内存存储的(Redis的索引数据 便是keys),也便是说,当vm-max-memory设置为0的时分,其实是一切value都存在于磁盘。默许值为0
vm-max-memory 0
- Redis swap文件分成了许多的page,一个目标能够保存在多个page上面,但一个page上不能被多个目标同享,vm-page-size是要依据存储的 数据巨细来设定的,作者主张假如存储许多小目标,page巨细最好设置为32或许64bytes;假如存储很大大目标,则能够运用更大的page,假如不 确认,就运用默许值
vm-page-size 32
- 设置swap文件中的page数量,由于页表(一种表明页面闲暇或运用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。
vm-pages 134217728
- 设置拜访swap文件的线程数,最好不要超越机器的核数,假如设置为0,那么一切对swap文件的操作都是串行的,或许会构成比较长时刻的推迟。默许值为4
vm-max-threads 4
- 设置在向客户端应对时,是否把较小的包合并为一个包发送,默许为敞开
glueoutputbuf yes
- 指定在超越必定的数量或许最大的元素超越某一临界值时,选用一种特别的哈希算法
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
- 指定是否激活重置哈希,默许为敞开(后边在介绍Redis的哈希算法时详细介绍)
activerehashing yes
- 指定包括其它的装备文件,能够在同一主机上多个Redis实例之间运用同一份装备文件,而一起各个实例又具有自己的特定装备文件
include /path/to/local.conf
HyperLogLog
HyperLogLog 是用来做基数核算的算法
长处:
在输入元素的数量或体积十分十分大时,核算基数所需的空间总是固定的,而且很小的。
在 Redis 里边,每个 HyperLogLog 键只需求花费 12 KB 内存,就能够核算挨近 2^64 个不同元素的基 数。这和核算基数时,元素越多消耗内存就越多的调集构成鲜明对比。
可是,由于 HyperLogLog 只会依据输入元从来核算基数,而不会贮存输入元素自身,所以 HyperLogLog 不能像调集那样,回来输入的各个元素。
什么是基数?
比方数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估量便是在差错可接受的范围内,快速核算基数。
Redis HyperLogLog 指令
序号 | 指令及描绘 |
---|---|
1 | PFADD key element [element ...](https://www.redis.net.cn/order/3629.html) 增加指定元素到 HyperLogLog 中。 |
2 | PFCOUNT key [key ...](https://www.redis.net.cn/order/3630.html) 回来给定 HyperLogLog 的基数预算值。 |
3 | PFMERGE destkey sourcekey [sourcekey ...](https://www.redis.net.cn/order/3631.html) 将多个 HyperLogLog 合并为一个 HyperLogLog |
发布订阅
Redis 发布订阅(pub/sub)是一种音讯通讯方式:发送者(pub)发送音讯,订阅者(sub)接纳音讯。
Redis 客户端能够订阅恣意数量的频道。
下图展现了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的联系:
当有新音讯经过 PUBLISH 指令发送给频道 channel1 时, 这个音讯就会被发送给订阅它的三个客户端:
Redis 发布订阅指令
序号 | 指令及描绘 |
---|---|
1 | PSUBSCRIBE pattern [pattern ...](https://www.redis.net.cn/order/3632.html) 订阅一个或多个契合给定方式的频道。 |
2 | PUBSUB subcommand [argument argument ...]检查订阅与发布体系状况。 |
3 | PUBLISH channel message 将信息发送到指定的频道。 |
4 | PUNSUBSCRIBE [pattern pattern ...] 退订一切给定方式的频道。 |
5 | SUBSCRIBE channel [channel ...](https://www.redis.net.cn/order/3636.html) 订阅给定的一个或多个频道的信息。 |
6 | UNSUBSCRIBE [channel channel ...] 指退订给定的频道。 |
业务
Redis业务能够一次履行多个指令,而且带有以下两个重要的确保:
业务是一个独立的阻隔操作:业务中的一切指令都会序列化,按次序地履行。业务在履行过程中,不会被其他客户端发送来的指令恳求所打断
业务是一个原子操作
一个业务从开端到履行会阅历以下三个阶段:
- 开端业务
- 指令入队
- 履行业务
业务指令
序号 | 指令及描绘 |
---|---|
1 | DISCARD 撤销业务,抛弃履行业务块内的一切指令 |
2 | EXEC 履行业务块内的指令 |
3 | MULTI 符号一个业务块的开端 |
4 | UNWATCH 撤销WATCH指令对一切key的监督 |
5 | WATCH key [key ....] 监督一个(或多个)key,假如在业务履行之前这个(或这些)key被其他指令所改动,那么业务将被打断 |
实例
以下是一个业务的比如, 它先以 MULTI 开端一个业务, 然后将多个指令入队到业务中, 最后由 EXEC 指令触发业务, 一起履行业务中的一切指令:
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED
redis 127.0.0.1:6379> GET book-name
QUEUED
redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED
redis 127.0.0.1:6379> SMEMBERS tag
QUEUED
redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
2) "C++"
3) "Programming"
数据备份与康复
备份
Redis SAVE
指令用于创立当时数据库的备份,该指令将在Redis装置目录中创立dump.rdb
语法:
redis 127.0.0.1:6379> SAVE
OK
康复
假如需求康复数据,只需将备份文件 (dump.rdb) 移动到 redis 装置目录并发动服务即可。获取 redis 目录能够运用 CONFIG 指令,如下所示:
redis 127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/usr/local/redis/bin"
以上指令 CONFIG GET dir 输出的 redis 装置目录为 /usr/local/redis/bin。
Bgsave
创立 redis 备份文件也能够运用指令 BGSAVE,该指令在后台履行。
127.0.0.1:6379> BGSAVE
Background saving started
安全
能够经过Redis的装备文件设置暗码参数,这样客户端衔接到Redis服务就需求暗码验证,这样能够让你的Redis服务更安全
能够经过以下指令检查是否设置了暗码验证:
127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) ""
默许情况下requirepass参数是空的,这就意味着你无需经过暗码验证就能够衔接到Redis服务
能够经过以下指令来修正参数:
127.0.0.1:6379> CONFIG set requirepass "w3cschool.cc"
OK
127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) "w3cschool.cc"
设置暗码后,客户端衔接 redis 服务就需求暗码验证,不然无法履行指令。
语法
AUTH 指令根本语法格局如下:
127.0.0.1:6379> AUTH password
127.0.0.1:6379> AUTH "w3cschool.cc"
OK
127.0.0.1:6379> SET mykey "Test value"
OK
127.0.0.1:6379> GET mykey
"Test value"
功用测验
Redis 功用测验是经过一起履行多个指令完成的。
语法
redis 功用测验的根本指令如下:
redis-benchmark [option] [option value]
redis 功用测验东西可选参数如下所示:
序号 | 选项 | 描绘 | 默许值 |
---|---|---|---|
1 | -h | 指定服务器主机名 | 127.0.0.1 |
2 | -p | 指定服务器端口 | 6379 |
3 | -s | 指定服务器 socket | |
4 | -c | 指定并发衔接数 | 50 |
5 | -n | 指定恳求数 | 10000 |
6 | -d | 以字节的方式指定 SET/GET 值的数据巨细 | 2 |
7 | -k | 1=keep alive 0=reconnect | 1 |
8 | -r | SET/GET/INCR 运用随机 key, SADD 运用随机值 | |
9 | -P | 经过管道传输 <numreq> 恳求 |
1 |
10 | -q | 强制退出 redis。仅显现 query/sec 值 | |
11 | --csv | 以 CSV 格局输出 | |
12 | -l | 生成循环,永久履行测验 | |
13 | -t | 仅运转以逗号分隔的测验指令列表。 | |
14 | -I | Idle 方式。仅翻开 N 个 idle 衔接并等候。 |
实例
以下实例一起履行 10000 个恳求来检测功用:
redis-benchmark -n 100000
PING_INLINE: 141043.72 requests per second
PING_BULK: 142857.14 requests per second
SET: 141442.72 requests per second
GET: 145348.83 requests per second
INCR: 137362.64 requests per second
LPUSH: 145348.83 requests per second
LPOP: 146198.83 requests per second
SADD: 146198.83 requests per second
SPOP: 149253.73 requests per second
LPUSH (needed to benchmark LRANGE): 148588.42 requests per second
LRANGE_100 (first 100 elements): 58411.21 requests per second
LRANGE_300 (first 300 elements): 21195.42 requests per second
LRANGE_500 (first 450 elements): 14539.11 requests per second
LRANGE_600 (first 600 elements): 10504.20 requests per second
MSET (10 keys): 93283.58 requests per second
实例
以下实例咱们运用了多个参数来测验 redis 功用:
redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 100000 -q
SET: 146198.83 requests per second
LPUSH: 145560.41 requests per second
以上实例中主机为 127.0.0.1,端口号为 6379,履行的指令为 set,lpush,恳求数为 10000,经过 -q 参数让成果只显现每秒履行的恳求数。