加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

Redis的恍惚查询在出产情形呈现严峻的机能题目

发布时间:2018-11-21 13:14:40 所属栏目:编程 来源:狗不理
导读:Redis是一个高机能高服从的key-value存储的nosql数据库,因为数据是存储在内存中,因此会见速率很是快,因为项目涉及到数据库的查询很是多,而数据变大并不长短常频仍,以是在项目中回收Redis分管大部门MySQL的压力。 在项目中现实行使我用的Redis提供的客

Redis的恍惚查询在出产情形呈现严峻的机能题目

Redis是一个高机能高服从的key-value存储的nosql数据库,因为数据是存储在内存中,因此会见速率很是快,因为项目涉及到数据库的查询很是多,而数据变大并不长短常频仍,以是在项目中回收Redis分管大部门MySQL的压力。

在项目中现实行使我用的Redis提供的客户端毗连器材包jedis,在项目中引入jedis.Jar即可

  1. public static Set<String> searchLike(String like_key) { 
  2.    //线上情形恍惚查询带来严峻的机能题目,杜绝行使 
  3.    if(!Config.IS_BUG){ 
  4.         return null; 
  5.    } 
  6.    Jedis jedis = RedisApi.getJedis(); 
  7.    boolean is_ok = true; 
  8.    try { 
  9.         if (jedis == null) { 
  10.            return null; 
  11.         } 
  12.         return jedis.keys(like_key); 
  13.     } catch (Exception e) { 
  14.         // TODO: handle exception 
  15.         is_ok = false; 
  16.        return null; 
  17.     } finally { 
  18.         close(jedis, is_ok); 
  19.    } 

每当用户登录乐成之后,城市天生一个cookie,别离存在客户端和Redis数据库,cookie的key由cookie值+用户ID构成:cookie字符串+"_"+用户ID,

譬喻用户cookie为“d9fb0ea5955fcf0a2183c5076”,用户ID为 19092,

那Redis中存储的key就是 d9fb0ea5955fcf0a2183c5076_19092,最终的key-vlaue就是:

  1. {"d9fb0ea5955fcf0a2183c5076_19092":d9fb0ea5955fcf0a2183c5076} 

而在用户不绝的登录乐成,就不绝地发生这样的记录,久而久之,会蕴蓄出很是多的无用的key,挥霍redis的空间,也加重了redis查询的承担,因此想到行使Redis的恍惚查询来清掉无用的cookie的key

而Redis的客户端jedis操纵是通过jedis.keys(keys)来完成的,keys可以行使通配符来匹配Redis中的key

通配符声名:

*: 0到恣意多个字符 eg: searchLike("test*")

?: 1个字符

好比此刻必要破除某个用户全部的无用的cookie的key,,则可以写成“ *_19092 ”

  1. String key_like = "*_19092"; 
  2. Set<String> keys = RedisApi.searchLike(key_like); 

这样就可以查出全部这个用户的keys,挪用jedis提供的批量删除key的要领即可到达目标。

  1. String key_like = "*_19092"; 
  2. Set<String> keys = RedisApi.searchLike(key_like); 

到这里从需求到逻辑到编码趁热打铁,简朴测试没什么题目后,就宣布到线上,因为平常网站的流量不算很是高,以是运行了几天也没产生什么非常,直到本日早上,拥有几十万粉丝的公家号发推文,推文的内容直接链接到网站,因此说刹时流量长短常高

Redis的恍惚查询在出产情形呈现严峻的机能题目

运行了约莫异常钟之后,运营溘然发狂的过来说网站会见很是慢,乃至呈现错误码,内心一慌,赶忙上去看日记,我了个乖乖啊,的确是吓人,error日记想流水一样蹦出来,但五一不破例都是下面图示的错误:从Redis池中获取不大毗连数,顿时上redis处事器查察,发明CPU已经达到了100%以上

Redis的恍惚查询在出产情形呈现严峻的机能题目

能让Redis的CPU到100%的,我想出了一下几个也许:

  1. 毗连数过多,占用毗连的时刻过长
  2. 存储的值过大,存取均很占用CPU和内存
  3. 慢查询,事其余操纵守候时刻超时
  4. redis阻塞,某个操纵把Redis阻塞,导致CPU飙升

因为项目上线时刻已经好久,前三个也许根基都在平常查察Redis处事器机能的进程中解除去,因此很或许率是第四个,溘然想起前几天做的成果,有个恍惚查询,该不是这个题目吧?我到网站输入“Redis 恍惚查询 机能”,出来很是多关于redis恍惚查询机能急剧降落的的环境,并且提议出产情形下禁用redis的恍惚查询,于是我把恍惚查询这块营业直接注释掉,从头上线,运行了半天,再没呈现这个题目,因此可以断定就是恍惚查询搞的鬼。

【更换方案】

有题目必定是要办理的,既然恍惚查询行不通的,那就得想此外步伐到达目标,想到Redis有Set这这种存储布局,因此可以把用户的全部cookie key都放到一个用户专属的Set中,每次用户登录乐成之后,都把之前Set里的cookie key破除,然后再把最新的key放进去,这样就可以到达同样的目标了。

  1. String setKey = "prefix_customer_cookie_list_10920"; 
  2.        String token="ss2ssssss"; 
  3.         //取出全部的用户的cookie key 
  4.         Set<String> list = RedisApi.getSet(setKey); 
  5.        if (list != null && list.size() > 0) { 
  6.             //删除用户全部的cookie key 
  7.             RedisApi.removeFromSet(setKey, list.toArray(new String[0])); 
  8.         } 
  9.        //把最新的cookie key插手到Set中 
  10.         RedisApi.addSet(setKey, token); 
【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0,

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读