Redis实现主从选举

背景Spring Boot 结合 JedisCluster

Redis 支持的 8 大核心数据结构(数据格式)
Redis 所有数据都是 key-string 键值模型,不同结构只是 value 的类型不同,key 统一是字符串。

  1. String 字符串(最基础)
    特点
    二进制安全字符串,可存文本、数字、序列化 JSON、图片二进制。
    常用命令
//设置key 为k1, value为 hello
set k1 hello
//获取key为k1的值,  值为:hello
get k1
#设置 key为num, 数字自增
incr num  
#向key为k1的值, 添加value, value为 world
append k1 world

适用场景
缓存、计数器、分布式锁、简单 KV、session 存储
2. List 列表(双向链表)
特点
有序可重复,两头操作极快;中间操作慢。
重用命令

lpush list1 a b c
rpop list1
lrange list1 0 -1

场景
消息队列、任务队列、最新消息列表
3. Set 集合(无序、去重)
特点
无序,元素唯一,支持交集 / 并集 / 差集。

sadd set1 1 2 3
smembers set1
sinter set1 set2  # 交集

场景
标签、去重统计、好友共同关注
4. Sorted Set / ZSet 有序集合
特点
元素唯一,每个元素带 score 分值,自动按分数排序。

#向ZSet 添加key为z1, score 100, value: zhang
zadd z1 100 zhang 
#获取key为z1的所有元素
zrange z1 0 -1 
zrank z1 zhang

场景
排行榜、延时队列、限流、有序权重列表
5. Hash 哈希(对象结构)
特点
适合存储对象,key (field)-value 内嵌结构,类似 JSON 对象。

hset user:1 name zhang age 20
hget user:1 name
hgetall user:1
hincrby user:1 age 1

场景
用户信息、商品详情、多行属性数据
6. Stream 流(Redis5.0+ 消息队列)
特点
专门做消息队列,支持消息 ID、消费组、ack、持久化。

xadd mystream * name zhang
xreadgroup group g1 c1 streams mystream >

场景
可靠消息队列、日志数据流
7. BitMap 位图(基于 String 实现)
本质是 String,按 bit 位操作,超省内存。

setbit sign 100 1
getbit sign 100
bitcount sign

场景
签到统计、用户在线状态、布隆过滤器底层
8. HyperLogLog 基数统计(基于 String)
统计不重复元素数量,极低内存,有误差(0.81%)。

pfadd hll1 a b c a
pfcount hll1

场景:UV 访客统计、独立 IP 计数
扩展特殊类型
Geo 地理位置(ZSet 底层封装)
存储经纬度,计算距离、附近的人

geoadd city 116.40 39.90 beijing
georadius city 116.40 39.90 100 km

Pub/Sub 发布订阅(非存储结构,消息模式)无持久化,消息丢失,简单广播。
Lua 脚本不是数据结构,是执行脚本能力,保证原子操作。

主从选举

主未掉线则一直是主,直到主掉线才切换主节点

/**
* 采用Redis实现主从
*/
@Component
public class RedisServiceMaster {
	private static final String OK = "OK";
	private static final String MASTER_KEY = "master.key";
	private static final String ID = UUID.randomUUID().toString();
	//过期时间15秒
	private static final int EXPIRE_TIME = 15;
	
    @Autowired
    private JedisCluster jedisCluster;

	private boolean isMaster = false;

	/**
	* 选取主节点
	*/
	private void electionMaster() {
		try{
			 String res = jedisCluster.setnx(MASTER_KEY,ID,SetParams.setParams().nx().ex(EXPIRE_TIME));
			 isMaster = OK.equalsIgnoreCase(res);
		} catch (Exeception e) {
			isMaster = false;
		}
	}
	/**
	* 每隔5秒检测一次,如果发现不是主节点,则重新选举新的主节点
	*/
	@Scheduled(fixedRate = 5000)
	private void checkMaster(){
		if(isMaster){
			jedisCluster.exipre(MASTER_KEY, EXPIRE_TIME);
		} else {
			electionMaster();
		}
	}
	
	public boolean isMaster() {
		return isMaster;
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值