夜光序言:
年龄越大,越喜欢喝点小酒,因为心里有些话越来越说不出口。加班越久,越喜欢一个人走,因为想知道自己究竟还能忍受多久。
正文:五、Redis
1.NOSQL简介
NoSQL,泛指非关系型数据库,NoSQL数据库分为四大分类:
键值(key-value)存储数据库:这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据,如redis,voldemort,Oracle BDB
列存储数据库:这部分数据库通常用来应对分布式存储的海量数据,键仍然存在,特点是指向了多个列,如HBASE,riak
文档型数据库:该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如:json,文档型数据库可以看作是键值数据库的升级版,允许之间嵌套键值,而且文档数据库比键值数据库查询效率要高,比如:couchDB,MongoDB
图形(graph)数据库:图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上,NoSQL数据库没有标准的查询语言(SQL), 因此进行数据库查询需要制定数据模型,许多NoSQL数据库都有rest式数据接口或者查询API。如:Neo4j,infoGrid,infinite,Graph
2.非关系型数据库的特点
1.数据模型比较简单
2.需要灵活性更强的IT系统
3.对数据库性能要求较高
4.不需要高度的数据一致性
5.对于给定key,比较容易映射复杂值的环境
3.Redis简介
redis是以key-value形式存储的,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求(非关系型、分布式、开源)水平可扩展的
优点:对数据高并发读写
对海量数据的高效率存储和访问
对数据的可扩展性和高可用性
缺点:redis(ACID处理非常简单)
无法做到太复杂的关系数据模型
redis是以key-value store存储,data structure service数据结构服务器,键可以包含(String)字字符串,哈希,(list)链表,(set)集合,(zset)有序集合,这些数据集合都支持push/pop、add/remove及取交集和并集以及更丰富的操作,redis支持各种不同方式排序,为了保证效率,数据都是缓存在内存中,可以周期性的把更新的数据写入磁盘或者把修改操作写入追加到文件记录。
4.基本数据类型
redis分为5种基本数据类型:String、hash、list、set、zset
1.String:包含很多类型的特殊类型,并且是二进制安全的,比如:序列化的对象进行存储,,比如:一张图片进行二进制存储,一个简单的字符串或数值等。
set和get方法:
设置值:set
取值:get
删除值:del
2.hash类型
hash类型是string类型的field和value的映射表,或者是一个string的集合,适合存储对象,将一个对象类型存储在hash类型里要比存储在string类型里占用更少的内存空间,并方便存取整个对象
hset:含义是hash集合
hmset:可以进行批量存储多个键值对
hmget:可以进行批量获取多个键值对
hincrby和hdecyby:集合递增和递减
hexists是否存在key:如果存在返回,不存在返回0
hlen:返回hash集合里所有的键数值
hdel:删除指定hash的field
hkeys:返回hash里所有的字段
hvals:返回hash的所有value
hgetall:返回hash里所有的key和value
3.list类型
list类型是一个链表结构的集合,其功能有:push、pop、获取元素等。list类型是一个双端链表的结构,通过相关操作进行集合的头部和尾部添加删除元素,list的设计非常简单精巧,既可以作为栈也可以作为队列,满足大多数需求。
lpush方法:从头部加入元素(栈)先进后出
rpush方法:从尾部加入元素(队列),先进先出
linsert方法:插入元素
lset方法:将指定下标的元素替换掉
lrem方法:删除元素,返回删除的个数
ltrim方法:保留指定key的值范围内的数据
lpop方法:从list的头部删除元素,并返回删除元素
rpop方法:从list的尾部删除元素,并返回删除元素
rpoplpush方法:第一步从尾部删除元素,然后从头部加入元素
lindex方法:返回名称为key的list中index 位置的元素
llen方法:返回元素的个数
4.set和zset类型
set集合是string类型的无序集合,set通过hashtable实现的,对集合可以取交集、并集、差集
sadd方法:向名称为key的set中添加元素
srem方法:删除set集合元素
spop方法:随机返回删除的key
sdiff方法:返回两个集合的不同元素
sdiffstore方法:将返回的不同元素存储到另一个集合里
sinter方法:返回集合的交集
sinterstore方法:返回交集结果,放入另一个集合中
sunion方法:取并集
sunionstore方法:取得并集结果,放入另一个集合中
smove方法:从一个set集合移动到另一个set集合里
scard方法:查看集合里元素个数
sismember方法:判断某元素是否为集合中的元素
srandmember方法:随机返回一个元素
zadd方法:向有序集合添加一个元素,该元素如果存在,则更新顺序
zrem方法:删除名称为key的zset中元素member
zincrby方法:以指定值去自动递增或者递减,用法和之前的incrby类似
zrangebyscore方法:找到指定区间范围的数据进行返回
zremrangebyrank方法:删除1到1(只删除索引1)
zremrangebyscore方法:删除指定序号
zrank方法:返回排序索引,从小到大排序(升序排序之后再找索引)
zrevrank方法:返回排序索引,从大到小排序(降序之后再找索引)
zrangebyscore方法:找到指定区间范围的数据进行返回
zcard方法:返回集合里所有元素的个数
zcount方法:返回集合中score在给定区间中的数量
zremrangebyrank zset方法:删除索引
zremrangebyscore zset方法: 删除指定序号
5.redis高级命令及特性
返回满足的所有键keys * (可以模糊匹配)
exists:是否存在指定的key
expire:设定某个key的过期时间,使用ttl查看剩余时间
persist:取消过期时间
select:选择数据库,数据库为0-15(一共16个数据库)默认进入的是0的数据库
move key 数据库下标:将当前数据库中的key转移到其他数据库中
randomkey:随机返回数据库的一个key
rename:重命名key
echo:打印命令
dbsize:查看数据库的key数量
info:获取数据库信息
config get:实时传输收到的请求(返回相关的配置信息)
flushdb:清空当前数据库
fluishall:清空所有数据库
6.主从复制
1.master可以拥有多个slave
2.多个slave可以连接同一个master外,还可以连接其他的slave
3.主从复制不会阻塞master,在同步数据时,master可以继续处理client请求
4.提供系统的伸缩性
7.主从复制的过程:
1.slave与master建立连接,发送syns同步命令
2.master会开启一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存
3.后台完成保存后,将文件发送给slave
4.slave将此文件保存到硬盘上
8.主从复制配置:
clone服务器之后修改slave的IP地址
修改配置文件:redis.conf
1.slaveof<masterip><mastport>
2.masterauth<master-password>
使用info查看role角色即可知道是主服务或从服务
9.哨兵
有了主从复制的实现以后,如果想对主从服务器进行监控,那么在redis2.6以后提供了一个"哨兵"机制,哨兵的含义是监控redis系统的运行情况,其功能有两点:
1.监控主数据库和从数据看是否正常运行
2.主数据库出现故障时,可以自动将从数据库转换为主数据库,实现自动切换
实现步骤:
1.copy文件sentinel.conf到redis/etc中
2.修改配置文件:
sentinel monitor mymaster 192.168.1.101 ----名称、IP、端口、投票选举次数
sentinel down-after-milliseconds mynaster 5000 ----默认1s检测一次,这里配置5000ms为宕机
sentinel failover-timeout mymaster 9000000
sentinel parallel-syncs mymaster 2
sentinel can-failover mymaster yes
3.启动哨兵
4.查看哨兵相关信息命令
5.关闭主服务器查看集群信息
10.redis事务
redis的事务:首先是使用multi方法打开事务,然后进行设置,这时设置的数据都会放入队列里进行保存,最后使用exec执行,把数据依次存储到redis中,使用discard方法取消事务
redis事务不能保证同时成功或失败进行提交或回滚
11.持久化机制
redis是一个支持持久化的内存数据库,redis需要经常将内存中的数据同步到硬盘来保证持久化。redis持久化方式有两种:
1.snapshotting(快照):默认方式,将内存中以快照的方式写入二进制文件中,默认为dump.rdb,可以通过配置设置自动快照持久化方式,可以配置redis在n秒内如果超出m个key则修改为自动快照
snapshotting配置:
save 900 1 ----900秒内如果超过1个key被修改则发起快照保存
2.append-only file (缩写aof):由于快照方式是一定时间间隔做一次,所以可能发生redis意外down的情况就会丢失最后一次快照后的所有修改的数据,aof比快照方式更好的持久化,
当redis重新启动时会重新执行文件中保存的写命令来内存中重建这个数据的内容,这个文件在bin目录下,append.aof。aof不是立即写到硬盘上,可以通过配置文件修改强制写到硬盘中。
aop配置:
appendonly yes //启动aof持久化方式有三种修改方式
#appendfsync always //收到写命令就立即写入到磁盘,效率较慢,但是保证万千持久化
#appendfsync eversec //每秒钟写入磁盘一次,在性能和持久化方面做了很多折中
#appendfsync no //完全依赖os性能最好,持久化没保证
12.发布与订阅消息
redis提供了简单发布订阅功能
使用subscribe(频道)进行订阅监听
使用publish(频道)(发布内容)进行发布消息广播