如何在java中使用redis

Python011

如何在java中使用redis,第1张

public class RedisListJava {

   public static void main(String[] args) {

      //连接本地的 Redis 服务

      Jedis jedis = new Jedis("localhost")

      System.out.println("Connection to server sucessfully")

      //存储数据到列表中

      jedis.lpush("tutorial-list", "Redis")

      jedis.lpush("tutorial-list", "Mongodb")

      jedis.lpush("tutorial-list", "Mysql")

     // 获取存储的数据并输出

     List<String> list = jedis.lrange("tutorial-list", 0 ,5)

     for(int i=0 i<list.size() i++) {

       System.out.println("Stored string in redis:: "+list.get(i))

     }

 }

}

应该是redis本身的服务有问题了

本文所针对的连接超时问题所涉及的相关元素如下:

Redis客户端: Jedis (java)

Redis版本:2.8.12

Redis部署操作系统类型:Linux

正文开始:

No 1.Redis执行大命令(时间复杂度为O(N)的命令)

问题剖析:

a.Redis服务器端通过单线程处理命令,一旦有大命令被执行,Redis将无法及时响应来自客户端的任何命令

关于Redis大命令的监控,可以查看slowlog来观察

b.在使用jedis作为redis客户端时,当redis连接池的配置参数testOnBorrow=true时,默认会在获取redis连接

时,先执行redis的ping方法,而基于原因a,此时redis将无法及时响应,自然会报出time out异常

如何解决:

a.尽量避免使用时间复杂度为O(N)的命令

b.如果无法避免使用时间复杂度为O(N)的命令,则应降低其使用频率,避免在业务高峰期时使用

No 2.Redis单次操作数据包过大

问题分析

a.单次操作数据包过大,且操作频繁,极有可能会导致网络拥堵

b.在使用jedis作为redis客户端时,当redis连接池的配置参数testOnBorrow=true时,默认会在获取redis连接

时,先执行redis的ping方法,而基于原因a,此时redis将无法及时响应,自然会报出time out异常

如何解决:

a.排查代码,确定是否存在大数据(数据条目过多/单条数据过大)操作,将其进行改造,改造方案有两个:

a1.数据拆分,变更数据类型(常见的情况是将java中的collection类型序列化后存入redis的String数据

类型中),如将String数据类型调整为hash/list/set等,这常用于解决单条数据量过大的情况

a2.调整业务逻辑,减少单次数据查询范围(常见的情况如将redis中的整个hash数据取回,在应用程序内存中获取需要的entry),如使用hget等单条查询命令替换hgetall命令