redis的数据类型
String redis最常见的数据类型,表现形式为 key - value
hash 最方便存储对象的一种形式, 在对该类数据类型操作时,通常都会指定filed。表现形式 key filed value。有点想 map < key, map< filed,value>>
list 底层是连表形式,一个key中保存了多条String类型的数据,按照插入的时间进行排序,但可以指定数据插入到链表的头或者尾
set 跟java中的set数据结构一样,底层也是hashtable实现的,无序且key不能重复
zset 跟set是一致的,不同的是zset的每个元素都绑定了一个double类型的分数,来确定他们的排序,key不能重复但是分数能重复 有点像 key - value score ,。。。。。
单机版redis安装。
安装之前需要先安装gcc
下载redis解压包地址: wget http://download.redis.io/releases/redis-4.0.6.tar.gz- 解压安装包
Linux命令:tar zxvf xxxx - 编译解压后文件
Linux命令:定到解压包跟目录,make - 在src目录下执行 make install
- 把src下面的 redis-server,redis-cli,redis-benchmark 和 redis.conf 4个文件移动到一个文件夹下
- 根据实际要求,需要把redis以守护进程的模式进行运行
修改配置文件redis.conf中的daemonize 改完yes - 启动redis服务器(在你移动目的的文件夹里操作)
Linux命令:redis-server redis.conf - 虚拟件验证是否redis启动成功
Linux命令:redis-cli
set xxxx xxx
OK
get xxxx
xxx
到这里一个简单的redis就搭建好了,那么应该怎么我们本地程序应该怎么连接呢?
本地连接redis
- 在redis配置文件redis.conf中有一个 bind 127.0.0.1 这个配置,需要改成0.0.0.0(redis.conf的详解后续进行详细描述)
- 查看redis的端口号,这个也是在redis.conf中进行配置
- 通过Linux 命令 ifconfig查看
- 需要把虚拟机的防火墙关掉
Linux命令:/etc/init.d/iptables stop 虚拟件重启又会开启
chkconfig –level 35 iptables of 永久关闭
- 解压安装包
到这里你可以用redis客户端进行测试连接了。
集群版redis
注:集群的redis有两种实现方式。java代码层的实现,redis服务器层的实现。
1.java代码层的实现: 在redis 3.0以前 jedis提供了一个redis集群实现对象ShardedJedis实现。他的底层实现是通过哈希一致性来实现的,当有个key操作时,会对key进行哈希操作来获取到操作redis实例的节点
2.redis服务器层的实现:redis 3.0以后redis官方提供了一个实现集群的方式,他的实现原理是通过redis的哈希槽(2的14幂=16384)来分配给集群中的redis实例。当有key操作时会对key进行crc16 % 16384 来判断操作redis实例。
redis服务器层的集群搭建
1.准备好2个以上的redis实例(为什么是两个后做说明)
2.修改redis安装目录下的src下的redis.config中的端口号。以及打开Cluster-enable yes前面的注释。
3.需要一个ruby脚本。在redis源码文件夹下的src目录下。redis-trib.rb,把redis-trib.rb文件复制
到一个独立目录下(可以把redis-server,redis-cli,redis.config等多个文件放到一个独立的文件夹里)。
4.执行ruby脚本需要安装ruby环境
a.yum install ruby
b.yum install rubygems
c gem install redis-x.x.x.gem
5.启动所以的redis实例,建议写一个脚本
vim xxxxx.sh
写上你的执行命令
./xxxxx.sh
ps -aux|grep redis 查看你是否启动了所有的redis实例
6 执行redis-trib.rb 来创建集群
番外篇:redis-trib.rb的api 说明:
6.1 create 创建集群
./redis-trib.rb create --replicas 1(replicas表明需要几个slave,默认0个) 所有的redis实例,用空格隔开。
创建流程:6.1.1.为每个redis实例创建ClusterNode对象,像连接集群上的节点,检查每个节点是否独立且db为null的节点。执行load_info方法导入节点信息
6.1.2.检查Master节点的数量是否大于等于3个。只有大于3个节点才能组成集群
6.1.3.计算每个master需要分配的slot数量,以及给master分配的slave。
策略:a.尽可能保证master分配到更多的主机中,
b.对master数量取余来保证尽可能的平均分配slot
c.尽可能保证master和slave 分配在不同的主机上
d.如果master和slave通过replicas参数分配后还有未分配的节点,再次循环master节点,只分配一个slave直到全部分配完成
6.1.4.打印出集群的节点分配情况。输入yes后进行集群搭建。
6.2 check 检查集群
ruby redis-trib.rb check 集群中的一个节点
6.3 info 查看集群的信息
ruby redis-trib.rb info 集群中的一个节点
6.4 fix 修复集群
6.5 reshard 在线迁移slot
reshard host:port
--from <arg> 原master 可以选择all 集群的全部master done 暂时没测通
--to <arg> 目标master的ID
--slots <arg> 移动多少个slot
--yes
--timeout <arg> 设置migrate命令的超时时间。
--pipeline <arg> 定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10。
把slot从一个节点移动到另外一个节点
例:$ruby redis-trib.rb reshard --from all --to 80b661ecca260c89e3d8ea9b98f77edaeef43dcd --slots 11 10.180.157.199:6379
6.6 reblance 平衡集群节点slot数量
rebalance host:port 集群的一个节点
--weight <arg> 权重,默认为1
--threshold <arg>
--use-empty-masters rebalance是否考虑没有节点的master,默认没有分配slot节点的master是不参与rebalance的,设置--use-empty-masters可以让没有分配slot的节点参与rebalance。
--timeout <arg> 设置migrate命令的超时时间。
--simulate 设置该参数,可以模拟rebalance操作,提示用户会迁移哪些slots,而不会真正执行迁移操作。
--pipeline <arg> 定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10。
例如 ruby redis-trib.rb rebalance --threshold 1 --weight b31e3a2e=5 --weight 60b8e3a1=5 --use-empty-masters --simulate 10.180.157.199:6379
6.7 add-node 添加新节点进集群
add-node new_host:new_port existing_host:existing_port
--slave 设置该参数,则新节点以slave的角色加入集群
--master-id <arg> 这个参数需要设置了--slave才能生效,--master-id用来指定新节点的master节点。如果不设置该参数,则会随机为节点选择master节点。
例:ruby redis-trib.rb add-node --slave --master-id dcb792b3e85726f012e83061bf237072dfc45f99 10.180.157.202:6379 10.180.157.199:6379
6.8 del-node 从集群中删除节点
注意:只能删除没有分配slot的界定啊
ruby redis-trib.rb del-node host:port node_id
host:port:从该节点获取集群信息。
node_id:需要删除的节点id
6.9 set-timeout 设置集群节点间心跳机制的超时时间
例:ruby redis-trib.rb set-timeout 10.180.157.199:6379 30000
6.10 call 在集群所有节点执行命令
ruby redis-trib.rb call 10.180.157.199:6379 get key
参考资料:http://blog.csdn.net/huwei2003/article/details/50973967
Redis发散思维
- redis 如何对数据进行持久化的
redis的持久化有两个方式 RDB 和 AOF
RDB:在指定的时间间隔内生成数据集的时间点快照。
优点:他会根据配置(多久一次,10秒100个操作等)生成一个数据集的快照。这个快照内容紧密,而且可以传输到其他的数据中心,同时可以最大化保证redis性能,父进程在保存 RDB 文件时唯一要做的就是 fork 出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父进程无须执行任何磁盘 I/O 操作。同时RDB恢复数据的速度比AOF快
缺点:虽然保存数据的快照,但是每次保存数据越多,RDB的时间就越久,在这个时间redis挂掉,那么就会丢失好几分钟的数据。同时在进行RDB的时候,可能造成redis客户端对命令的处理效率的影响
AOF: 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。
优点:每秒钟一次 fsync ,或者每次执行写入命令时 fsync 。 AOF 的默认策略为每秒钟 fsync 一次,在这种配置下,Redis 仍然可以保持良好的性能,并且就算发生故障停机,也最多只会丢失一秒钟的数据。如果AOF的文件过大,redis还会对AOF文件进行重写。只有在重写完成后在回从老的文件切换到新的文件。AOF 文件是一个只进行追加操作的日志文件(append only log), 因此对 AOF 文件的写入不需要进行 seek , 即使日志因为某些原因而包含了未写入完整的命令(比如写入时磁盘已满,写入中途停机,等等), redis-check-aof 工具也可以轻易地修复这种问题