redis 02 集群搭建
Something before start
主从复制+烧饼机制也可以做成集群。不过现在更常用的是cluster集群。他不用像烧饼机制那样开一个新的进程。不过他底层是烧饼机制代码的复用,就是🐂🍺就完事了。
原理
- key通过
crc16(key)%16384
哈希映射到slot(槽)。
- 创建集群时,根据节点数分配slot。
- 利于数据迁移,直接迁移slot就行。
- 容错
- 节点失效判断:半数以上的master判断为
sdown
就变成odown
- 集群失效判断:
-
- 任意无slave的master挂掉,集群进入fail状态。
-
- 超过半数master挂掉,集群fail
环境
- ruby
- 安装ruby和redis的接口程序。这里可以查看下载命令。
- 搞六个备份出来,端口7001~7006。我弄在目录
/usr/local/redis-cluster/
下。
先到local目录下。
cp -r redis-5.0.7/ ./redis-cluster/redis-7001
redis.conf相关修改
port 7001
cluster-enabled yes
dir "./"
复制其他5份。然后其他的端口修改一下就可。
cp -r redis-7001/ redis-7002
cp -r redis-7001/ redis-7003
cp -r redis-7001/ redis-7004
cp -r redis-7001/ redis-7005
cp -r redis-7001/ redis-7006
搭建集群
写个脚本 start-all.sh
#创建个文件
vi start-all.sh
#文件里添加
cd redis-7001
redis-server redis.conf
cd ..
cd redis-7002
redis-server redis.conf
cd ..
cd redis-7003
redis-server redis.conf
cd ..
cd redis-7004
redis-server redis.conf
cd ..
cd redis-7005
redis-server redis.conf
cd ..
cd redis-7006
redis-server redis.conf
cd ..
创建集群
新版本用redis-cli
。旧版本用redis-trib.rb
。
#查看参数怎么写
redis-cli --cluster help
redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1
命令中间需要输入个yes。到这里集群创建成功。
7001~7003作为master,后三个作为slave。
命令行连接
连接:
#-c代表cluster
redis-cli -p 7001 -c
连接之后,你使用set
命令,如果不是在对应的槽的master里,会自动重定向到相应的master。
Redis 整合 Lua
lua 安装 //可以不装 redis有内置的
user 目录下.(如果有问题应该是权限问题 加个sudo就可)
curl-R-O http://www.lua.org/ftp/lua-5.3.4.tar.gz
tar zxf lua-5.3.4.tar.gz
cd lua-5.3.4
make machos test
sudo make install
安装成功后
#查看版本号
lua -v
#进入命令行
lua
> print("hello Sarise")
hello Sarise
>
EVAL 命令
EVAL命令就是redis调用lua。
进入redis命令行。
EVAL script numkeys key [key ...] arg [arg ...]
#格式 :
#script:lua脚本 需要返回值
#numkeys key个数
#key key列表
#参数列表
script内可以调用redis命令:redis.call()``redis.pcall()
//这两个差别在于处理错误方法不同
举例:
127.0.0.1:6381> EVAL "return redis.call('set',KEYS[1],ARGV[1])" 1 sarise "cool booy"
OK
127.0.0.1:6381> get sarise
"cool booy"
EVALSHA命令 SCRIPT命令
EVALSHA会将脚本缓存,不会每次都重新编译。
EVALSHA sha1 numkeys key [key ...] arg [arg ...]
# 和eval差别就是将脚本换成了sha1
使用时需要配合SCRIPT,将脚本存入缓存内。
SCRIPT LOAD
# 将一个脚本装入缓存,返回sha1,但是不立即运行。
SCRIPT FLUSH
# 清除所有脚本缓存
SCRIPT EXISTS
# 根据给定的脚本校验和,检查指定的脚本是否存在于脚本缓存
SCRIPT KILL
# 杀死当前正在运行的脚本
使用实例。
127.0.0.1:6381> SCRIPT LOAD "return redis.call('set',KEYS[1],ARGV[1])"
"c686f316aaf1eb01d5a4de1b0b63cd233010e63d"
127.0.0.1:6381> evalsha c686f316aaf1eb01d5a4de1b0b63cd233010e63d 1 Kamen "kuuga!"
OK
127.0.0.1:6381> get Kamen
"kuuga!"
不进入客户端使用lua脚本
先创建个脚本。有几个需要注意的:变量需要是local变量,必须要有返回值。
vi redis.lua
local value=redis.call('get','Kamen')
return value
调用脚本。其实都一样,只是脚本可以使用文件,其他的keys,args 都一样
redis-cli --eval redis.lua
"kuuga!"
java 中使用lua脚本
直接用就好了,脚本是一个string类型变量。
public void text(){
Jedis jedis = RedisUtils.getJedis();
//lua脚本
String script="return redis.call('get','Kamen')";
String value= (String) jedis.eval(script);
System.out.println(value);
}