盛开的雪莲花 2017-11-23 11:43 采纳率: 0%
浏览 739

多线程下redis的疑问,请大神指导 附源码

public class JedisConfig
{
//redis池
private static JedisPool jedisPool = null;

//redis服务器的ip
private static final String HOST = "127.0.0.1";

//端口
private static final int PORT = 6379;

//可用连接实例的最大数目
private static final int MAX_ACTIVE = 1024;

//控制一个pool最多有多少个状态为空闲的jedis实例
private static final int MAX_IDLE = 200;

//jedis池没有对象返回时,最大等待时间
private static final int MAX_WAIT = 10000;

//超时时间
private static final int TIMEOUT = 10000;

//在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
private static boolean TEST_ON_BORROW = true;

private static JedisConfig instance = null;

/**
 * 初始化jedisPool
 */
private void initJedisPool()
{
    JedisPoolConfig config = new JedisPoolConfig();
    config.setMaxTotal(MAX_ACTIVE);
    config.setMaxIdle(MAX_IDLE);
    config.setMaxWaitMillis(MAX_WAIT);
    config.setTestOnBorrow(TEST_ON_BORROW);
    jedisPool = new JedisPool(config, HOST, PORT, TIMEOUT);
}

public synchronized Jedis getJedis()
{
    Jedis jedis = null;
    if (jedisPool != null)
    {
        jedis = jedisPool.getResource();
    }
    return jedis;
}

/**
 * 如果jedis为空,则进行初始化
 */
private JedisConfig()
{
    if (jedisPool == null)
    {
        initJedisPool();
    }
}

/**
 * 释放jedis资源
 * @param jedis
 */
public synchronized void returnResource(Jedis jedis) 
{
    if (jedis != null) 
    {
        jedis.close();
    }
}
/**
 * 
 * 单例获取JedisConfig实例
 * 
 * @return 返回当前的jedis实例
 */
public static JedisConfig getInstance()
{
    if (instance == null)
    {
        synchronized (JedisConfig.class)
        {
            if (instance == null)
            {
                instance = new JedisConfig();
            }
        }

    }
    return instance;
}

}

上面是我的jedispool和jedis的初始化代码,下面附上我的调用代码
public class JedisManage
{
/**
* 获取redis实例
*/
private static Jedis jedis = JedisConfig.getInstance().getJedis();

/**
 * 存储图片流信息
 * 
 * @param key key
 * @param fileId 字段值
 * @param value  存储值
 */
public static void setImageInfoToRedis(String key,String fileId,String value)
{

    synchronized (jedis)
    {
        jedis.hset(key, fileId, value);
    }
}
      /**
 * 获取图片信息
 * 
 * 
 * @param key 
 * @param fileId
 * @return
 */
public static String  getImageInfo(String key,String fileId)
{
    return jedis.hget(key, fileId);
}

}

项目整个背景是前台每一次请求都会加载一个小图片,所以我想使用redis缓存图片,如果下次请求是同一个我就直接从redis中读取,由于前台的请求非常频发,一秒钟大概有400次,这样的情况下程序异常退出,不知道是自己代码写的有问题还是,求大神指导!!!!
程序在多线程环境下,异常退出,分析后发现是redis的问题,因为要是不适用redis的缓存就是好的。

  • 写回答

1条回答 默认 最新

  • wb_snail 2017-11-24 05:03
    关注

    用redis缓存静态文件没有必要吧,缓存一个需要一定计算时间才能得出的结果才有意义,一般web容器对于静态文件都有自己的缓存策略的

    评论

报告相同问题?

悬赏问题

  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振