大数据时代的3V
海量Volume,多样Variety,实时Velocity
互联网需求3高
高并发,高可用,高性能
NoSQL数据的四大分类
KV键值:redis
文档型(Bson格式比较多):MongoDB
列存储数据库:Cassandra,HBase
图关系数据库:Neo4J,InfoGrid
传统关系型数据库ACID
A(Atomicity)原子性,C(Consistency)一致性,I(Isolation)隔离性,D(Durability)持久性
分布式数据库中的CAP原理
C:Consitency(强一致性),A:Availability(可用性),P:Partition tolerance(分区容错性)
BASE
BASE其实是下面三个术语的缩写: 基本可用(Basically Available) 软状态(Soft state) 最终一致(Eventually consistent)
Redis
默认端口6379
Flushall :清空所有库
flushdb:清空当前库
select 库索引:切换数据库
Redis五大数据类型
string:
最大为512MB
可以包含任意数据,如JPG图片或序列化对象等
hash:
类似于Java的Map
list:
列表,底层是个链表
set:
是string的无序集合,底层通过HashTable实现
zset(sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。 redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。
Redis键(Key)
exists key的名字:判断某个key是否存在
move key db:移到某个库
expire key 秒钟:给key设置过期时间
ttl key :查看key的过期时间
type key: 查看key的类型
字符串:
set/get/del/append/strlen
getrange: 获取指定区间范围内的值,类似between......and的关系,从零到负一表示全部
setrange: setrange设置指定区间范围内的值,格式是setrange key值 具体值
**setex(set with expire):**设置带过期时间的key,动态设置。setex 键 秒值 真实值
**setnx(set if not exist):**只有在 key 不存在时设置 key 的值。
**getset:**将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
mset,mget,msetnx
getset:先get后set
Incr/decr/incrby/decrby,一定要是数字才能进行加减
列表(List):
lpush:
lpop
rpush
rpop
lrange:在 key 的列表里指定范围内的元素
llen
**ltrim k1 开始index 结束index:**截取指定范围的值后再赋值给key
lrem ke1 count value:从左往右删除count个等于value 的值
**rpoplpush 源列表 目的列表:**移除列表的最后一个元素,并将该元素添加到另一个列表并返回
lset key index value:将key的列表索引为index的值设置为value
linsert key before/after value1 value2:在value1之前/之后插入value2
集合(Set)
sadd key member:
**smembers key:**查看key集合
**sismember key member:**判断member是否是key的集合的元素
scard: 获取集合元素的个数
**srem key value:**删除集合中的元素
srandmember key [count]:随机出count个元素
spop key [count]:随机出栈
smove key1 key2 key1的某个值:将key1的值移到k2
sdiff:差集
sinter:交集
sunion:并集
哈希(Hash):
hset:
hget:
hmset:
hmget:
hgetall:
hdel:
hexists key field: 查看key中field域是否存在
hkeys:
hvals:
hincrby key field increment:给key中的field的值加上增量increment
hincrbyfloat:
hsetnx:不存在时赋值,存在时无效
有序集合Zset(sorted set)
zadd key score member:
zrange
zrangebyscore
zrem key memeber:删除元素
zcard/zcount key score区间/zrank key values值,作用是获得下标值
zscore key 对应值,获得分数
zrevrank key values,作用是逆序获得下标值
zrevrangebyscore key 结束score 开始score
Redis.conf
################################## NETWORK #####################################
bind 127.0.0.1 ::1 //绑定地址
//保护模式,默认是开启状态,只允许本地客户端连接, 可以设置密码或添加bind来连接
protected-mode yes
port 6379 //端口号
tcp-backlog 511 //TCP监听的最大容纳数量
unixsocket /tmp/redis.sock
unixsocketperm 700
指定redis监听的unix socket路径,默认不启用,unixsocketperm指定文件的权限
timeout 0
指定在一个 client 空闲多少秒之后关闭连接(0表示永不关闭)
tcp-keepalive 300
单位是秒,表示将周期性的使用SO_KEEPALIVE检测客户端是否还处于健康状态,避免服务器一直阻塞,官方给出的建议值是300s,如果设置为0,则不会周期性的检测
################################# GENERAL #####################################
daemonize yes
默认情况下 redis 不是作为守护进程运行的,如果你想让它在后台运行,你就把它改成 yes。当redis作为守护进程运行的时候,它会写一个 pid 到 /var/run/redis.pid 文件里面
supervised no
可以通过upstart和systemd管理Redis守护进程
选项:
supervised no - 没有监督互动
supervised upstart - 通过将Redis置于SIGSTOP模式来启动信号
supervised systemd - signal systemd将READY = 1写入$ NOTIFY_SOCKET
supervised auto - 检测upstart或systemd方法基于 UPSTART_JOB或NOTIFY_SOCKET环境变量
pidfile /var/redis/run/redis_6379.pid
配置PID文件路径,当redis作为守护进程运行的时候,它会把 pid 默认写到 /var/redis/run/redis_6379.pid 文件里面
loglevel notice
定义日志级别。
可以是下面的这些值:
debug(记录大量日志信息,适用于开发、测试阶段)
verbose(较多日志信息)
notice(适量日志信息,使用于生产环境)
warning(仅有部分重要、关键信息才会被记录)
logfile ""
日志文件的位置,当指定为空字符串时,为标准输出,如果redis已守护进程模式运行,那么日志将会输出到/dev/null
syslog-ident redis
系统日志的ID
syslog-facility local0
指定系统日志设置,必须是 USER 或者是 LOCAL0-LOCAL7 之间的值
databases 16
设置数据库的数目。默认的数据库是DB 0 ,可以在每个连接上使用select <dbid> 命令选择一个不同的数据库,dbid是一个介于0到databases - 1 之间的数值
################################ SNAPSHOTTING ################################
save <seconds> <changes>
save 900 1
save 300 10
save 60 10000
存 DB 到磁盘:
格式:save <间隔时间(秒)> <写入次数>
根据给定的时间间隔和写入次数将数据保存到磁盘
下面的例子的意思是:
900 秒内如果至少有 1 个 key 的值变化,则保存
300 秒内如果至少有 10 个 key 的值变化,则保存
60 秒内如果至少有 10000 个 key 的值变化,则保存
  
注意:你可以注释掉所有的 save 行来停用保存功能。
也可以直接一个空字符串来实现停用:
save ""
stop-writes-on-bgsave-error yes
如果用户开启了RDB快照功能,那么在redis持久化数据到磁盘时如果出现失败,默认情况下,redis会停止接受所有的写请求。
这样做的好处在于可以让用户很明确的知道内存中的数据和磁盘上的数据已经存在不一致了。
如果redis不顾这种不一致,一意孤行的继续接收写请求,就可能会引起一些灾难性的后果。
如果下一次RDB持久化成功,redis会自动恢复接受写请求。
如果不在乎这种数据不一致或者有其他的手段发现和控制这种不一致的话,可以关闭这个功能,
以便在快照写入失败时,也能确保redis继续接受新的写请求。
rdbcompression yes
对于存储到磁盘中的快照,可以设置是否进行压缩存储。
rdbchecksum yes
在存储快照后,我们还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,
如果希望获取到最大的性能提升,可以关闭此功能。
dbfilename dump.rdb
快照文件名
dir ./
快照存储目录
################################# REPLICATION #################################
replicaof <masterip> <masterport>
在从机上配置主机ip和端口号
masterauth <master-password>
配置主机密码,如果需要
replica-serve-stale-data yes
当一个 从机 与 主机 失去联系,或者复制正在进行的时候,
slave 可能会有两种表现:
1) 如果为 yes ,从机 仍然会应答客户端请求,但返回的数据可能是过时,
或者数据可能是空的在第一次同步的时候
2) 如果为 no ,在你执行除了 info he salveof 之外的其他命令时,
slave 都将返回一个 "SYNC with master in progress" 的错误
replica-read-only yes
从机只读模式
repl-diskless-sync no
主从数据复制是否使用无硬盘复制功能。
新的从站和重连后不能继续备份的从站,需要做所谓的“完全备份”,即将一个RDB文件从主站传送到从站。
这个传送有以下两种方式:
1)硬盘备份:redis主站创建一个新的进程,用于把RDB文件写到硬盘上。过一会儿,其父进程递增地将文件传送给从站。
2)无硬盘备份:redis主站创建一个新的进程,子进程直接把RDB文件写到从站的套接字,不需要用到硬盘。
在硬盘备份的情况下,主站的子进程生成RDB文件。一旦生成,多个从站可以立即排成队列使用主站的RDB文件。
在无硬盘备份的情况下,一次RDB传送开始,新的从站到达后,需要等待现在的传送结束,才能开启新的传送。
如果使用无硬盘备份,主站会在开始传送之间等待一段时间(可配置,以秒为单位),希望等待多个子站到达后并行传送。
在硬盘低速而网络高速(高带宽)情况下,无硬盘备份更好
repl-diskless-sync-delay 5
当启用无硬盘备份,服务器等待一段时间后才会通过套接字向从站传送RDB文件,这个等待时间是可配置的。
这一点很重要,因为一旦传送开始,就不可能再为一个新到达的从站服务。从站则要排队等待下一次RDB传送。因此服务器等待一段
时间以期更多的从站到达。
延迟时间以秒为单位,默认为5秒。要关掉这一功能,只需将它设置为0秒,传送会立即启动。
repl-ping-replica-period 10
从机向主机发出PING包的时间间隔,单位秒
repl-timeout 60
备份超时时间,必须定义比repl-ping-replica-period大
repl-disable-tcp-nodelay no
同步之后是否禁用从站上的TCP_NODELAY
如果你选择yes,redis会使用较少量的TCP包和带宽向从站发送数据。但这会导致在从站增加一点数据的延时。
Linux内核默认配置情况下最多40毫秒的延时。
如果选择no,从站的数据延时不会那么多,但备份需要的带宽相对较多。
默认情况下我们将潜在因素优化,但在高负载情况下或者在主从站都跳的情况下,把它切换为yes是个好主意。
repl-backlog-size 1mb
设置备份的工作储备大小。工作储备是一个缓冲区,当从站断开一段时间的情况时,它替从站接收存储数据,
因此当从站重连时,通常不需要完全备份,只需要一个部分同步就可以,即把从站断开时错过的一部分数据接收。
工作储备越大,从站可以断开并稍后执行部分同步的断开时间就越长。
只要有一个从站连接,就会立刻分配一个工作储备。
repl-backlog-ttl 3600
主站有一段时间没有与从站连接,对应的工作储备就会自动释放。
这个选项用于配置释放前等待的秒数,秒数从断开的那一刻开始计算,值为0表示不释放。
replica-priority 100
从站优先级是可以从redis的INFO命令输出中查到的一个整数。当主站不能正常工作时
redis sentinel使用它来选择一个从站并将它提升为主站。
低优先级的从站被认为更适合于提升,因此如果有三个从站优先级分别是10,
100,25,sentinel会选择优先级为10的从站,因为它的优先级最低。
然而优先级值为0的从站不能执行主站的角色,因此优先级为0的从站永远不会被redis sentinel提升。
默认优先级是10
------------------------
################################## SECURITY ###################################
requirepass foobared
设置redis的密码
rename-command CONFIG ""
命令重命名,设置为空字符串等于取消这个命令
################################### CLIENTS ####################################
maxclients 10000
最大客户端连接数量
############################## MEMORY MANAGEMENT ################################
maxmemory <bytes>
指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key
当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区,格式:maxmemory <bytes>
maxmemory-policy noeviction
当内存使用达到最大值时,redis使用的清除策略。有以下几种可以选择:
1)volatile-lru 利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used )
2)allkeys-lru 利用LRU算法移除任何key
3)volatile-random 移除设置过过期时间的随机key
4)allkeys-random 移除随机key
5)volatile-ttl 移除即将过期的key(minor TTL)
6)noeviction noeviction 不移除任何key,只是返回一个写错误 ,默认选项
maxmemory-samples 5
replica-ignore-maxmemory yes
从机忽略最大内存限制
############################# LAZY FREEING ####################################
############################## APPEND ONLY MODE ###############################
appendonly no
是否开启AOF,当 AOF 启用后,Redis 在启动阶段会加载 AOF 文件, 这是因为相比 RDB,AOF 提供更好的持久性。
appendfilename "appendonly.aof"
AOF文件名
# appendfsync always
appendfsync everysec
# appendfsync no
fsync() 调用用于告诉操作系统将数据写入硬盘而不是放入输出缓冲区中。
某些系统会马上将数据 flush 到硬盘中,而某些系统只是尽快尝试写入。 Redis 支持一下三种模式: * no 不调用 fsync,让操作系统决定什么时候真正写到硬盘 * always 每次写入都对 append only file 进行 fsync 操作。最慢,也是最安全的选项。 * everysec 每秒进行一次 fsync 操作,折中的做法。
no-appendfsync-on-rewrite no
为了缓和这种情况,可以在进行 BGSAVE 或者 BGREWRITEAOF 时禁止 fsync() 操作。 这意味着,当有子进程在保存的时候 Redis 的持久性相当于 “appendfsync no”。
当你的 Redis 延迟过大时可以将 no-appendfsync-on-rewrite 设置为 “yes”, 否则将其保持在 “no” 以保证持久性。
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
自动重写 append only file 选项。 当 AOF 文件增长到一定比例后,Redis 可以自动通过隐式调用 BGREWRITEAOF 命令来重写 AOF 文件。
Redis 会记录上一次 rewrite 的 AOF 文件大小(若从未进行 rewrite,Redis 会使用启动时的 AOF 文件大小)作为基准大小。
Redis 会比较当前大小和基准大小,若当前大小大于一定比例则触发 rewrite。 为了防止增长比例到了但是总数据量还是非常小的情况就触发 rewrite,你还需要指定一个 AOF rewritten 的最小大小。
通过将 auto-aof-rewrite-percentage 设置为 0 可以禁用此功能。
aof-load-truncated yes
当 Redis 启动时可能会发现 AOF 文件被截断了(不完整),这可能是由于系统崩溃了, 特别是 ext4 没有以 data=ordered 选项挂载的情况(在 Redis 崩溃而系统正常的情况下不会发生截断)。
当这种情况发生时,Redis 可以选择终止进程,或者加载 AOF 文件上尽可能多的数据(目前的默认行为)。
当 aof-load-truncated 设置为 yes, Redis 服务端在启动的时候发现加载的 AOF 文件是被截断的会发送一条日志来通知客户。 若 aof-load-truncated 设置为 no,服务端会以错误形式终止进程并拒绝启动。 这是需要用户在重启服务前使用 “redis-check-aof” 工具来修复 AOF 文件。
aof-use-rdb-preamble yes
当重写 AOF 文件时,Redis 可以使用 RDB 文件作为 AOF 文件的前导,这样可以更快地进行重写和恢复。