背景Spring Boot 结合 JedisCluster
Redis 支持的 8 大核心数据结构(数据格式)
Redis 所有数据都是 key-string 键值模型,不同结构只是 value 的类型不同,key 统一是字符串。
- 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;
}
}
1193

被折叠的 条评论
为什么被折叠?



