1、无中心化集群
2、redis集群搭建
1、进入/root/myredis文件目录
cd /root/myredis
2、进入redis6378.conf,并添加一下内容
cluster-enabled yes 打开集群模式
cluster-config-file nodes-6379.conf 设定节点配置文件名
cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换
3、复制配置文件
4、修改配置文件
批量修改命令
:%s/被替换的内容/替换后的内容
5、启动上面配置的六台redis服务
6、将六个节点合成一个集群
组合之前,请确保所有redis实例启动后,node-xxxx.conf文件都生成正常。
7、Redis报错:-bash redis-cli command not found
sudo cp src/redis-cli /usr/local/bin/
sudo cp src/redis-cli /usr/local/bin/
8、执行下面的命令
redis-cli --cluster create --cluster-replicas 1 192.168.18.135:6379 192.168.18.135:6380 192.168.18.135:6381 192.168.18.135:6389 192.168.18.135:6390 192.168.18.135:6391
9、连接redis集群
redis-cli -c -p 6379
10、通过cluster nodes 命令查看集群信息
11、分配原则
分配原则尽量保证每个主数据库运行在不同的IP地址,每个主库和从库不在一个IP地址里面。
127.0.0.1:6379> set k1 v1
-> Redirected to slot [12706] located at 192.168.18.135:6381
OK
底层有一个计算插槽的过程,k1 计算后的插槽值为12706,只要落在6381 【10923-16383】节点所在的区间。所有k1存放到6381这个主节点上。set值后自动切换到6381节点。【这里就体现了去中心化的过程】
12、一次添加多个值
分组添加
mset name{user} lucy age{user} 20
13、查看k插槽的值
cluster keyslot k名称
14、杀掉6379服务,再查看节点情况,发现6390(6379的从机)成为主机。
15、重启6379,再查看节点情况,发现6379从原来的主机变为现在的6390的从机。
如果某一段插槽的主从节点都宕机了,redis集群服务是否还能继续?
-
如果某一段插槽的主从都挂掉,而cluster-require-full-coverage为yes,那么整个集群都挂掉
-
如果某一段插槽的主从都挂掉,而cluster-require-full-coverage为no,那么,该插槽数据全部不能使用,也无法存储。其他插槽依然可以提供服务。
3、Jedis - 通过java代码操作redis
4、应用问题解决
4.1 缓存穿透
(4)进行实时监控:当发现Redis的命中率开始急速降低,需要排查访问对象和访问的数据,和运维人员配合,可以设置黑名单限制服务。
4.2 缓存击穿
现象:
4.3 缓存雪崩
5、分布式锁
(1)redis中使用命令来设置分布式锁
setnx k v
第一次使用setnx设置值时是成功的,但是第二次设置就失败了,说明第一次就加锁了。
(2)如何释放锁
使用命令
del k
使用删除命令后,再设置值成功。
(3)以上的设置锁的方式存在的问题?
当锁一直不释放,那么后面的所有操作将搁置,怎么解决这个问题呢?很简单,就是给该锁加一个过期时间
使用命令【这种方式不是原子操作】
setnx users 10
expire users 10
总结:
(1)使用setnx上锁,通过del释放锁
(2)锁一直没有释放,设置key过期时间,自动释放
(3)上锁之后突然出现异常,无法设置过期时间了
-
上锁时候同时设置过期时间就可以解决这个问题
给users设置值为10 ,并设置过期时间为12秒
127.0.0.1:6379> set users 10 nx ex 12 OK 127.0.0.1:6379> ttl users (integer) 5
6、分布式锁存在的问题
1、问题描述
解决方案:
在设置锁的时候,将锁的值设置为一个随机的uuid值,再在需要释放锁的时候,获取该锁的值并进行比较,如果相等,则说明是同一把锁,再执行释放锁的操作,这样就有效的避免了误删其他的锁。