,MGET,MDEL
Redis集群是支持大规模存储数据且支持高效多key操作的分布式缓存系统,通过Redis集群实现高效多key操作是Redis集群极具价值的高性能能力之一。下面就来详细了解一下Redis集群如何来实现MSET,MGET,MDEL操作。
要实现Redis集群的高效多key操作,要先了解Redis的哈希槽的概念。Redis的哈希槽把Redis集群的所有实例按不同的条件分组,并将每个实例上的key按照一定的规则存储在一个哈希槽中,确保key的正确读写操作。
MSET的操作在Redis集群中由CRC16算法来实现,其核心过程是对每个key对应的value进行哈希计算,然后将key和value存储到对应的哈希槽中。这样,在Redis集群中实现高效多key操作,只需要按照一定规则将每个key分配到对应的哈希槽中即可。例如,以如下代码实现MSET操作:
public void MSET(Jedis jedis, Map map){
Map> clusterMap=new HashMap>();
for(String key : map.keySet()){//对每个key对应的value进行哈希计算
long crc16=CRC16.getCRC16key(key);//获取对应哈希槽中的实例jedis
Jedis shardedJedis=Sharding.getJedisByCrc16(jedis,crc16); if(clusterMap.contnsKey(shardedJedis)){
Map smap=clusterMap.get(shardedJedis);
smap.put(key,map.get(key));}else{
Map smap=new HashMap();
smap.put(key,map.get(key));clusterMap.put(shardedJedis,smap);
} }
//对每个哈希槽实例进行操作 for(Map.Entry> entry : clusterMap.entrySet()){
Jedis jedisTemp=entry.getKey();Map mapItem=entry.getValue();
jedisTemp.mset(mapItem); }
}MGET操作也是采用相同的哈希槽规则,通过计算每个key的CRC16值,然后从对应的哈希槽中获取相应的value值即可。在Redis集群中,为了提高多key操作的效率,也可以预先计算出每个哈希槽对应的Jedis实例,然后对每个实例进行MGET操作,这样可以在服务器端节省很多的处理时间。例如,以如下代码实现MGET操作:
public List MGET(Jedis jedis,String []keys){
Map> clusterMap=new HashMap>();
for(String key : keys){//对每个key对应的value进行哈希计算
long crc16=CRC16.getCRC16key(key);//获取对应哈希槽中的实例jedis
Jedis shardedJedis=Sharding.getJedisByCrc16(jedis,crc16); if(clusterMap.contnsKey(shardedJedis)){
List slist=clusterMap.get(shardedJedis);
slist.add(key);}else{
List slist=new ArrayList();
slist.add(key);clusterMap.put(shardedJedis,slist);
} }
List values=new ArrayList();
//对每个哈希槽实例进行操作 for(Map.Entry> entry : clusterMap.entrySet()){
Jedis jedisTemp=entry.getKey();List keyList=entry.getValue();
String [] array=new String[keyList.size()];keyList.toArray(array);
List valueList=jedisTemp.mget(array);
values.addAll(valueList); }
return values;}
MDEL也是采用类似哈希槽规则,将批量key值分发到各个哈希槽实例,执行DEL操作即可实现Redis集群多key删除操作,如以下代码所示:
public void MDEL(Jedis jedis,String []keys){
Map> clusterMap=new HashMap>();
for(String key : keys){//对每个key对应的value进行哈希计算
long crc16=