设为首页 收藏本站
查看: 951|回复: 0

[经验分享] redis缓存

[复制链接]

尚未签到

发表于 2018-11-4 12:59:33 | 显示全部楼层 |阅读模式
/**  
* RedisUnit
  
* @author dsine
  
*/
  
public class RedisUnit {
  /**
  * 服务地址
  */
  private String host;
  

  /**
  * 端口,默认端口是6379
  */
  private Integer port;
  /**
  * 密码
  */
  private String password = "123456";
  

  /**
  * 默认key前缀
  */
  private String defaultKeyPrefix = "";
  /**
  * 最小空闲连接数
  */
  private Integer minIdle = 5;
  /**
  * 最大空闲连接数
  */
  private Integer maxIdle = 10;
  /**
  * 最大连接数
  */
  private Integer maxTotal = 100;
  /**
  * 连接池
  */
  private JedisPool jedisPool;
  /**
  * 连接池配置,具体参数:
  * blockWhenExhausted = true;//连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
  * evictionPolicyClassName = "org.apache.commons.pool2.impl.DefaultEvictionPolicy";//设置的逐出策略类名, 默认DefaultEvictionPolicy(当连接超过最大空闲时间,或连接数超过最大空闲连接数)
  * jmxEnabled = true;// 是否启用pool的jmx管理功能, 默认true
  * jmxNamePrefix = "pool";
  * lifo = true; //是否启用后进先出, 默认true
  * minIdle = 5;//最小空闲连接数, 默认0
  * maxIdle = 10;/最大空闲连接数, 默认8个
  * maxTotal = 100;//最大连接数, 默认8个
  * maxWaitMillis = 3000L;//获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间,默认-1
  * testOnBorrow = true;//在获取连接的时候检查有效性, 默认false
  * testOnReturn = true;//返回一个jedis实例给连接池时,是否检查连接可用性
  * testWhileIdle = true;//在空闲时检查有效性, 默认false
  * minEvictableIdleTimeMillis = 1800000L;//逐出连接的最小空闲毫秒,默认1800000毫秒(30分钟)
  * softMinEvictableIdleTimeMillis = 1800000L;//对象空闲多久后逐出, 当空闲时间>该值 ,且空闲连接>最大空闲数时直接逐出,不再根据MinEvictableIdleTimeMillis判断 (默认逐出策略),默认30m
  * timeBetweenEvictionRunsMillis = 60000L;//逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
  * numTestsPerEvictionRun = 5;//每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
  */
  private JedisPoolConfig jedisPoolConfig;
  /**
  *初始化启动,创建连接池
  *可以设置密码,防止外部操作
  */
  @PostConstruct
  public void init(){
  jedisPoolConfig = new JedisPoolConfig();
  jedisPoolConfig.setMinIdle(minIdle);
  jedisPoolConfig.setMaxIdle(maxIdle);
  jedisPoolConfig.setMaxTotal(maxTotal);
  if( password != null && !"".equals( password.trim() ) ){
  jedisPool = new JedisPool( jedisPoolConfig, this.host, this.port, Protocol.DEFAULT_TIMEOUT, this.password );
  }else{
  jedisPool = new JedisPool( jedisPoolConfig, this.host, this.port, Protocol.DEFAULT_TIMEOUT );
  }
  }
  @PreDestroy销毁
  public void destroy(){
  jedisPool.destroy();
  }
  private Jedis getJedis(){
  Jedis jedis = jedisPool.getResource();
  return jedis;
  }
  /**
  * 验证key是否为空
  */
  private void checkKeyNotBlank( String key ){
  if( key == null || "".equals( key ) ){
  throw new RuntimeException( "key is blank" );
  }
  }
  /**
  * set设置缓存
  */
  public void set( String keyPrefix, String key, Object value ){
  this.checkKeyNotBlank( key );
  this.getJedis().set( ObjectUtil.toBytes( keyPrefix + key ), ObjectUtil.toBytes( value ) );
  }
  /**
  * set设置缓存
  */
  public void set( String key, Object value ){
  this.set( defaultKeyPrefix, key, value );
  }
  /**
  * setNoPrefixToString
  */
  public void setNoPrefixToString(String key, String flag, String value ){
  this.checkKeyNotBlank( key );
  Logger.info("向缓存中添加标志位"+flag+"的缓存,其中KEY 是"+key+"_"+flag+"VALUE 是"+value);
  this.getJedis().set(key+"_"+flag, value);
  }
  /**
  * setex可以设置超时时间
  */
  public void setex( String keyPrefix, Integer timeOut, String key, Object value ){
  this.checkKeyNotBlank( key );
  this.getJedis().setex( ObjectUtil.toBytes( keyPrefix + key ), timeOut, ObjectUtil.toBytes( value ) );
  }
  /**
  * setex可以设置超时时间
  */
  public void setex( String key, Integer timeOut, Object value ){
  if(defaultKeyPrefix != null && !"".equals(defaultKeyPrefix)){
  this.setex( defaultKeyPrefix, timeOut, key, value );
  }else{
  this.setexObject(key, timeOut,  value);
  }
  }
  /**
  * setexObject可以设置超时时间
  */
  public void setexObject( String key, Integer timeOut, Object value ){
  this.checkKeyNotBlank( key );
  String jsonString = JsonUtil.toJson(value);
  this.getJedis().setex(key, timeOut, jsonString);
  }
  /**
  * get单个获取
  */
  public  T get( String keyPrefix, String key, Class clazz ){
  this.checkKeyNotBlank( key );
  Jedis redis = this.getJedis();
  byte[] bs = redis.get( ObjectUtil.toBytes( keyPrefix + key ) );
  if( bs == null || bs.length == 0 ){
  return null;
  }else{
  T value = ObjectUtil.toObject( bs, clazz );
  return value;
  }
  }
  /**
  * get单个获取
  */
  public  T get( String key, Class clazz ){
  return this.get( defaultKeyPrefix, key, clazz);
  }
  /**
  * get单个获取
  */
  public String getNoPrefixToString( String key ){
  checkKeyNotBlank(key);
  return this.getJedis().get(key);
  }
  /**
  * 获取所有的key
  * position 0为前包含,1位后包含, 2为所有*
  * containStr 包含字符串
  */
  public Map getAllKey(Integer position, String containStr){
  Map map = new HashMap();
  String sourceStr = "*";
  try{
  if(position == 0){
  sourceStr = containStr + sourceStr;
  }else if(position == 1){
  sourceStr = sourceStr + containStr;
  }
  Jedis redis = this.getJedis();
  Set set = (Set)redis.keys(sourceStr);
  if(!set.isEmpty()){
  for(String i : set){
  String value=this.getNoPrefixToString(i);
  map.put(i, value);
  Logger.info("后缀为"+containStr+"中的KEY 是"+i+", VALUE 是:"+value);
  }
  }else{
  if(position==1){
  Logger.info("后标志位为:"+containStr+"在缓存中没有数据");
  }else{
  Logger.info("前标志位为:"+containStr+"在缓存中没有数据");
  }
  }
  }catch(Exception e){
  Logger.error("匹配key为" + containStr + "异常", e);
  }
  return map;
  }
  /**
  * del删除
  */
  public void del( String keyPrefix, String key ){
  Jedis redis = this.getJedis();
  redis.del(key);
  }
  /**
  * del删除
  */
  public void del( String key ){
  Jedis redis = this.getJedis();
  redis.del(key);
  }
  

  public void setHost(String host) {
  this.host = host;
  }
  

  public void setPort(Integer port) {
  this.port = port;
  }
  

  public void setPassword(String password) {
  this.password = password;
  }
  

  public void setMinIdle(Integer minIdle) {
  this.minIdle = minIdle;
  }
  

  public void setMaxIdle(Integer maxIdle) {
  this.maxIdle = maxIdle;
  }
  

  public void setMaxTotal(Integer maxTotal) {
  this.maxTotal = maxTotal;
  }
  

  public void setDefaultKeyPrefix(String defaultKeyPrefix) {
  this.defaultKeyPrefix = defaultKeyPrefix;
  }



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-630682-1-1.html 上篇帖子: Java 操作redis 下篇帖子: redis基本配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表