Redis
1.Nosql
Not only Sql
大数据时代的3V:
-
海量Volume
-
多样Variety
-
实时Velocity
互联网需求的3高:
-
高并发
-
高可扩
-
高性能
文档数据库MongDB
NotSql聚合类型
-
KV键值
-
Bson
-
列族
-
图形
NoSQL数据库的四大分类
- kv键值:
介绍{新浪:BerkeleyDB+redis,阿里:memcache+redis}
2.文档型数据库
bson格式比较多:
-
CouchDB
-
MongoDB:基于分布式文件存储的数据库
3.列存储数据库
-
Cassandra
-
HBase
-
分布式文件系统
4.图关系数据库
- 关系图
- 构建关系图谱
- Neo4J
- nfoGrid
四者对比
分布式数据库CAP原理
- 传统的ACID分别是
-
A(Atomoicity)原子性
-
C(Consistency)一致性
-
I(Isolation)独立性
-
D(Durability)持久性
2.CAP
-
C:(Consistency)强一致性
-
A:(Availability)可用性
-
P:(Partition tolerance)分区容错性
- BASE
-
基本可用(Basically Available)
-
软状态(soft state)
-
最终一致(Eventually consistent)
2.Redis
Redis:REmote DIctionary Server(远程字典服务器)
Redis特点:
-
支持数据的持久化
-
支持简单的key-value类型的数据,同时还提供list,set,hash,zset数据类
-
支持数据的备份,即master-slave模式的数据备份
Redis默认状态:
1.单进程 -----------以epoll函数包装进行
2.默认16个数据库,从0开始 可以用select 下标 选择库
3.默认端口是6379
命令:http://doc.redisfans.com/index.html
Redis的五大数据类型:
-
String(字符串)
-
Hash(哈希)
-
List(列表)
-
Set(集合)
-
Zset(有序集合)
key
keys * | ||
---|---|---|
exists key | ||
move key db | ||
expire key 秒钟 | ||
ttl key | 查看key多少秒过期 -1永不过期 -2已过期 | |
type key | 查看key的类型 |
String
set/get/del/append/strlen | |
---|---|
Incr/decr/incrby/decrby | |
getrange/setrange | 指定区域范围内的值[]/设定区域范围内的值 执行覆盖 |
setex(set with expire)/setnx | 键秒值/不存在添加 |
mset/mget/msetnx | |
getset | 先获值 后覆盖值 |
list(字符串链表)
1.Lpush/rpush/Lrange key start stop | 反的进 反的出/相反/ 类似foreach |
---|---|
2.Lpop /rpop | 移除末端数据并输出/移除始端数据并输出 |
3.Lindex | 按照索引下标获得元素 |
4.llen | 长度 |
5.lrem key value | 删除N个Value |
6.Ltrim key index index key | 开始index 结束index 截取指定范围的值赋值给key |
7.rpopLpush 源列表 目的列表 | |
8.lset key index value | |
9.linsert key before/after 值1 值2 | 插值在值1 前/后 |
Set
1.sadd key 值1 值2 值 /smembers key /sismenmber 是否有元在集合里面 | |
---|---|
2.scard | 获取集合里面的元素个数 |
3. srem key value | 删除集合中元素 |
4.srandmember key | 某个整数(随机出几个数) |
5.spop key | 随机出栈 |
6.smove key1 key2 value | 在key1里value值,赋值给key2 |
7.集合类{差集:sdiff,交集:sinter,并集:sunion} |
Hash
1.hset/hget/hmset/hmget/hgetall/hdel | |
---|---|
2.hlen | 长度 |
3.hkeys/hvals | |
4.hincrby/hincrbyfloat | |
5.hsetnx | |
Zset
1.zadd key score value score2 vlaue2 / zrange withscores | |
---|---|
2.zrangebyscore key 开始score 结束score | :(不包含 limt 下标 多少步 |
3.zrem key 某score 下对应的value值 删除 | |
4.zcard/zcount key score区间/zrank key value值,获得下标 | |
5.zrevrank key values 逆序获得下标值 | |
6.zrevrange 逆序打印 | |
7.zrevrangebyscore key socre socre2 结束到开始 |
3. Redis配置文件
解析配置文件Redis.conf
Redis日志级别
- debug
- verbose
- notice
- warning
Redis 6种缓存策略
- volatile-lru :使用lru算法移除key,只对设置了过期时间的键
- allkeys-lru :使用LRU算法移除key
- volatile-random :在过期集合中移除随机的key,只对设置了过期时间的键
- allkeys-random:移除随机的key
- volatile-ttl :移除那些ttl键最小的key,即那些最近要过期的key
- noeviction:不进行移除,只针对写操作,只是返回错误信息
**Redis 持久化 RDB/aof **
RDB(Redis Database)
- 保存的是dump.rdb文件
- 默认自动保存三种方式(触发自动保存): save 秒 修改key数量
- save 900 1
- save 300 10
- save 60 10000
- 如果不设置自动保存 sava “ ”
优势
- 适合大规模的数据恢复
- 对数据完整性和一致性要求不高
劣势
- redis突然down了,会丢失最后一次快照的所有修改
- fock的时候,内存的数据多一份。大概两倍的膨胀性
如何停止
- 动态所有停止RDB保存规则的方法:redis-cli config set save “”
总结 :
优
- Rdb是一个很紧凑的文件
- Rdb在保存rdb文件 父进程唯一需要做的就是fock一个子进程,所有工作都从子进程来保存与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些
劣
- 数据丢失风险大
- RDB需要经常fock一个子进程来保存数据到硬盘上,当数据集比较大的时候,fock的过程非常耗时导致redis在一些毫秒级不能响应客户端请求
Aof(append only file)
appendonly no 默认关闭
默认文件名字 appendonly.aof
记录每一步操作指令
Appendfsync :Always:同步持续化,性能差数据完整性比较好
Everysec:出厂默认推荐,异步操作,每秒记录,一秒内宕机,有数据丢是
No
修复 Redis-check-aof --fix 文件 进行修复
Rewrite :
-
是什么:Aof采用文件追加,越来越大,新增了重写机制,当aof文件大小超过阙值时,redis就会启动Aof文件的内容进行压缩,只保留可以恢复数据的最小指令集,可以使用命令bgrewriteaof
-
重写原理:Aof文件持续增大 ,会fork出一条新进程将文件重写
-
触发机制:Redis 会记录上次重写时Aof大小 默认配置是当文件大小是上次Rewrite后大小的一倍且文件大于64MB触发。
优势:
每秒同步,每修改同步,不同步
劣势:
- 相同数据集的数据 aof > Rdb,恢复速度慢于Rdb / Aof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同
小总结:
优
- Aof 只进行追加的日志文件
- Redis 可以在aof文件过大,自动在后台对aof进行重写
- Aof有序保存了对数据库执行的所有写入操作,这些操作对Redis协议的格式保存,因此Aof文件的内容非常容易被人读懂。
劣
- 相同数据集的数据 aof > Rdb,恢复速度慢于Rdb
- 所使用的fsync策略,aof速度会慢于rdb
Redis:先寻找aof文件 再寻找RDB文件。
总结:
Redis的事务
-
一组命令的集合,所有命令都会序列化
-
开启事务 MULTi
-
执行 EXEC
-
回滚 DISCARD
-
常用命令:DISCARD ,EXEC ,MULTi,UNWATCH,WATCH KEY
策略
- 正常执行 MULTI----EXEC
- 放弃事务 MULTI----DISCARD
- 全体连坐 指令错误 直接全部DISCARD
- 冤头再债主 执行时错误,只执行的命令错误 其他执行
- watch监控 :乐观锁
Redis事务 部分支持。
Redis消息订阅发布
- SUBSCRIBE 频道1,频道2,频道3
- PUBLISH 频道 消息
- 通配符 SUBSCRIBE new*
Redis 的复制
-
master 写,slaver 读 / master down机了, slaver 原地待命, 等待master 回
/ slaver down机了,变回master 需要重新连接 (配置到redis.conf 无视)。
-
读写分离/容灾恢复
-
命令
-
slaverof 主机号 端口
-
info replication 查看信息
-
slaverof no one 从slaverof 变为master
复制原理
方案
- 一 master 二 slaver (中心化太深)
- 去中心化 master ----- 一(slaver)-----slavers
- master(down) ----- slaver~ slaverof no one ~ change master-----slavers ~slaver
哨兵模式
- 生成一个sentinel.conf配置文件
- sentinel monitor 主机6379 主机号 端口 1
- 启动Redis-sentinel 配置文件位置
策略
- 当master down了 会从 slaver 投票选出一个当master
- 之前的master 又 up了 会是新的master 的slaver
复制延时
- 先在master操作,同步更新到salve上, 有一定的延迟,当系统繁忙,延迟会加重,slave机器数量也会使这个问题加重。