Ⅰ Redis 学习总结(3) Redis 哨兵模式
在实际开发中不会仅仅部署一个 Redis 服务器,为了获得高可用,Redis 哨兵模式 则是高可用的一种选择。
本文先介绍下 哨兵模式,再介绍了如何在 springboot 项目中使用。
这意味着使用 Sentinel (哨兵模式),您可以创建一个 Redis 部署,它可抵抗某些类型的故障(进行故障迁移)而无需人工干预。
它有这些功能:
Sentinel 的分布式特性 Redis Sentinel 是一个分布式系统,多个 Sentinel 进程协同工作,有这些优势:卖滚
部署前需要了解:
三个节点的基本配置
法定人数和仲裁 在配置 哨兵模式时,要指定一个 quorum,它可理解为“法定人数”。 假设有3 个 哨兵,法定人数为2。那么:
哨兵和副本的自动发现 Sentinel 与其他 Sentinel 保持连接,以便相互检查彼此的可用性并交换消息。
但是,您不需要在您运行的每个 Sentinel 实例中配置其他 Sentinel 地址的列表,因为 Sentinel 使用 Redis 实例的 Pub/Sub 功能来发现正在监视相同主节点和副本的其他 Sentinel。
类似地,您不需要配置附加到主服务器的副本地址在哪里,因为 Sentinel 会通过查询 Redis 自动发现它们。
参考我的另一篇文章:
一般需要三个节点,每个节点有一个 redis 和一个哨兵。
下面再分别描述。
我这里按三个 节裤隐点,先配置 redis 的主从复制。1个节点作为 master ,2个副本。
配置节点1:master 这里的 redis 作为 master 主redis,其他两个节点作为从节点。 我的文件夹名字叫 box1,这里编辑一个 box1/redis.conf 文件,主要配置内容如下:
配置节点2:副本 编辑一个 box2/redis.conf 文件,主要配置内容如下:
配置节点3:副本 编辑一个 box3/redis.conf 文件,主要配置内容如下:
分别启动这三个redis 命令行执行 redis-server ,并指定 配置文件的路径参数。
如何查看“主从复制”是否配置成功? 使用 info replication 命令,操作如下:
副本节点设置为只读? 从 Redis 2.6 开始,副本已被默认设置为 只读,无需额外配置。.
一般情况下,至少会需要三个哨兵对redis 进行监控,我们可以通过修改端口启动多个sentinel 服务。
第一个哨兵: 哨兵的 默认端口是 26379 ,这里不改。
第二个哨兵: 修改哨兵端口。
第三个哨兵: 修改哨兵端口。
启动哨兵 使用 redis-sentinel 命令,分别启动这三个哨兵
哨兵的自动发现 当三个哨兵都启动后,在各个哨兵的打印日志里可以看到, 三个哨兵已互相发现了彼此的存在 。
至此,配置完毕了,我们有三个 redis,和三个哨中纯余兵,看下截图。
模拟 master 宕机 按 ctrl+c 停止 master ,其位于 6379 。停止后,从日志可以看到,哨兵和 redis副本先努力继续连接 6379,反复几次失败后,开始选举出新的 master。截图如下:
至此,配置完毕。
我们看下 springboot 项目的客户端如何配置 以访问 哨兵模式的 redis。
Redis 哨兵支持 对于处理高可用Redis,Spring Data Redis 已经支持Redis Sentinel,使用RedisSentinelConfiguration,如下例所示:
Jedis 和 Lettuce 两种 redis 驱动都可以支持。
RedisSentinelConfiguration 也可以用可以 通过 PropertySource 来设置,它允许您设置以下属性:
配置application.yml
比如我这里修改我的 application.yml 文件如下:
我的配置文件示例: https://github.com/vir56k/java_demo/tree/master/redis-sentinel 我的 springboot 配置实例: https://github.com/vir56k/java_demo/tree/master/redis-sentinel/springboot_redis_demo
Redis官网 sentinel 介绍 https://redis.io/topics/sentinel
spring-data/data-redis https://docs.spring.io/spring-data/data-redis/docs/current/reference/html/#redis:sentinel
https://www.cnblogs.com/jaycekon/p/6237562.html
END
Ⅱ java怎样配置redis占用多大内存
Redis的配置 daemonize 如果需要在后台运行,把该项改为yes pidfile 配置多个pid的地址,默认在/var/run/redis.pid bind 绑定ip,设置后只接受自该ip的请求 port 监听端口,默认为6379 timeout 设置客户端连接时的超时时间,单位为秒 loglevel 分为4级,debug、verbose、notice、warning logfile 配置log文件地址 databases 设置数据库的个数,默认使用的数据库为0 save 设置redis进行数据库镜像的频率,保存快照的频率,第一个*表示多长时间, 第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。 rdbcompression 在进行镜像备份时,是否进行压缩 Dbfilename 镜像备份文件的文件名 Dir 数据库镜像备份的文件放置路径 Slaveof 设置数据库为其他数据库的从数据库 Masterauth 主数据库连接需要的密码验证 Requirepass 设置登录时需要使用的密码 Maxclients 限制同时连接的客户数量 Maxmemory 设置redis能够使用的最大内存 Appendonly 开启append only模式 appendfsync 设置对appendonly.aof文件同步的频率 vm-enabled 是否虚拟内存的支持 vm-swap-file 设置虚拟内存的交换文件路径 vm-max-memory 设置redis使用的最大物理内存大小 vm-page-size 设置虚拟内存的页大小 vm-pages 设置交换文件的总page数量 vm-max-threads 设置VMIO同时使用的线程数量 glueoutputbuf 把小的输出缓存存放在一起 hash-max-zipmap-entries 设置hash的临界值 activerehashing 重新has
Ⅲ RedisTemplate在java哪个包下面
redisDao封装类-其他集成他[java] view plain package com.ffcs.wlan..common; import javax.annotation.Resource; import org.springframework.data.redis.core.StringRedisTemplate; /** * AbstractBaseRedisDao * @author hugsh * @version <b>1.0</b> */ public abstract class AbstractBaseRedisDao<K, V> { @Resource protected StringRedisTemplate redisTemplate; public void setRedisTemplate(StringRedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } } 批量插入(不关注返回值)[java] view plain @Repository public class RedisInitDao extends AbstractBaseRedisDao<String, Object> { Logger logger=Logger.getLogger(RedisInitDao.class); /** * 批量向redis中孝喊插入H码:key(tableName:hcode) value(pcode) * 如果键已存在则返回false,不更新,防止覆盖。使用pipeline批处理方式(不关注返回值) * @param list 一个map代表一行记录,2个卖慎灶key:hcode & pcode。 * @param tableName redis中key的值为tableName:hcode 对中扮应value值为pcode。 * @return */ public boolean addHcode(final List<Map<String, Object>> list,final String tableName) { boolean result = redisTemplate.execute(new RedisCallback<Boolean>() { public Boolean doInRedis(RedisConnection connection) throws DataAccessException { RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); for (Map<String, Object> map : list) { byte[] key = serializer.serialize(tableName+":"+map.get("hcode").toString()); byte[] name = serializer.serialize(map.get("pcode").toString()); connection.setNX(key, name); } return true; } }, false, true); return result; } 批量获取(有返回值)[java] view plain /** * 从redis中获取(获取密码日志) rPop从链表尾部弹出(最早的日志) * 多线程并发读取日志长度的时候,比如都得到结果是1000条。 * 当多线程每个都 循环1000次 pop弹出 日志的时候, * 由于是多线程一起pop,所以每个线程获得的数组中都会包含 null 甚至有的全是null * @return */ public List<String> getLogFromRedis() { final RedisSerializer<String> serializer = redisTemplate.getStringSerializer(); //密码日志的长度 final Long pwdLogSize=redisTemplate.opsForList().size("getpwdList"); List<Object> pwdLogList=redisTemplate.executePipelined(new RedisCallback<String>() { @Override public String doInRedis(RedisConnection conn) throws DataAccessException { for (int i=0 ;i<pwdLogSize ;i++) { byte[] listName = serializer.serialize("getpwdList"); conn.rPop(listName); } return null; } }, serializer); // 去除结果中的null ArrayList<String> newList=new ArrayList<String>(); for (Object o : pwdLogList) { if(o!=null) newList.add(String.valueOf(o)); } return newList; } 基础数据类型工具类(opsForList)[java] view plain /** * 向redis中插入获取密码日志:leftPush 从链表头部压入 * @param pwdLog 获取密码的日志 * @return */ public void addLogIntoRedis(final String pwdLog) { log.info("insert getpwd log into redis:"+pwdLog); try { redisTemplate.opsForList().leftPush("getpwdList", pwdLog); } catch (Exception e) { log.error(e.getMessage()); } } 配置文件[html] view plain <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal" value="${redis.maxTotal}"></property> <property name="maxIdle" value="${redis.maxIdle}" /> <property name="maxWaitMillis" value="${redis.maxWait}" /> <property name="testOnBorrow" value="${redis.testOnBorrow}" /> </bean> <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="${redis.host}" p:port="${redis.port}" p:pool-config-ref="poolConfig"/> <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"> <property name="connectionFactory" ref="connectionFactory" /> </bean> </beans> [html] view plain <!– 引入项目配置文件 –> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:redis.properties</value><!– 引入redis配置文件 –> <value>classpath:jdbc.properties</value><!– 定义spring-jdbc配置信息路径 –> </list> </property> </bean> <!– 自动扫描model,和service包(自动注入) –> <context:component-scan base-package="com.ffcs.wlan.model,com.ffcs.wlan.,com.ffcs.wlan.service" /> 属性文件[html] view plain # Redis settings redis.host=192.168.11.100 redis.port=6379 #redis.pass=hugsh redis.maxIdle=25 redis.maxTotal=250 #redis.maxActive=600 invalid in2.4 redis.maxWait=1000 redis.testOnBorrow=true
Ⅳ java解析redis 的appendonly.aof文件
Redis有三种来类型的落地自文件:数据文件-在配置中可设置其位置及文件名,默认文件名mp.rdb日志文件-在配置中也可以配置.当然,在你是以daemon方式运行的时候,这个值就不要设置为stdout了,这么设置会自动被换成/dev/null
Ⅳ java redis 实现消息队列 需要做哪些配置
没什么问题啊,就是Jedis的lpush. 和rpop这两个命令。用的时候就直接把java对象序列化成json。rpop的时候把拿到的json反序列化成java对象
Ⅵ redis.config配置文件详解
配置文件units单位对大小写不敏感。 可以理解为Java的import,可以配置多个其他的配置文件在该配置下。 在多长的事件内,操作了多少条命令,会持久化到.rdb文件或者.aof文件。 在这里可以给redis设置登录的密码。
Ⅶ java使用redis时不时的报没有可用的链接
出现这种问题从以下几个方面排查:1、网络不稳定,这种情况只会出现在调用机器和redis服务器不在同一台机器的情况,如果调用本机redis请忽略。2、使用了连接池,并发较大,连接池配置的最大连接数过小,客户端从连接池获取连接时,如果没有可用连接就阻塞当前线程直到有可用连接,等待时间超过配置的超时时间后会抛出连接超时异常。3、同样是使用连接池的情况,从连接池获取连接,使用完成后没有释放连接,导致连接池链接耗尽。4、还有可能是硬件性能瓶颈,比如单节点的redis,但是需要支持特别大的并发量,无论怎么优化配置都是徒劳的,这种情况就需要考虑做读写分离,搭建redis集群等,
Ⅷ 怎么在java中实现redis的添加数据
第一步,在windows下载安装配置好redis数据库。这里我就不再概述了。下载jedis-2.4.2.jar,当然最好是下载最新版本的jar包。这个在网络搜索下就出来的。下载后,放在一个文件夹下面,一会会需要到。第二步。打开eclipse,新建一个java工程。如下图所示:第三步:在Test这个java工程里面,我们新建一个folder,命名lib,把刚才下载的jedis-2.4.2.jar包放在我们新建的lib的包下面,如下图所示:第四步,在eclipse中,选中jar包,build path下。然后我们再Test这个项目里面我们新建一个class,class名字为TestConnect。第五步,在类里面,我们输入如下的内容:// Connecting to Redis server on localhost//实例化一个客户端Jedis jedis = new Jedis("localhost");//=================================================// check whether server is running or not//ping下,看看是否通的System.out.println("Server is running: " + jedis.ping());//保存一个jedis.set("leiTest", "localhost Connection sucessfully");//获取一个System.out.println("通过key获取value: " + jedis.get("leiTest"));第六步,对刚才的类进行运行,ctrl+f11快捷键运行下,如下图所示:第七步,进一步验证我们是否在redis上是否保存了数据,并且能够取出来,我们到redis安装包的目录,如下图,打开红色框内的 redis-cli.exe,打开后,我们进入下面的第二个图片的界面。第八步:我们在redis的客户端的界面 输入 get leiTest 这个指令。leiTest是刚才在eclipse中我们存入redis数据库中的一个String类型的键。如下图,证明我们确实成功了,你也试试吧。
Ⅸ java连redis数据property怎么配置文件
redis.host=192.168.1.12//主机名redis.port=6379//端口号redis.username=hr//用户名redis.password=123//密码
Ⅹ java jedis 链接不上redis 防护墙已经关闭 ip能ping通 端口号以开 配置文件也改过 就是连不上
你念罩看看你的redis配置文件,在配置文件里可以设枣高神置是否可以远程访问, 默认只能本地访问。还有就是 你的redis 设置 安全登陆名了吗。或者telnet 一下 看看端口凳亏通不通?