redis分片_Redis分片机制

作者:小飞

来源:SegmentFault 思否


为什么需要分片机制

如果需要存储海量的内存数据,如果只使用一台redis,则无法保证redis工作的效率。大量时间都浪费到了寻址中,所以需要一种机制能够满足该要求。


采用分片机制实现:

fd6187480dc0e4e8e0ac3592275b0b67.png


Redis分片搭建

搭建注意事项

Redis服务的启动需要依赖于redis.conf的配置文件,如果需要准备多台redis则需要多个redis.conf的配置。


准备端口号:


1.6379
2.6380
3.6381


分片实现

ddc559a219077cf40d70a2b356845398.png

修改端口号:将各自的端口号进行修改
1.进入各自的redis.conf文件中
2.修改各自的端口号

83ea72b0bbdea809bcd4965933664ba6.png

启动redis服务器

7a3536c762dc008e5fbda52c81433832.png

校验服务器是否正常运行

c5b8f514367fc80ff666cc6b6f33cc90.png


关于分片的注意事项

1.问题描述:
当启动多台redis服务器之后,多台redis暂时没有必然的联系,各自都是独立的实体,可以数据的存储。
如图所示:


2.如果将分片通过程序的方式进行操作,要把3太redis当做一个整体,所以与上述的操作完全不同,不会出现一个key同时保存到多个redis的现象。50c7cc034349e707ba6b62f1d1f3920d.png


分片入门案例
/**     * 测试Redis分片机制     * 思考: shards 如何确定应该存储到哪台redis中呢???     */    @Test    public void testShards(){        List shards = new ArrayList<>();        shards.add(new JedisShardInfo("192.168.126.129",6379));        shards.add(new JedisShardInfo("192.168.126.129",6380));        shards.add(new JedisShardInfo("192.168.126.129",6381));        //准备分片对象        ShardedJedis shardedJedis = new ShardedJedis(shards);        shardedJedis.set("shards","redis分片测试");        System.out.println(shardedJedis.get("shards"));    }

一致性hash算法

一般的hash是8为16禁止数。0---9 A--F 组合总共为2^32。
如果对相同的数据进行hash运算,结果必然相同。
一个数据1M和数据1G的hash运算的速度一致。


一致性hash算法介绍

一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,目的是解决分布式缓存的问题。[1] 在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动态伸缩等问题。

bae7ca8a3752e380370edd933b887112.png


特性

平衡性

概念:平衡性是指hash的结果应该平均分配到各个节点,这样从算法上解决了负载均衡问题。(大致平均)


问题描述: 由于节点都是通过hash方式进行算计.所以可能出现如图中的现象.,导致负载严重不平衡。

839b358206b680abea4c1de22c129251.png

解决方法:引入虚拟节点

8356f64864dccffbb06e902436751518.png

单调性

特点:单调性是指在新增或者删减节点时,不影响系统正常运行。

9e4585811ae00e7414f43087c00e05c8.png

分散性

分散性是指数据应该分散地存放在分布式集群中的各个节点(节点自己可以有备份),不必每个节点都存储所有的数据 。


SpringBoot整合Redis分片

编辑配置文件
# 配置redis单台服务器redis.host=192.168.126.129redis.port=6379# 配置redis分片机制redis.nodes=192.168.126.129:6379,192.168.126.129:6380,192.168.126.129:6381
编辑配置类
@Configuration@PropertySource("classpath:/properties/redis.properties")public class JedisConfig {    @Value("${redis.nodes}")    private String nodes;  //node,node,node.....    //配置redis分片机制    @Bean    public ShardedJedis shardedJedis(){        nodes = nodes.trim();   //去除两边多余的空格        List shards = new ArrayList<>();        String[] nodeArray = nodes.split(",");        for (String strNode : nodeArray){   //strNode = host:port            String host = strNode.split(":")[0];            int port = Integer.parseInt(strNode.split(":")[1]);            JedisShardInfo info = new JedisShardInfo(host, port);            shards.add(info);        }        return new ShardedJedis(shards);    }   }
修改AOP注入项

0168f254f4d4c63ecd2e97fe9f450c74.png


- END -

5a57ea62be4c1aa03fa47b5d6a035eee.png

3b1e8f682240c43729b7a59032b785d2.gif

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容简介: Redis的的是完全开源免费的,遵守BSD协议,是一个高性能的键值数据库。是当前最热门的的的NoSql数据库之一,也被人们称为数据结构服务器。本课程从Redis基本数据类型开始,了解不同数据类型的用法和底层实现 。进一步学习Redis的一些高级特性与工作原理。了解Redis在分布式环境中的工作方式,和实际项目的使用及问题解决。 为什么学Redis? 原因很简单,快!这个问题在大并发,高负载的网站中必须考虑.redis数据库中的所有数据都存储在内存中。由于内存的读写速度远快于硬盘,因此Redis在性能上对比其他基于硬盘存储的数据库有非常明显的优势。项目中使用Redis,主要是从两个角度去考虑:性能状语从句:并发。当然,Redis的的的还具备可以做分布式锁等其他功能,但是如果只是为了分布式锁这些其他功能,完全还有其他中间件代替,并不是非要使用Redis的的的。因此,这个问题主要从性能和并发两个角度去答。性能:我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存,这样,后面的请求就去缓存中读取,请求使得能够迅速响应。 并发: 在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用的的Redis的做一个缓冲操作,让请求先访问到的Redis的的,而不是直接访问数据库。redis优势:1.运行在内存,速度快官方号称支持并发11瓦特读操作,并发8瓦特写操作,可以说是相当彪悍了。2.数据虽在内存,但是提供了持久化的支持,即可以将内存中的数据异步写入到硬盘中,同时不影响继续提供服务3.支持数据结构丰富(string(字符串),list(链表),set(集合),zset(sorted set - 有序集合))和Hash(哈希类型,md5加密出来的那个串)课程大纲: 为了让大家快速系统了解Redis核心知识全貌,我为你总结了「Redis核心框架图」,帮你梳理学习重点,建议收藏!!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值