本文已得到原做者霸都民工哥受权。mysql
REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo写的 key-value 存储系统。Redis 是一个开源的使用 ANSI C 语言编写、遵照 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的API。它一般被称为数据结构服务器,由于值(value)能够是 字符串 (String), 哈希(Map), 列表 (list), 集合 (sets) 和 有序集合 (sorted sets) 等类型。linux
你们都知道了redis是基于 key-value 的 no sql 数据库,所以,先来了解一下关于 key 相关的知识点:c++
一、任何 二进制的序列均可以做为 key 使用
二、Redis 有 统一的规则来设计 key
三、对 key-value 容许的 最大长度是512MB
ActionScript Bash C C# C++ Clojure Common Lisp Crystal D Dart Elixir emacs lisp Erlang Fancy gawk GNU Prolog Go Haskell Haxe Io Java Javascript Julia Lua Matlab mruby Nim Node.js Objective-C OCaml Pascal Perl PHP Pure Data Python R Racket Rebol Ruby Rust Scala Scheme Smalltalk Swift Tcl VB VCL
一、最经常使用的就是 会话缓存
二、 消息队列,好比支付
三、活动 排行榜或计数
四、 发布、订阅消息(消息通知)
五、 商品列表、评论列表等
关于redis安装与相关的知识点介绍请参考 Nosql数据库服务之redisgit
安装的大概步骤以下:redis
Redis 是 c 语言开发的,安装 redis 须要 c 语言的编译环境sql
若是没有 gcc 须要在线安装:yum install gcc-c++数据库
第一步:获取源码包:wget http://download.redis.io/releases/redis-3.0.0.tar.gz
第二步:解压缩redis:tar zxvf redis-3.0.0.tar.gz
第三步:编译。进入redis源码目录(cd redis-3.0.0)。执行 make
第四步:安装。make install PREFIX=/usr/local/redis
#PREFIX参数指定redis的安装目录
Redis 一共支持五种数据类型api
一、 string(字符串)
二、 hash(哈希)
三、 list(列表)
四、 set(集合)
五、 zset(sorted set 有序集合)
它是 redis 最基本的数据类型,一个key对应一个value,须要注意是一个键值最大存储512MB。缓存
127.0.0.1:6379> set key "hello world" OK 127.0.0.1:6379> get key "hello world" 127.0.0.1:6379> getset key "nihao" "hello world" 127.0.0.1:6379> mset key1 "hi" key2 "nihao" key3 "hello" OK 127.0.0.1:6379> get key1 "hi" 127.0.0.1:6379> get key2 "nihao" 127.0.0.1:6379> get key3 "hello"
相关命令介绍
set 为一个 Key 设置 value(值)
get 得到某个 key 对应的 value(值)
getset 为一个 Key 设置 value(值)并返回对应的值
mset 为多个 key 设置 value(值)
redis hash 是一个键值对的集合, 是一个 string 类型的 field和value 的映射表,适合用于存储对象安全
127.0.0.1:6379> hset redishash 1 "001" (integer) 1 127.0.0.1:6379> hget redishash 1 "001" 127.0.0.1:6379> hmset redishash 1 "001" 2 "002" OK 127.0.0.1:6379> hget redishash 1 "001" 127.0.0.1:6379> hget redishash 2 "002" 127.0.0.1:6379> hmget redishash 1 2 1) "001" 2) "002"
相关命令介绍
hset 将Key对应的 hash 中的 field 配置为 value,若是 hash 不存则自动建立
hget 得到某个 hash 中的 field 配置的值
hmset 批量配置同一个 hash 中的多个 field 值
hmget 批量得到同一个 hash 中的多个 field 值
是 redis 简单的字符串列表,它按插入顺序排序
127.0.0.1:6379> lpush word hi (integer) 1 127.0.0.1:6379> lpush word hello (integer) 2 127.0.0.1:6379> rpush word world (integer) 3 127.0.0.1:6379> lrange word 0 2 1) "hello" 2) "hi" 3) "world" 127.0.0.1:6379> llen word (integer) 3
相关命令介绍
lpush 向指定的列表左侧插入元素,返回插入后列表的长度
rpush 向指定的列表右侧插入元素,返回插入后列表的长度
llen 返回指定列表的长度
lrange 返回指定列表中指定范围的元素值
是string类型的无序集合,也不可重复
127.0.0.1:6379> sadd redis redisset (integer) 1 127.0.0.1:6379> sadd redis redisset1 (integer) 1 127.0.0.1:6379> sadd redis redisset2 (integer) 1 127.0.0.1:6379> smembers redis 1) "redisset1" 2) "redisset" 3) "redisset2" 127.0.0.1:6379> sadd redis redisset2 (integer) 0 127.0.0.1:6379> smembers redis 1) "redisset1" 2) "redisset" 3) "redisset2" 127.0.0.1:6379> smembers redis 1) "redisset1" 2) "redisset3" 3) "redisset" 4) "redisset2" 127.0.0.1:6379> srem redis redisset (integer) 1 127.0.0.1:6379> smembers redis 1) "redisset1" 2) "redisset3" 3) "redisset2"
相关命令介绍
sadd 添加一个 string 元素到 key 对应的 set 集合中,成功返回1,若是元素存在返回0
smembers 返回指定的集合中全部的元素
srem 删除指定集合的某个元素
是 string 类型的有序集合,也不可重复
sorted set 中的每一个元素都须要指定一个分数,根据分数对元素进行升序排序,若是多个元素有相同的分数,则以字典序进行升序排序
sorted set 所以很是适合实现排名
127.0.0.1:6379> zadd nosql 0 001 (integer) 1 127.0.0.1:6379> zadd nosql 0 002 (integer) 1 127.0.0.1:6379> zadd nosql 0 003 (integer) 1 127.0.0.1:6379> zcount nosql 0 0 (integer) 3 127.0.0.1:6379> zcount nosql 0 3 (integer) 3 127.0.0.1:6379> zrem nosql 002 (integer) 1 127.0.0.1:6379> zcount nosql 0 3 (integer) 2 127.0.0.1:6379> zscore nosql 003 "0" 127.0.0.1:6379> zrangebyscore nosql 0 10 1) "001" 2) "003" 127.0.0.1:6379> zadd nosql 1 003 (integer) 0 127.0.0.1:6379> zadd nosql 1 004 (integer) 1 127.0.0.1:6379> zrangebyscore nosql 0 10 1) "001" 2) "003" 3) "004" 127.0.0.1:6379> zadd nosql 3 005 (integer) 1 127.0.0.1:6379> zadd nosql 2 006 (integer) 1 127.0.0.1:6379> zrangebyscore nosql 0 10 1) "001" 2) "003" 3) "004" 4) "006" 5) "005"
相关命令介绍
zadd 向指定的 sorteset 中添加1个或多个元素
zrem 从指定的 sorteset 中删除1个或多个元素
zcount 查看指定的 sorteset 中指定分数范围内的元素数量
zscore 查看指定的 sorteset 中指定分数的元素
zrangebyscore 查看指定的 sorteset 中指定分数范围内的全部元素
127.0.0.1:6379> exists key (integer) 1 127.0.0.1:6379> exists key1 (integer) 1 127.0.0.1:6379> exists key100 (integer) 0 127.0.0.1:6379> get key "nihao,hello" 127.0.0.1:6379> get key1 "hi" 127.0.0.1:6379> del key1 (integer) 1 127.0.0.1:6379> get key1 (nil) 127.0.0.1:6379> rename key key0 OK 127.0.0.1:6379> get key (nil) 127.0.0.1:6379> get key0 "nihao,hello" 127.0.0.1:6379> type key0 string
exists: #确认key是否存在
del: #删除key
expire: #设置Key过时时间(单位秒)
persist : #移除Key过时时间的配置
rename: #重命名key
type: #返回值的类型
127.0.0.1:6379> select 0 OK 127.0.0.1:6379> info # Server redis_version:3.0.6 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:347e3eeef5029f3 redis_mode:standalone os:Linux 3.10.0-693.el7.x86_64 x86_64 arch_bits:64 multiplexing_api:epoll gcc_version:4.8.5 process_id:31197 run_id:8b6ec6ad5035f5df0b94454e199511084ac6fb12 tcp_port:6379 uptime_in_seconds:8514 uptime_in_days:0 hz:10 lru_clock:14015928 config_file:/usr/local/redis/redis.conf -------------------省略N行 127.0.0.1:6379> CONFIG GET 0 (empty list or set) 127.0.0.1:6379> CONFIG GET 15 (empty list or set)
slect : #选择数据库(数据库编号0-15)
quit: #退出链接
info: #得到服务的信息与统计
monitor: #实时监控
config get: #得到服务配置
flushdb: #删除当前选择的数据库中的 key
flushall: #删除全部数据库中的 key
Redis 发布与订阅(pub/sub)是它的一种消息通讯模式,一方发送信息,一方接收信息。
下图是三个客户端同时订阅同一个频道
下图是有新信息发送给频道1时,就会将消息发送给订阅它的三个客户端
Redis 事务能够一次执行多条命令
一、发送 exec 命令前放入队列缓存,结束事务
二、收到 exec 命令后执行事务操做,若是某一命令执行失败,其它命令仍可继续执行
三、一个事务执行的过程当中,其它客户端提交的请求不会被插入到事务执行的命令列表中
一个事务经历三个阶段
开始事务(命令:multi)
命令执行
结束事务(命令:exec)
127.0.0.1:6379> MULTI OK 127.0.0.1:6379> set key key1 QUEUED 127.0.0.1:6379> get key QUEUED 127.0.0.1:6379> rename key key001 QUEUED 127.0.0.1:6379> exec 1) OK 2) "key1" 3) OK
能够经过修改配置文件设备密码参数来提升安全性
#requirepass foobared
去掉注释#号就能够配置密码
没有配置密码的状况下查询以下
127.0.0.1:6379> CONFIG GET requirepass 1) "requirepass" 2) "
配置密码以后,就须要进行认证
127.0.0.1:6379> CONFIG GET requirepass (error) NOAUTH Authentication required. 127.0.0.1:6379> AUTH foobared #认证 OK 127.0.0.1:6379> CONFIG GET requirepass 1) "requirepass" 2) "foobared"
Redis 持久有两种方式:Snapshotting(快照),Append-only file(AOF)
一、将存储在内存的数据以快照的方式写入二进制文件中,如默认dump.rdb中
二、save 900 1
#900秒内若是超过1个Key被修改,则启动快照保存
三、save 300 10
#300秒内若是超过10个Key被修改,则启动快照保存
四、save 60 10000
#60秒内若是超过10000个Key被修改,则启动快照保存
一、使用 AOF 持久时,服务会将每一个收到的写命令经过 write 函数追加到文件中(appendonly.aof)
二、AOF 持久化存储方式参数说明
appendonly yes : #开启 AOF 持久化存储方式
appendfsync always: #收到写命令后就当即写入磁盘,效率最差,效果最好
appendfsync everysec: #每秒写入磁盘一次,效率与效果居中 appendfsync no: #彻底依赖 OS,效率最佳,效果无法保证
自带相关测试工具
[root@test ~]# redis-benchmark --help Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests]> [-k <boolean>] -h <hostname> Server hostname (default 127.0.0.1) -p <port> Server port (default 6379) -s <socket> Server socket (overrides host and port) -a <password> Password for Redis Auth -c <clients> Number of parallel connections (default 50) -n <requests> Total number of requests (default 100000) -d <size> Data size of SET/GET value in bytes (default 2) -dbnum <db> SELECT the specified db number (default 0) -k <boolean> 1=keep alive 0=reconnect (default 1) -r <keyspacelen> Use random keys for SET/GET/INCR, random values for SADD Using this option the benchmark will expand the string __rand_int__ inside an argument with a 12 digits number in the specified range from 0 to keyspacelen-1. The substitution changes every time a command is executed. Default tests use this to hit random keys in the specified range. -P <numreq> Pipeline <numreq> requests. Default 1 (no pipeline). -q Quiet. Just show query/sec values --csv Output in CSV format -l Loop. Run the tests forever -t <tests> Only run the comma separated list of tests. The test names are the same as the ones produced as output. -I Idle mode. Just open N idle connections and wait. Examples: Run the benchmark with the default configuration against 127.0.0.1:6379: $ redis-benchmark Use 20 parallel clients, for a total of 100k requests, against 192.168.1.1: $ redis-benchmark -h 192.168.1.1 -p 6379 -n 100000 -c 20 Fill 127.0.0.1:6379 with about 1 million keys only using the SET test: $ redis-benchmark -t set -n 1000000 -r 100000000 Benchmark 127.0.0.1:6379 for a few commands producing CSV output: $ redis-benchmark -t ping,set,get -n 100000 --csv Benchmark a specific command line: $ redis-benchmark -r 10000 -n 10000 eval 'return redis.call("ping")' 0 Fill a list with 10000 random elements: $ redis-benchmark -r 10000 -n 10000 lpush mylist __rand_int__ On user specified command lines __rand_int__ is replaced with a random integer with a range of values selected by the -r option.
实际测试同时执行100万的请求
[root@test ~]# redis-benchmark -n 1000000 -q PING_INLINE: 152578.58 requests per second PING_BULK: 150308.14 requests per second SET: 143266.47 requests per second GET: 148632.58 requests per second INCR: 145857.64 requests per second LPUSH: 143781.45 requests per second LPOP: 147819.66 requests per second SADD: 138350.86 requests per second SPOP: 134282.27 requests per second LPUSH (needed to benchmark LRANGE): 141302.81 requests per second LRANGE_100 (first 100 elements): 146756.67 requests per second LRANGE_300 (first 300 elements): 148104.27 requests per second LRANGE_500 (first 450 elements): 152671.75 requests per second LRANGE_600 (first 600 elements): 148104.27 requests per second MSET (10 keys): 132731.62 requests per second
Redis 自动备份有两种方式
第一种是经过 dump.rdb 文件实现备份
第二种使用 aof 文件实现自动备份
Redis服务默认的自动文件备份方式(AOF 没有开启的状况下),在服务启动时,就会自动从 dump.rdb 文件中去加载数据。
**具体配置在 redis.conf
save 900 1
save 300 10
save 60 10000**
也能够手工执行save命令实现手动备份
127.0.0.1:6379> set name key OK 127.0.0.1:6379> SAVE OK 127.0.0.1:6379> set name key1 OK 127.0.0.1:6379> BGSAVE Background saving started
redis快照到dump文件时,会自动生成 dump.rdb 的文件
# The filename where to dump the DB dbfilename dump.rdb -rw-r--r-- 1 root root 253 Apr 17 20:17 dump.rdb
SAVE 命令表示使用主进程将当前数据库快照到 dump 文件
BGSAVE 命令表示,主进程会 fork 一个子进程来进行快照备份
两种备份不一样之处,前者会阻塞主进程,后者不会。
恢复举例
# Note that you must specify a directory here, not a file name. dir /usr/local/redisdata/ 备份文件存储路径 127.0.0.1:6379> CONFIG GET dir 1) "dir" 2) "/usr/local/redisdata" 127.0.0.1:6379> set key 001 OK 127.0.0.1:6379> set key1 002 OK 127.0.0.1:6379> set key2 003 OK 127.0.0.1:6379> save OK
将备份文件备份到其它目录
[root@test ~]# ll /usr/local/redisdata/ total 4 -rw-r--r-- 1 root root 49 Apr 17 21:24 dump.rdb [root@test ~]# date Tue Apr 17 21:25:38 CST 2018 [root@test ~]# cp ./dump.rdb /tmp/
删除数据
127.0.0.1:6379> del key1 (integer) 1 127.0.0.1:6379> get key1 (nil)
关闭服务,将原备份文件拷贝回 save 备份目录
[root@test ~]# redis-cli -a foobared shutdown [root@test ~]# lsof -i :6379 [root@test ~]# cp /tmp/dump.rdb /usr/local/redisdata/ cp: overwrite ‘/usr/local/redisdata/dump.rdb’? y [root@test ~]# redis-server /usr/local/redis/redis.conf & [1] 31487
登陆查看数据是否恢复
[root@test ~]# redis-cli -a foobared 127.0.0.1:6379> mget key key1 key2 1) "001" 2) "002" 3) "003"
redis 服务默认是关闭此项配置
###### APPEND ONLY MODE ########## appendonly no # The name of the append only file (default: "appendonly.aof") appendfilename "appendonly.aof" # appendfsync always appendfsync everysec # appendfsync no
配置文件的相关参数,前面已经详细介绍过。
AOF 文件备份,是备份全部的历史记录以及执行过的命令,和 mysql binlog 很类似,在恢复时就是从新执次一次以前执行的命令,须要注意的就是在恢复以前,和数据库恢复同样须要手工删除执行过的 del 或误操做的命令。
AOF 与 dump 备份不一样
一、aof 文件备份与 dump 文件备份不一样
二、服务读取文件的优先顺序不一样,会按照如下优先级进行启动
若是只配置 AOF,重启时加载 AOF 文件恢复数据
若是同时 配置了 RBD 和 AOF,启动是只加载 AOF 文件恢复数据
若是只配置 RBD,启动时将加载 dump 文件恢复数据
注意:只要配置了 aof,可是没有 aof 文件,这个时候启动的数据库会是空的
**hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64**
#list的成员与值都不太大的时候会采用紧凑格式来存储,相对内存开销也较小
在linux环境运行 Redis 时,若是系统的内存比较小,这个时候自动备份会有可能失败,须要修改系统的 vm.overcommit_memory 参数,这个参数是 linux 系统的内存分配策略
0 表示内核将检查是否有足够的可用内存供应用进程使用;若是有足够的可用内存,内存申请容许;不然,内存申请失败,并把错误返回给应用进程。
1 表示内核容许分配全部的物理内存,而无论当前的内存状态如何。
2 表示内核容许分配超过全部物理内存和交换空间总和的内存 Redis 官方的说明是,建议将 vm.overcommit_memory 的值修改成1,能够用下面几种方式进行修改:
(1)编辑/etc/sysctl.conf 改vm.overcommit_memory=1,而后 sysctl -p 使配置文件生效
(2)sysctl vm.overcommit_memory=1
(3)echo 1 > /proc/sys/vm/overcommit_memory
定时快照:效率不高,会丢失数据
AOF:保持数据完整性(一个实例的数量不要太大2G最大)
优化总结
1)根据业务须要选择合适的数据类型
2)当业务场景不需持久化时就关闭全部持久化方式(采用 ssd 磁盘来提高效率)
3)不要使用虚拟内存的方式,每秒实时写入 AOF
4)不要让 REDIS 所在的服务器物理内存使用超过内存总量的3/5
5)要使用 maxmemory
6)大数据量按业务分开使用多个 redis 实例
集群是将多个 redis 实例集中在一块儿,实现同一业务需求,或者实现高可用与负载均衡
到底有哪些集群方案呢??
1)sentinel 负责对集群中的主从服务监控、提醒和自动故障转移
2)redis 集群负责对外提供服务
关于 redis sentinel cluster 集群配置可参考
Redis Cluster 是 Redis 的分布式解决方案,在 Redis 3.0版本正式推出的,有效解决了 Redis 分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时,能够采用 Cluster 架构达到负载均衡的目的。
1)官方推荐,毋庸置疑。
2)去中心化,集群最大可增长1000个节点,性能随节点增长而线性扩展。
3)管理方便,后续可自行增长或摘除节点,移动分槽等等。
4)简单,易上手。
做者:霸都民工哥
连接:https://mp.weixin.qq.com/s/R2...
来源:微信公众号
更多相关阅读:
阿里云技术专家仲肥:了解并使用Redis 4.0
高可用Redis服务架构分析与搭建
Nginx+Redis+Ehcache:大型高并发与高可用的三层缓存架构总结
若是你还想了解更多,想和技术同僚分享切磋,可扫下方二维码,回复yw,加入掘金运维技术交流群