redis 02 集群搭建

Something before start

主从复制+烧饼机制也可以做成集群。不过现在更常用的是cluster集群。他不用像烧饼机制那样开一个新的进程。不过他底层是烧饼机制代码的复用,就是🐂🍺就完事了。

原理

  1. key通过crc16(key)%16384哈希映射到slot(槽)。
  • 创建集群时,根据节点数分配slot。
  • 利于数据迁移,直接迁移slot就行。
  1. 容错
  • 节点失效判断:半数以上的master判断为sdown就变成odown
  • 集群失效判断:
    1. 任意无slave的master挂掉,集群进入fail状态。
    1. 超过半数master挂掉,集群fail

环境

  1. ruby
  2. 安装ruby和redis的接口程序。这里可以查看下载命令
  3. 搞六个备份出来,端口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);
    }
posted @ 2021-06-27 22:32  sarise  阅读(66)  评论(0编辑  收藏  举报