NoSQL:Not Only SQL。非关系型数据库。redis可以理解为就是map,以键值对的形式来保存数据
NoSQL的四大分类:
键值对存储数据库,使用一个哈希表。entry Redis,Oracle BDB
列存储。键依然存在 HBase
文档型数据库。以文档形式 MogoDB SQLite
图形数据库 Graph
Redis特点:
redis高性能的key/value内存型数据库
redis支持比较丰富的数据类型
redis支持持久化 memacached不支持持久化
Redis单线程,安全。
redis配置文件
port 端口号
redis默认提供了16个库,索引0-15,每个库之间是相互隔离互不干扰的
Redis数据类型
String------------String
set:设置一个key/value
get:根据可以获取对应的value
mset:一次性设置多个key,value
mget:批量获取多个key对应的value值
getset:获取原始key的值,同时设置新值
strlen:获取key对应value的长度
append:为对应的key追加
getrange:从索引为0处开始截取,-1代表截取到末尾(包含起始和终止位置)
expire:设置一个key过期时间
setex:设置一个key的有效期(秒)
psetex:设置一个key的有效期(毫秒)
setnx:设置一个key/value,如果不存在就添加,如果存在,就不做任何操作
msetnx:批量设置,原子操作,可以同时设置多个key,只要有一个key存在,则全部失败
decr:进行数值类型的-1的操作
decrby:根据提供的数据进行减法操作
incr:进行数值类型的加一的操作
incrby:根据提供的数据进行加法操作
incrbyfloat:进行数值的加减浮点数的操作
list-----------List
lpush:将某个值加入到一个key列表的头部
lrange:获取某一个下标区间内的元素
rpush:将某个值加入到一个key的尾部
lpushx:同lpush,必须保证list存在
rpushx:同rpush,必须保证list是存在的
lpop:返回和移除左边列表的元素
rpop:返回和移除列表右边的第一个元素。
llen:获取列表元素个数。
lset:设置某一个指令索引的值(索引必须存在)
lindex:获取某个位置指定索引的元素
lrem:删除重复元素
ltrim:保留列表中特定区间内的元素
linsert:在某个元素之前、之后插入新元素
set-----------Set
sadd:为集合添加元素
smembets:显示集合中所有的元素
scard:返回集合中元素的个数
spop:随机返回一个元素,并删除
smove:从一个集合中向另一个集合中移动元素
srem:从集合中删除一个元素
sismember:判断一个集合中是否包含着各元素
srandermember:随机返回元素
sdiff:去掉第一个集合中含有的第二个集合的元素
sinter:求交集
sunion:求并集
zset-------------TreeSet
hash-------Map
hset设置一个键值对
hget:获取一个key对应的value
hgetall:获取所有的key、value对
hdel:删除某一个key/value对
hexists:判断一个key是否存在
hkeys:获得所有的keys
hvals:获得所有的value
hmset:设置多个key/value
hsetnx:设置一个不存在key的值‘
hincrby:给value进行加法计算
hincrbyfloat:给value加浮点值
Redis持久化机制
持久化机制:
内存-->磁盘
redis官方提供了两种不同的持久化机制。
快照持久化(snapshot)
AOF(append only file)只追加日志文件
快照
这种方式可以将某一时刻的所有数据写入硬盘中,这也是redis默认开启的持久化方式,保存的文件是以.rbd的形式结尾,也称之为RDB持久化。
快照的生成方式
客户端方式 :BFSAVE或SAVE命令
服务器配置自动触发
关闭redis服务器
AOF持久化
这种方式将所有客户端执行的写的命令记录到日志中,将被执行的命令写到.aof结尾的文件末尾。只要redis从头到尾执行一次aof文件所包含的所有写的命令,就可以恢复aof文件记录的数据集合。(默认不开启)
如果快照持久化与AOF持久化同时开启,默认是以AOF持久化为主。
日志追加频率
always【谨慎使用】:每个redis写命令同步写入磁盘,严重降低redis速度。
everysec【推荐】:每秒执行一次同步,将多个写命令同步到磁盘。
no【不推荐】:由操作系统决定何时同步。
2.AOF带来的问题:
持久化文件appendonly.aof会越来越大
假设我们使用incr age 10000次,执行一次set age 10000就够了。
AOF重写(优化)
用来在一定程度上减少AOF文件的体积。
只需要执行BGREWRITEAOF
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
当aof文件大于64MB,并且aof文件的体积比上一次重写之后体积大了至少100%,会自动触发重写,如果重写过于频繁,可以考虑加大percentage设置为更大。
持久化总结:
这两种持久化方案既可以同时使用aof,又可以单独使用,在某种情况下也可以都不使用。无论是用那种持久化方案,将数据持久化到硬盘上。还应该对数据进行定期的备份,备份到不同的地方。
Redis事务控制
什么是事务?事务的四大特性?
开启事务:MULTI
提交事务:EXEC
放弃事务:DISCARD
说明:
如果在操作事务的过程中,出现了报错,视为当前事务被放弃(全体连坐)
如果在操作事物的过程中,只要不出现报错,在提交事务时出现报错,视为报错的操作不提交,其余操作正常提交事务。(冤头债主)
主从复制架构
集群
由一系列有关服务器构成的一种架构。
主从复制
当设置好 slave 服务器后,slave 会建立和 master 的连接,然后发送 sync命令。无论是第一次同步建立的连接还是连接断开后的重新连接,master 都会启动一个后台进程,将数据库快照保存到文件中,同时 master 主进程会开始收集新的写命令并缓存起来。后台进程完成写文件后,master 就发送文件给 slave,slave 将文件保存到磁盘上,然后加载到内存恢复数据库快照到 slave 上。接着 master 就会把缓存的命令转发给 slave。而且后续 master 收到的写命令都会通过开始建立的连接发送给slave。从master到slave的同步数据的命令和从客户端发送的命令使用相同的协议格式。当 master 和 slave 的连接断开时 slave 可以自动重新建立连接。如果 master 同时收到多个 slave 发来的同步连接命令,只会启动一个进程来写数据库镜像,然后发送给所有 slave。
配置 slave服务器很简单,只需要在配置文件中加入如下配置
slaveof 192.168.1.1 6379 #指定 master的 ip 和端口。
由来解决数据的冗余备份。从节点仅仅用来同步数据、
主节点出现故障,从节点就无法定期的同步数据?
主节点宕机,从节点无法担任主节点,从节点一直在重复获取连接
从节点再次重新启动时,从节点会自动连接,并且可以进行正常主从复制。
哨兵模式
单节点并发压力问题?
哨兵的配置文件:
编辑:sentienl.conftong
sentinel monitor mymaster 127.0.0.1 6379 1
编译:windows系统下无法编译
通过指令启动哨兵服务
redis-sentinel sentinel/sentinel.conf
三大现象:
穿透:
根据key从缓存中查不到数据,需要从数据库中查询数据,数据库中也查询不到数据,导致数据库扛不住压力而挂掉。
解决方案:
业务规则过滤
布隆过滤器,检验key长度或者前缀,过滤一批非法数据。
雪崩:
更严重的击穿,击穿只是一个key失效了。
大量的请求访问大量的key,刚好大量key同时失效。
击穿:
大量的请求访问同一个key,这个key过期了,大量的强求直接访问数据库,可能把数据库搞挂了。
解决方案:
业务规则过滤
加锁