1.修改配置
1.打开conf/redis.conf 文件,取消注释:notify-keyspace-events ex

2.重启redis
3.如果设置了密码需要重置密码:config set requirepass ****
4.验证配置是否生效
- 步骤一:进入redis客户端:redis-cli
- 步骤二:执行 config get notify-keyspace-events ,如果有返回值证明配置成功,如果没有执行步骤三
- 步骤三:执行config set notify-keyspace-events "ex",再查看步骤二是否有值
注意:重置密码和重置配置是否每次重启redis都需要重新设置看个人需要。
2.redis在yam中的配置
spring:
redis:
database: 0
host: ip
port: 6379
password: ***
#超时时间:单位ms
timeout: 60000
pool:
#最大空闲数:空闲链接数大于maxidle时,将进行回收
max-idle: 8
#最小空闲数:低于minidle时,将创建新的链接
min-idle: 1
#最大连接数:能够同时建立的“最大链接个数”
max-active: 20
#最大等待时间:单位ms
max-wait: 120000
lettuce:
cluster:
refresh:
adaptive: true
period: 203.代码实现
3.1.redis的连接配置
package com.gf.ecrm.redislistenerconfig;
import lombok.extern.slf4j.slf4j;
import org.springframework.beans.factory.annotation.value;
import org.springframework.data.redis.connection.redisconnectionfactory;
import org.springframework.data.redis.connection.redispassword;
import org.springframework.data.redis.connection.redisstandaloneconfiguration;
import org.springframework.data.redis.connection.jedis.jedisclientconfiguration;
import org.springframework.data.redis.connection.jedis.jedisconnectionfactory;
import org.springframework.data.redis.core.redistemplate;
import org.springframework.data.redis.serializer.genericjackson2jsonredisserializer;
import org.springframework.data.redis.serializer.stringredisserializer;
import org.springframework.stereotype.component;
import redis.clients.jedis.jedispoolconfig;
import javax.annotation.postconstruct;
import java.io.serializable;
import java.util.arrays;
import java.util.hashmap;
import java.util.list;
import java.util.map;
@component
@slf4j
public class redisconfig {
@value("${spring.redis.host}")
private string hostname;
@value("${spring.redis.port}")
private int port;
@value("${spring.redis.password}")
private string password;
@value("${spring.redis.pool.max-idle}")
private int maxidl;
@value("${spring.redis.pool.min-idle}")
private int minidl;
@value("${spring.redis.timeout}")
private int timeout;
private int defaultdb;
private list<integer> dbs=arrays.aslist(0,1);
public static map<integer, redistemplate<serializable, object>> redistemplatemap = new hashmap<>();
@postconstruct
public void initredistemp() throws exception {
log.info("###### start 初始化 redis 连接池 start ######");
defaultdb = dbs.get(0);
for (integer db : dbs) {
log.info("###### 正在加载redis-db-" + db+ " ######");
redistemplatemap.put(db, redistemplateobject(db));
}
log.info("###### end 初始化 redis 连接池 end ######");
}
public redistemplate<serializable, object> redistemplateobject(integer dbindex) throws exception {
redistemplate<serializable, object> redistemplateobject = new redistemplate<serializable, object>();
redistemplateobject.setconnectionfactory(redisconnectionfactory(jedispoolconfig(), dbindex));
setserializer(redistemplateobject);
redistemplateobject.afterpropertiesset();
return redistemplateobject;
}
/**
* 连接池配置信息
*
* @return
*/
public jedispoolconfig jedispoolconfig() {
jedispoolconfig poolconfig = new jedispoolconfig();
// 最大连接数
poolconfig.setmaxidle(maxidl);
// 最小空闲连接数
poolconfig.setminidle(minidl);
poolconfig.settestonborrow(true);
poolconfig.settestonreturn(true);
poolconfig.settestwhileidle(true);
poolconfig.setnumtestsperevictionrun(10);
poolconfig.settimebetweenevictionrunsmillis(60000);
// 当池内没有可用的连接时,最大等待时间
poolconfig.setmaxwaitmillis(timeout);
return poolconfig;
}
/**
* jedis连接工厂
*
* @param jedispoolconfig
* @return
*/
public redisconnectionfactory redisconnectionfactory(jedispoolconfig jedispoolconfig, int db) {
// 单机版jedis
redisstandaloneconfiguration redisstandaloneconfiguration = new redisstandaloneconfiguration();
// 设置redis服务器的host或者ip地址
redisstandaloneconfiguration.sethostname(hostname);
// 设置默认使用的数据库
redisstandaloneconfiguration.setdatabase(db);
// 设置密码
redisstandaloneconfiguration.setpassword(redispassword.of(password));
// 设置redis的服务的端口号
redisstandaloneconfiguration.setport(port);
// 获得默认的连接池构造器
jedisclientconfiguration.jedispoolingclientconfigurationbuilder jpcb = (jedisclientconfiguration.jedispoolingclientconfigurationbuilder) jedisclientconfiguration
.builder();
// 指定jedispoolconifig来修改默认的连接池构造器
jpcb.poolconfig(jedispoolconfig);
// 通过构造器来构造jedis客户端配置
jedisclientconfiguration jedisclientconfiguration = jpcb.build();
// 单机配置 + 客户端配置 = jedis连接工厂
return new jedisconnectionfactory(redisstandaloneconfiguration, jedisclientconfiguration);
}
private void setserializer(redistemplate<serializable, object> template) {
template.setkeyserializer(new stringredisserializer());
template.setvalueserializer(new genericjackson2jsonredisserializer());
}
public redistemplate<serializable, object> getredistemplatebydb(int db){
return redistemplatemap.get(db);
}
public redistemplate<serializable, object> getredistemplate(){
return redistemplatemap.get(defaultdb);
}
}3.2.redis的监听conf
package com.gf.ecrm.redislistenerconfig;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
import org.springframework.data.redis.connection.redisconnectionfactory;
import org.springframework.data.redis.listener.redismessagelistenercontainer;
import javax.annotation.resource;
@configuration
public class redislistenerconfig {
@resource
private redisconnectionfactory redisconnectionfactory;
@resource
private rediskeyexpirationlistener redisexpiredlistener;
@bean
public redismessagelistenercontainer redismessagelistenercontainer() {
redismessagelistenercontainer redismessagelistenercontainer = new redismessagelistenercontainer();
redismessagelistenercontainer.setconnectionfactory(redisconnectionfactory);
//监听所有key的过期事件
redismessagelistenercontainer.addmessagelistener(redisexpiredlistener, redisexpiredlistener.gettopic());
return redismessagelistenercontainer;
}
}3.3.监听业务代码
package com.gf.ecrm.redislistenerconfig;
import lombok.data;
import org.springframework.data.redis.connection.message;
import org.springframework.data.redis.connection.messagelistener;
import org.springframework.data.redis.listener.patterntopic;
import org.springframework.stereotype.component;
@data
@component
public class rediskeyexpirationlistener implements messagelistener {
//监听的主题(只监听redis数据库1,如果要监听redis所有的库,把1替换为*)
public final patterntopic topic = new patterntopic("__keyevent@1__:expired");
/**
* redis失效事件 key
*
* @param message
* @param pattern
*/
@override
public void onmessage(message message, byte[] pattern) {
string expirakey = message.tostring();
system.out.println(expirakey);
}
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论