目录
部署方式
3主3从
原因:
- 集群中超过半数的主节点投票认为某个主节点挂了,那么这个节点就挂了,2个节点无法构成集群。
- 要保证集群的高可用,需要每个节点都有从节点,如果集群中任意一个节点挂了,而且该节点没有从节点(备份节点),那么该节点负责的哈希槽slot不可用,这个集群就挂了
Redis 数据类型及应用场景
设计 Redis Key-分段设计法
使用冒号把 key 中要表达的多种含义分开表示,步骤如下:
- 把表名转化为 key 前缀
- 主键名(或其他常用于搜索的字段)
- 主键值
- 要存储的字段
eg. 用户表(user)
id | name | |
---|---|---|
1 | zj | 156577812@qq.com |
2 | ai | 156577813@qq.com |
这个简单的表可能经常会有这个的需求:根据用户 id 查询用户邮箱地址,可以选择把邮箱地址这个数据存到 redis 中:
set user : id:1:email 156577812@qq.com;
set user : id:2:email 156577812@qq.com;
应用场景
先初始化jedis集群,得到jedisCluster
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
JedisCluster jedisCluster = (JedisCluster) context.getBean("jedisCluster");
字符串对象
一般可以存放数据表某个字段的值,或某个实体对象序列化后的JsonString
String strKey="tbproduct:inter_prd_code:001_JXTJ1801:prd_name";
String strValue="吉祥添金1801";
jedisCluster.del(strKey);
jedisCluster.set(strKey,strValue);
System.out.println(jedisCluster.get(strKey));
System.out.println();
哈希对象
比起用字符串对象存储 json 格式的字符串,哈希对象由于没有序列化操作,优势更明显。
String hashKey="tbproduct:inter_prd_code:001_JXTJ1801";
HashMap<String, String> hashValue=new HashMap<String, String>();
hashValue.put("prd_code","JXTJ1801");
hashValue.put("prd_name","吉祥添金1801");
hashValue.put("guest_rate","4.4%");
jedisCluster.del(hashKey);
jedisCluster.hmset(hashKey, hashValue);
System.out.println(jedisCluster.hmget(hashKey, "prd_code","prd_name","guest_rate"));
System.out.println();
集合对象
多个 set 之间可以求交集、并集、补集,比如“共同好友列表”
获取多个理财产品共同持仓资产:
String setKey="tbunitstock:combi_no:001_jxtj1801:inter_code";
String setKey2="tbunitstock:combi_no:001_jxtj1802:inter_code";
String setKey3="tbunitstock:combi_no:001_jxtj1803:inter_code";
jedisCluster.del(setKey);
jedisCluster.del(setKey2);
jedisCluster.del(setKey3);
jedisCluster.sadd(setKey, "180205.IB_YH","180210.IB_YH");
jedisCluster.sadd(setKey2, "180205.IB_YH","170210.IB_YH");
jedisCluster.sadd(setKey3, "180205.IB_YH","170205.IB_YH");
System.out.println(jedisCluster.smembers(setKey));
System.out.println();
有序集合对象
在集合类型的场景上加入排序就是有序集合的应用场景了。比如根据好友的“亲密度”排序显示好友列表。
获取产品所投资资产按资产价值倒序排列的集合:
String zsetKey="tbhisprdassetdetail:combi_no:001_jxtj1801:inter_code:asset_value";
Map<String, Double> scoreMembers=new HashMap<String, Double>();
scoreMembers.put("180205.IB_YH", 1001.00);
scoreMembers.put("180210.IB_YH", 1002.00);
jedisCluster.del(zsetKey);
jedisCluster.zadd(zsetKey, scoreMembers);
System.out.println(jedisCluster.zrevrange(zsetKey, 0, -1));
System.out.println();
限流
还可以用来做限流:
public class SimpleRateLimiter {