NoSql数据库之Redis
1、什么是nosql,nosql的应用场景
2、Nonsql数据库的类型
a) Key-value
b) 文档型(类似于json)
c) 列式存储
d) 图式
3、redis的相关概念kv型的。
4、Redis的安装及部署
5、Redis的使用方法及数据类型
a) Redis启动及关闭
b) Redis的数据类型
i. String类型
ii. Hash类型
iii. List类型
iv. Set类型
v. SortedSet(zset)
6、redis数据库的持久化
a) Rdb快照形式
b) Aof命令形式
7、主从复制
8、Redis集群
2 什么是nosql
2.1 nosql
Nosql=Not only sql,非关系型数据库。
Web1.0:内容输出型网站。类似于搜狐、网页、新浪。
Web2.0:交互型的网站。例如人人网、微博等。
关系型数据库遇到的问题:
1、High performance - 对数据库高并发读写的需求
2、大数据量存储。
3、High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求
此时nosql数据出现了。
2.2 Nosql数据库的类型
1、key-value类型。常用的就是redis。可以用作缓存使用。
2、文档型。Mongodb。存储的是类似于json的数据bson。
3、列式存储。Hbase。基于hadoop的数据库。
4、图式存储。典型应用:社交网络
3 Redis的相关概念
3.1 什么是redis
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如
下:
字符串类型
散列类型
列表类型
集合类型
有序集合类型。
3.2 Redis的应用场景
缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用)
分布式集群架构中的session分离。
聊天室的在线好友列表。
任务队列。(秒杀、抢购、12306等等)
应用排行榜。
网站访问统计。
数据过期处理(可以精确到毫秒)
4 Redis的安装及部署
4.1 Redis部署环境
需要linux系统,centos6.4
Redis同样也有windows版本,可以练习使用。官方不典型支持。推荐使用linux版本。
需要gcc的开发环境。
4.2 Redis的下载
http://redis.io/
在这里插入图片描述
最新版本:3.0.3
本课程的版本:3.0.0
在这里插入图片描述
是一个redis的源码包,c语言开发的。
4.3 安装步骤
第一步:安装linux虚拟机。Centos6.4(32位)
第二步:把源码包上传到服务器。
第三步:解压源码包。
tar -zxvf redis-3.0.0.tar.gz
第四步:编译源码,需要gcc的环境。如果没有就安装一个,需要联网。
安装gcc:yum install gcc-c++
编译源码:进入源码目录,make。
第五步:安装
make install PREFIX=/usr/local/redis
PREFIX:指定安装目录
在这里插入图片描述
4.4 启动和关闭
4.4.1 前端启动模式
在bin 目录下执行:
./redis-server
在这里插入图片描述
4.4.2 后端启动模式
需要redis.conf配置文件:
在这里插入图片描述把此文件复制到redis的目录。
修改redis.conf文件:daemonize yes(默认是no)
启动:
./redis-server redis.conf
需要指定一个配置文件。
4.4.3 关闭redis
1、kill进程
2、正常关闭
./redis-cli -h 192.168.25.147 -p 6379 shutdown
-h:服务的ip地址
-p:端口号
如果是本地服务,而且端口是6379这些参数可以省略。
4.5 Redis的客户端
4.5.1 Redis自带客户端:redis-cli
简单命令:
Ping:测试服务器是否还活着。
Set:命令,添加一个key
Set key value
例子:
127.0.0.1:6379> set key1 100
OK
Get命令,取一个key的值
Get key
例子:
127.0.0.1:6379> get key1
“100”
4.5.2 Java的客户端Jedis
如果远程连接失败,查看linux 的防火墙是否开放redis的服务端口。
第一种方法:关闭防火墙:
service iptables stop
第二种方法:修改配置文件开放指定端口。
第一步:修改:
vim /etc/sysconfig/iptables
在这里插入图片描述第二步:重启防火墙服务
[root@localhost ~]# service iptables restart
iptables: Flushing firewall rules: [ OK ]
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Unloading modules: [ OK ]
iptables: Applying firewall rules: [ OK ]
4.6 图像客户端
在这里插入图片描述
Redis中默认有16个数据库。0-15号。默认操作0号库。
使用命令切换数据库:
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> select 16
(error) ERR invalid DB index
127.0.0.1:6379> select 15
OK
127.0.0.1:6379[15]>
库和库之间相互隔离,不同的库中可以有相同的key。
数据库的数量在redis.conf中配置:
在这里插入图片描述
5 Redis中的数据类型
5.1 String类型
基础数据类型。在redis中所有的值都是字符串。在redis中命令不区分大小写。
1、set命令:添加一个key
2、get命令:取一个key
3、Incr命令:加一命令。如果key的值是数值类型可以使用此命令。
127.0.0.1:6379> incr a
(integer) 101
4、decr命令:减一命令
127.0.0.1:6379> decr a
(integer) 100
5、del命令:删除key
127.0.0.1:6379> del a
(integer) 1
127.0.0.1:6379> get a
(nil)
5.2 Hash类型
Key-value(hash)-key-value
|-key-value
|-key-value
命令:
1、Hset命令:添加一个key
Hset key hashkey value
127.0.0.1:6379> hset hash1 a 1
(integer) 1
2、hmset:批量添加key
Hmset key hkey1 value hkey2 value hkey3 value …
127.0.0.1:6379> hmset hash2 a 1 b 2 c 3 d 4
OK
3、hget命令:取一个hash key
127.0.0.1:6379> hget hash1 a
“1”
4、hmget命令:取多个hash key
127.0.0.1:6379> hmget hash2 a b c
“1”
“2”
“3”
4、自增命令:hincrby
127.0.0.1:6379> hmget hash2 a b c
“1”
“2”
“3”
127.0.0.1:6379> hincrby hash2 a 10
(integer) 11
5.3 List类型
Redis中是链表形式的存储。
可以当做队列使用,也可以当做栈使用。
1、在左边添加元素:lpush
Lpush key value1 value2 value3
127.0.0.1:6379> lpush list1 a b c d e f
(integer) 6
127.0.0.1:6379>
2、右边添加元素:rpush
127.0.0.1:6379> rpush list1 1 2 3 4 5
(integer) 11
在这里插入图片描述3、取最左边元素:lpop,取完列表中此元素删除。
127.0.0.1:6379> lpop list1
“f”
4、取最右元素:rpop
127.0.0.1:6379> rpop list1
“5”
127.0.0.1:6379>
5、查看列表中的元素:lrange
Lrange key 起始下标 结束下标(取全部的结束下标就是-1)
127.0.0.1:6379> lrange list1 0 3
“e”
“d”
“c”
“b”
127.0.0.1:6379> lrange list1 0 -1
“e”
“d”
“c”
“b”
“a”
“1”
“2”
“3”
“4”
127.0.0.1:6379>
5.4 Set类型
特点:集合中的元素是无序的并且没有重复的。
5.4.1 命令
1、向集合中添加元素:sadd
Sadd key value1 value2 value3 …
127.0.0.1:6379> sadd set1 a b c d e
(integer) 5
2、删除元素:srem
Srem key value
127.0.0.1:6379> srem set1 a
(integer) 1
3、查看集合中的元素:smembers
Smembers key
127.0.0.1:6379> smembers set1
“c”
“d”
“b”
“e”
127.0.0.1:6379>
5.4.2 集合的运算
1、差集运算
属于A并且不属于B的元素构成的集合。
在这里插入图片描述SDIFF key [key …]
127.0.0.1:6379> sadd seta a b c d e
(integer) 5
127.0.0.1:6379> sadd setb c d e f g
(integer) 5
127.0.0.1:6379> sdiff seta setb
“a”
“b”
2、交集运算
属于A且属于B的元素构成的集合。
在这里插入图片描述SINTER key [key …]
127.0.0.1:6379> sinter seta setb
“c”
“d”
“e”
127.0.0.1:6379>
5.4.3 并集运算
属于A或者属于B的元素构成的集合
在这里插入图片描述
SUNION key [key …]
127.0.0.1:6379> sunion seta setb
“c”
“d”
“b”
“a”
“f”
“e”
“g”
5.5 SortedSet类型(zset)
特点集合但是是有序的。在此集合中每个元素都有一个分数,可以根据分数升序排列。
5.5.1 命令
1、添加元素命令:zadd
Zadd key 得分 元素 得分 元素 。。。。。
127.0.0.1:6379> zadd zset1 1 a 2 b 3 c 4 d
(integer) 4
2、删除元素:zrem
127.0.0.1:6379> zrem zset1 a
(integer) 1
3、查看计划中的元素:zrange
Zrange key 起始下标 结束下标(-1全部)withscores(带分数)
127.0.0.1:6379> zrange zset1 0 -1
“b”
“c”
“d”
127.0.0.1:6379> zrange zset1 0 -1 withscores
“b”
“2”
“c”
“3”
“d”
“4”
4、降序排列:zrevrange
127.0.0.1:6379> zrevrange zset1 0 -1 withscores
“d”
“4”
“c”
“3”
“b”
“2”
适用于应用排行榜。
6 Keys命令
6.1 可以设置key的有效期。
1、设置有效期:expire
Expire key 生存期(以秒为单位)
127.0.0.1:6379> set a 100
OK
127.0.0.1:6379> expire a 30
(integer) 1
2、查看key的生存期
Ttl key
-1:永久
-2:key不存在
3、持久化keypersist,可以把key持久化保存
127.0.0.1:6379> persist a
(integer) 1
6.2 其他keys命令
Keys命令,可以查看数据库中所有的可以列表。
127.0.0.1:6379> keys *
“list1”
“zset1”
“a”
“hash2”
“key1”
“setb”
“seta”
“list”
“hash1”
“hello”
“set1”
7 Redis的持久化
两种方案:
1、快照形式RDB形式。(默认开启)
2、Aof形式。命令形式存储。(需要手动开启)
Rdb:速度快。丢失数据的概率大。
Aof:默认每秒钟保存一次命令。性能低,可靠性高。最多丢失一秒的数据。
需要在redis.conf中配置。
Rdb:
在这里插入图片描述
Aof方案:(append only file)
在这里插入图片描述
两种方案同时开启,使用aof恢复数据。
8 主从复制
只需要修改redis.conf文件就可以。
需要配置两个虚拟机,如果不能实现,至少需要两个数据库实例。
第一步:创建slave服务器的实例。
1、把redis的bin目录复制一份。
2、修改redis.conf文件。修改端口号。
在这里插入图片描述第二步:配置从服务器,主服务器不需要做任何修改。修改从服务器的redis.conf文件。
在这里插入图片描述第三步:启动从服务器
9 redis集群
9.1 集群架构图
在这里插入图片描述
9.2 集群中的槽slot
槽是用来存储key。
9.3 redis-cluster投票:容错
在这里插入图片描述
(1)领着投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉.
(2):什么时候整个集群不可用(cluster_state:fail)?
a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完成时进入fail状态. ps : redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.
b:如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态.
ps:当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误
9.4 安装步骤
第一步:需要6台虚拟机。至少需要6个redis实例。
在这里插入图片描述第二步:修改每个实例的端口7001~7006。需要修改redis.conf文件。
第三步:安装ruby环境
安装ruby
yum install ruby
yum install rubygems
安装ruby和redis的接口程序
拷贝redis-3.0.0.gem至/usr/local下
执行:
gem install /usr/local/redis-3.0.0.gem
第四步:在/root/redis-3.0.0/src目录下有一个redis-trib.rb文件就是一个ruby的脚本文件,是用来创建redis集群的脚本文件。把此文件复制到/usr/local/redis-cluster目录下。
第五步:修改每个实例的redis.conf文件。
在这里插入图片描述第六步:启动每个实例。
在这里插入图片描述第七步:使用redis-trib.rb脚本创建集群。
./redis-trib.rb create --replicas 1 192.168.25.147:7001 192.168.25.147:7002 192.168.25.147:7003 192.168.25.147:7004 192.168.25.147:7005 192.168.25.147:7006
[root@localhost redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.25.147:7001 192.168.25.147:7002 192.168.25.147:7003 192.168.25.147:7004 192.168.25.147:7005 192.168.25.147:7006
Creating clusterConnecting to node 192.168.25.147:7001: OKConnecting to node 192.168.25.147:7002: OKConnecting to node 192.168.25.147:7003: OKConnecting to node 192.168.25.147:7004: OKConnecting to node 192.168.25.147:7005: OKConnecting to node 192.168.25.147:7006: OKPerforming hash slots allocation on 6 nodes…Using 3 masters:192.168.25.147:7001192.168.25.147:7002192.168.25.147:7003Adding replica 192.168.25.147:7004 to 192.168.25.147:7001Adding replica 192.168.25.147:7005 to 192.168.25.147:7002Adding replica 192.168.25.147:7006 to 192.168.25.147:7003M: a96e224fe9aa5667a908a721c18aeeb78c0e628d 192.168.25.147:7001slots:0-5460 (5461 slots) masterM: 22f03de15a3fd7260f5efa83539a342b94f07032 192.168.25.147:7002slots:5461-10922 (5462 slots) masterM: 75ccb72ea57cce1fbd951117c021d385f126b894 192.168.25.147:7003slots:10923-16383 (5461 slots) masterS: 2525654870fee9fa3a06d96c08f39e5c0912afea 192.168.25.147:7004replicates a96e224fe9aa5667a908a721c18aeeb78c0e628dS: f153fb80c15168d6701d7ef2b5fddaff2f82ffef 192.168.25.147:7005replicates 22f03de15a3fd7260f5efa83539a342b94f07032S: 6d6565162bd0550f29fff20fe52ea6178f748fa1 192.168.25.147:7006replicates 75ccb72ea57cce1fbd951117c021d385f126b894Can I set the above configuration? (type ‘yes’ to accept): yesNodes configuration updatedAssign a different config epoch to each nodeSending CLUSTER MEET messages to join the clusterWaiting for the cluster to join…Performing Cluster Check (using node 192.168.25.147:7001)M: a96e224fe9aa5667a908a721c18aeeb78c0e628d 192.168.25.147:7001slots:0-5460 (5461 slots) masterM: 22f03de15a3fd7260f5efa83539a342b94f07032 192.168.25.147:7002slots:5461-10922 (5462 slots) masterM: 75ccb72ea57cce1fbd951117c021d385f126b894 192.168.25.147:7003slots:10923-16383 (5461 slots) masterM: 2525654870fee9fa3a06d96c08f39e5c0912afea 192.168.25.147:7004slots: (0 slots) masterreplicates a96e224fe9aa5667a908a721c18aeeb78c0e628dM: f153fb80c15168d6701d7ef2b5fddaff2f82ffef 192.168.25.147:7005slots: (0 slots) masterreplicates 22f03de15a3fd7260f5efa83539a342b94f07032M: 6d6565162bd0550f29fff20fe52ea6178f748fa1 192.168.25.147:7006slots: (0 slots) masterreplicates 75ccb72ea57cce1fbd951117c021d385f126b894[OK] All nodes agree about slots configuration.Check for open slots…Check slots coverage…[OK] All 16384 slots covered.[root@localhost redis-cluster]#
9.5 连接集群
9.5.1 使用redis-cli连接集群
redis01/redis-cli -p 7005 -c
连接集群必须添加-c参数。
9.5.2 查看集群信息
192.168.25.147:7003> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:3
cluster_stats_messages_sent:827
cluster_stats_messages_received:827
9.5.3 查看集群节点状态
192.168.25.147:7003> cluster nodes
22f03de15a3fd7260f5efa83539a342b94f07032 192.168.25.147:7002 master - 0 1438330186924 2 connected 5461-10922
6d6565162bd0550f29fff20fe52ea6178f748fa1 192.168.25.147:7006 slave 75ccb72ea57cce1fbd951117c021d385f126b894 0 1438330185914 6 connected
f153fb80c15168d6701d7ef2b5fddaff2f82ffef 192.168.25.147:7005 slave 22f03de15a3fd7260f5efa83539a342b94f07032 0 1438330186420 5 connected
a96e224fe9aa5667a908a721c18aeeb78c0e628d 192.168.25.147:7001 master - 0 1438330188440 1 connected 0-5460
75ccb72ea57cce1fbd951117c021d385f126b894 192.168.25.147:7003 myself,master - 0 0 3 connected 10923-16383
2525654870fee9fa3a06d96c08f39e5c0912afea 192.168.25.147:7004 slave a96e224fe9aa5667a908a721c18aeeb78c0e628d 0 1438330187431 1 connected
9.6 添加节点
9.6.1 第一步:
创建一个新的redis实例,如果文件中存在nodes.conf,需要删除。
9.6.2 第二步:
修改redis.conf文件。修改端口,允许集群。
9.6.3 第三步:
启动服务器
9.6.4 第四步:
使用redis-trib.rb向集群添加节点。
[root@localhost redis-cluster]# ./redis-trib.rb add-node 192.168.25.147:7007 192.168.25.147:7001
Adding node 192.168.25.147:7007 to cluster 192.168.25.147:7001Connecting to node 192.168.25.147:7001: OKConnecting to node 192.168.25.147:7006: OKConnecting to node 192.168.25.147:7002: OKConnecting to node 192.168.25.147:7003: OKConnecting to node 192.168.25.147:7005: OKConnecting to node 192.168.25.147:7004: OKPerforming Cluster Check (using node 192.168.25.147:7001)M: a96e224fe9aa5667a908a721c18aeeb78c0e628d 192.168.25.147:7001slots:0-5460 (5461 slots) master1 additional replica(s)S: 6d6565162bd0550f29fff20fe52ea6178f748fa1 192.168.25.147:7006slots: (0 slots) slavereplicates 75ccb72ea57cce1fbd951117c021d385f126b894M: 22f03de15a3fd7260f5efa83539a342b94f07032 192.168.25.147:7002slots:5461-10922 (5462 slots) master1 additional replica(s)M: 75ccb72ea57cce1fbd951117c021d385f126b894 192.168.25.147:7003slots:10923-16383 (5461 slots) master1 additional replica(s)S: f153fb80c15168d6701d7ef2b5fddaff2f82ffef 192.168.25.147:7005slots: (0 slots) slavereplicates 22f03de15a3fd7260f5efa83539a342b94f07032S: 2525654870fee9fa3a06d96c08f39e5c0912afea 192.168.25.147:7004slots: (0 slots) slavereplicates a96e224fe9aa5667a908a721c18aeeb78c0e628d[OK] All nodes agree about slots configuration.Check for open slots…Check slots coverage…[OK] All 16384 slots covered.Connecting to node 192.168.25.147:7007: OKSend CLUSTER MEET to node 192.168.25.147:7007 to make it join the cluster.[OK] New node added correctly.
9.6.5 第五步:分配槽。
添加完主节点需要对主节点进行hash槽分配这样该主节才可以存储数据。
redis集群有16384个槽,集群中的每个结点分配自已槽,通过查看集群结点可以看到槽占用情况。
在这里插入图片描述
给刚添加的7007结点分配槽:
1:连接上集群
./redis-trib.rb reshard 192.168.101.3:7001(连接集群中任意一个可用结点都行)
2:输入要分配的槽数量
在这里插入图片描述
输入 500表示要分配500个槽
3:输入接收槽的结点id
在这里插入图片描述这里准备给7007分配槽,通过cluster nodes查看7007结点id为15b809eadae88955e36bcdbb8144f61bbbaf38fb
输入:15b809eadae88955e36bcdbb8144f61bbbaf38fb
4:输入源结点id
在这里插入图片描述这里输入all
5:输入yes开始移动槽到目标结点id
在这里插入图片描述
9.6.6 第六步:给7007实例添加一个新的从服务器
1、创建一个新的redis实例
2、配置实例的端口号为7008
3、使用ruby脚本添加从节点。
执行如下命令:
./redis-trib.rb add-node --slave --master-id a66a2d3239122ad51f88fb6d1a0428effc18f98d 192.168.25.147:7008 192.168.25.147:7001
9.7 删除结点:
./redis-trib.rb del-node 127.0.0.1:7005 4b45eb75c8b428fbd77ab979b85080146a9bc017
删除已经占有hash槽的结点会失败,报错如下:
[ERR] Node 127.0.0.1:7005 is not empty! Reshard data away and try again.
需要将该结点占用的hash槽分配出去(参考hash槽重新分配章节)。
作者:kruppwang1
来源:CSDN
原文:https://blog.csdn.net/kruppwa...
版权声明:本文为博主原创文章,转载请附上博文链接!