当前位置: 首页 > news >正文

redis集群

一、  概述

redis将数据存储于内存中,内存的空间是有限的。为了满足更大的数据存储需求,可以搭建redis集群,redis-cluster。集群上每个节点保存的数据是不一样的,为了保证集群的高可用,每个节点添加备份机,做keepalived心跳测试。 所有的redis节点彼此互联;redis集群没有集群管理工具(比如nginx),节点的fail(宕机)通过投票容错机制(超过半数投票选举,就确认宕机,投票机制需要至少3个节点);客户端与redis节点直连,不需要中间proxy层,客户端连接集群中任意一个节点即可;为了均匀存储数据,redis集群把所有的物理节点映射到(0-16383)slop(槽)上,集群维护节点<>槽<>值。集群中最多可以有16384个节点。

二、  搭建redis集群

redis集群至少有3个节点,高可用的集群,要求每个节点至少需要一个备份机,redis集群至少需要6台服务器。如果为了练习,可以搭建伪分布式,使用一台虚拟机,修改redis的端口为7110-7116。

在urs/local下创建redis-cluster目录,将redis/bin下的文件复制到redis-cluster/redis01下,cp  -r redis/bin  redis-cluster/redis01,将redis01下的dump.rdb文件删除,如果有appendonly.aof文件也删除之。修改redis01下的redis.conf文件,

port 7111

cluster-enabled  yes

在redis-cluster目录下,复制redis01为另外5份,并修改每一份的端口。

编写一个shell批处理文件。

cd redis01

./redis-server redis.conf

cd ..

cd redis02

./redis-server redis.conf

cd ..

cd redis03

./redis-server redis.conf

cd ..

cd redis04

./redis-server redis.conf

cd ..

cd redis05

./redis-server redis.conf

cd ..

cd redis06

./redis-server redis.conf

cd ..

将redis解压文件下的src目录下的redis-trib.rb文件复制到redis-cluster目录下。这个是一个ruby脚本。

使用ruby脚本搭建集群环境,需要ruby的运行环境。安装ruby,

yum install  ruby

yum install  rubygems

将redis-3.0.0.gem库文件上传到服务器。并安装之,gem  install  redis-3.0.0。

在redis-cluster目录下,也就是redis-trib.rb文件所在目录,执行

./redis-trib.rb  create --replicas  1  192.168.0.121:7001  192.168.0.121:7002  192.168.0.121:7003  192.168.0.121:7004  192.168.0.121:7005  192.168.0.121:7006

yes,分配好集群的slop。

使用集群中任意一台正常运行的redis的客户端,测试。连接时,注意加上ip和port和-c(表示接入的是集群)。./redis-cli  -h xxx.xxx.xxx.xxx  -p  7005 -c

三、  JedisClient连接集群和项目中使用redis的例子

使用jedis的api连接集群,导入jedis的相关jar包。

   @Test

    publicvoid jedisClusterTest() throws Exception {

        Set<HostAndPort> nodes = newHashSet<>();

        nodes.add(new HostAndPort("192.168.0.121", 7001));

        nodes.add(new HostAndPort("192.168.0.121", 7002));

        nodes.add(new HostAndPort("192.168.0.121", 7003));

        nodes.add(new HostAndPort("192.168.0.121", 7004));

        nodes.add(new HostAndPort("192.168.0.121", 7005));

        nodes.add(new HostAndPort("192.168.0.121", 7006));

        JedisCluster cluster = new JedisCluster(nodes);

        cluster.set("test1", "第一个jedis存储");

        System.out.println(cluster.get("set2"));

        System.out.println(cluster.get("test1"));

        cluster.close();

    }

redis缓存在实际开发中的应用。

    public List<TbContent> getContentListByCid(long cid) {

                   // 查看缓存

                   // 如果缓存中有直接从缓存中取

                   try {

                            String string= jedisClient.hget(CONTENT_LIST, Long.toString(cid));

                            if(StringUtils.isNotBlank(string)) {

                                     List<TbContent>list = JsonUtils.jsonToList(string, TbContent.class);

                                     returnlist;

                            }

                   } catch(Exception e) {

                            e.printStackTrace();

                   }

                   // 如果没有查数据库

                   TbContentExampleexample = new TbContentExample();

                   Criteria criteria= example.createCriteria();

                   criteria.andCategoryIdEqualTo(cid);

                   List<TbContent>list = contentMapper.selectByExampleWithBLOBs(example);

                   // 将数据库结果保存到缓存

                   try {

                            jedisClient.hset(CONTENT_LIST,Long.toString(cid), JsonUtils.objectToJson(list));

                   } catch(Exception e) {

                            e.printStackTrace();

                   }

                   return list;

         }

对于动态获取的内容,涉及到对该内容的增删改的操作,需要进行缓存同步。简单的做法是,在做增删改之后,删除对应的缓存。复杂的做法是,在增删改时,删除掉缓存后,做一次查询操作,将结果缓存。区别是对于增删改后重新载入缓存,不会导致客户访问时再次调用数据库,更快。可以将删除和重载缓存编写一个缓存updateCache的方法,每次做增删改后都updateCache。

          /**

          * 更新缓存

          */

         void updateCate(String key,String field) {

                   jedisClient.hdel(key,field);

                   getContentListByCid(Long.parseLong(field));

         }

 

相关文章:

  • solr集群
  • ssm框架web项目配置全局异常处理
  • ActiveMQ
  • 删除数据库重复记录
  • session共享问题
  • springmvc中ajax响应json报406错误的两种原因
  • 数据库切片
  • tomcat热部署
  • c++
  • linux系统编程
  • proc*c/c++简介
  • [one_demo_14]一个简单的easyui的demo
  • ztree
  • PowerDesigner
  • POI简单介绍
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • Elasticsearch 参考指南(升级前重新索引)
  • Java IO学习笔记一
  • JavaScript服务器推送技术之 WebSocket
  • Just for fun——迅速写完快速排序
  • mysql_config not found
  • PAT A1050
  • vue学习系列(二)vue-cli
  • 高性能JavaScript阅读简记(三)
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 详解移动APP与web APP的区别
  • PostgreSQL之连接数修改
  • #NOIP 2014# day.2 T2 寻找道路
  • (02)vite环境变量配置
  • (C语言)逆序输出字符串
  • (day 12)JavaScript学习笔记(数组3)
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (poj1.2.1)1970(筛选法模拟)
  • (windows2012共享文件夹和防火墙设置
  • (WSI分类)WSI分类文献小综述 2024
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (差分)胡桃爱原石
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (三)elasticsearch 源码之启动流程分析
  • (图)IntelliTrace Tools 跟踪云端程序
  • (一)WLAN定义和基本架构转
  • (译) 函数式 JS #1:简介
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • ******之网络***——物理***
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .jks文件(JAVA KeyStore)
  • .Net Core 中间件验签
  • .Net Remoting常用部署结构
  • .net 程序发生了一个不可捕获的异常
  • .NET 发展历程
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .so文件(linux系统)