目录
Redis理论
事务冲突问题
多线程环境下,容易发生事务冲突,例子,比如同时五个人找我借钱,我的钱并不能借五个人,但足够借给其中任何一个人。如果不设置锁,我将把钱都借出去,并且负债。为了不负债,设置锁,避免事务冲突。
1.悲观锁:直接上锁 如果符合条件,开锁,一个事务结束后得到结果后,又马上上锁。缺点是效率很低,每次都得上锁。
直接例子。张三李四王五分别找我借钱,我把钱揣兜里,我先看自己的钱够不够借张三,如果可以,给他,再数一遍钱,看看够不够借李四。
2.乐观锁:在进行一次事务操作后,数据库更新,会生成一个新版本号的数据库,后续的事务要操作的时候,会检查数据库版本号有无更新,如果更新了则停止操作。即每次去拿数据的时候认为别人不会修改,所以不会上锁,但是在更新的时候会判断在此期间别人有无去更新这个数据,如版本号更新等。
Redis集群基本配置
Docker快速搭建redis集群硬核教程_稳住,别浪,慢慢来,我能翻的博客-CSDN博客
Redis集群基本指令,启动,宕机测试
redis集群不能用单机方式开启,不然会有部分数据存储失败
正确方式 加入参数-c,优化路由,也可以看到由6381切换到6383
在不断进行存储的过程中,可以看到redis容器不断地进行切换,根据存储的数值,切换相应的槽
又从6383切换到6381
集群检查指令
redis-cli --cluster check 192.168.142.128:6381
查看集群节点指令
cluster nodes
当一个容器宕机,如端口为6381的redis宕机,其slave为端口6384的redis,依旧可以从端口6382的redis进入,进入容器
docker exec -it redis-node-2 /bin/bash
进入容器,采用正确指令开启(6382为端口号,其他固定)
redis-cli -p 6382 -c
输入查看集群节点指令查看各个节点的状态
cluster nodes
可以 看到,6381的slave变成了master,打倒封建主义,农奴翻身做主人。
查看储存的键值,并不因为宕机了一个,数据受到影响,Master宕机,数据会存到它的slave中
再次启动端口6381,6381变成6384的slave,身份互换了
哈希槽位分配 这里并不是很懂
到此,集群建立完毕,一共是三主三从,如果还要往集群里面加redis容器,操作如下
Redis节点插入集群
以加入redis-node-7和redis-node-8为例
首先执行指令,建立两个新节点
docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
将新增的6387作为Master节点加入集群
redis-cli -cluster add-node 自己实际的ip地址:6387 自己实际的ip地址:6381
6387就是将要作为master的新增节点,6381是原来节点的引路人。
节点添加成功
虽然节点添加成功了,但我们可以看到6387并未分配槽号,集群数量改变,应该重新分配槽号,
输入以下指令
redis-cli --cluster reshard IP地址:端口号
对于我的电脑,则是
redis-cli --cluster reshard 192.168.142.128:6381
再输入需要分配槽位的id号
再输入all
再输入yes
槽位分配完毕
槽位分配结果 使用指令查看(首先也得进入容器),槽位分配完毕
redis-cli --cluster check 192.168.142.128:6381
接下来就要给6387Master设置slave了
redis-cli --cluster add-node ip地址:slave的端口号 ip地址:master的的端口号 --cluster-slave --cluster-master-id 新主机节点id
成功~效果如下所示