这里简易封装了一下对redis缓存对象的管理,这个连接池只针对单独服务器,如果要使用集群的话这个就不适用了,需要使用ShardedJedisPool
List<JedisShardInfo> shards = Arrays.asList( new JedisShardInfo("localhost",6379), new JedisShardInfo("localhost",6380)); ShardedJedisPool pool = new ShardedJedisPool(new JedisPoolConfig(), shards);
-------------------------------------------------------------------------------------------
package com.ctweb.util.redis;
import javax.annotation.PostConstruct;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import com.ctweb.util.ProcessCodeEnum;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
*
* @author Dylan
* @date 2015年12月10日
*/
@Component
public class RedisClinet {
private static Logger log = LogManager.getLogger(RedisClinet.class);
@Value("${redis.host}")
private String host;
@Value("${redis.port}")
private String port;
@Value("${redis.auth}")
private String auth;
@Value("${redis.maxTotal}")
private int maxTotal;
@Value("${redis.maxIdle}")
private int maxIdle;
@Value("${redis.maxWaitMillis}")
private long maxWaitMillis;
private JedisPool jedisPool;
/*public RedisClinet(){
initialPool();
}*/
/**
* 初始化非切片池
*/
@PostConstruct
private void initialPool()
{
// 池基本配置
JedisPoolConfig config = new JedisPoolConfig();
//连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
//config.setBlockWhenExhausted(true);
//设置的逐出策略类名, 默认DefaultEvictionPolicy(当连接超过最大空闲时间,或连接数超过最大空闲连接数)
//config.setEvictionPolicyClassName("org.apache.commons.pool2.impl.DefaultEvictionPolicy");
//是否启用pool的jmx管理功能, 默认true
//config.setJmxEnabled(true);
//config.setJmxNamePrefix("pool");
//是否启用后进先出, 默认true
//config.setLifo(true);
//最大空闲连接数, 默认8个
config.setMaxIdle(maxIdle <= 0 ? 10 : maxIdle);
//最大连接数, 默认8个
config.setMaxTotal(maxTotal <= 0 ? 50 : maxTotal);
//获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1
config.setMaxWaitMillis(maxWaitMillis <= 0 ? 100000 : maxWaitMillis);
//逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
//config.setMinEvictableIdleTimeMillis(1800000);
//最小空闲连接数, 默认0
//config.setMinIdle(0);
//每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
//config.setNumTestsPerEvictionRun(3);
//对象空闲多久后逐出, 当空闲时间>该值 且 空闲连接>最大空闲数 时直接逐出,不再根据MinEvictableIdleTimeMillis判断 (默认逐出策略)
//config.setSoftMinEvictableIdleTimeMillis(1800000);
//在获取连接的时候检查有效性, 默认false
//config.setTestOnBorrow(false);
//在空闲时检查有效性, 默认false
//config.setTestWhileIdle(false);
//逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
//config.setTimeBetweenEvictionRunsMillis(-1);
jedisPool = new JedisPool(config, host, Integer.parseInt(null == port?"0":port));
log.debug("init jedis connection pool success -> host:"+host+",port:"+port);
}
/**
* 连接返回连接池
* @param jedis
* @param isBroken
*/
private void release(Jedis jedis, boolean isBroken) {
if (jedis != null) {
if (isBroken) {
jedisPool.returnBrokenResource(jedis);
} else {
jedisPool.returnResource(jedis);
}
log.debug("release jedis connection to pool ,active num:"+jedisPool.getNumActive()+",idel num:"+jedisPool.getNumIdle()+",wait num:"+jedisPool.getNumWaiters());
}
}
/**
* 获取jedis client
* @return
*/
private Jedis getJedis(){
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
jedis.auth(auth);
log.debug("get jedis client from connection pool success");
} catch (Exception e) {
throw ProcessCodeEnum.PROCESS_ERR.buildProcessException("get jedis client from connection pool fail or jedis connection pool init have error,check the host/port/auth!",e);
}
return jedis;
}
/**
* 对象置入缓存
* @param object
* @param key
* @param args 失效时间(单位:秒) 小于等于0认为永不过期
* @return
*/
public void set(Object object,String key,int... args) {
boolean isBroken = false;
if(null == object || StringUtils.isBlank(key))
throw ProcessCodeEnum.PROCESS_ERR.buildProcessException("jedis set object or key can not be null");
Jedis jedis = null;
int validTime = ArrayUtils.isNotEmpty(args) ? args[0] : 0;
try {
jedis = getJedis();
jedis.set(key.getBytes(), SerializeUtil.serialize(object));
if(validTime > 0)
jedis.expire(key.getBytes(), validTime);
} catch (Exception e) {
isBroken = true;
throw ProcessCodeEnum.PROCESS_ERR.buildProcessException("jedis set object have error",e);
}finally{
release(jedis, isBroken);
}
}
/**
* 从缓存中取值
* @param key
* @return
*/
public Object get(String key){
boolean isBroken = false;
if(StringUtils.isBlank(key))
throw ProcessCodeEnum.PROCESS_ERR.buildProcessException("jedis get key can not be null");
Jedis jedis = null;
Object result = null;
try {
jedis = getJedis();
byte[] value = jedis.get(key.getBytes());
result = SerializeUtil.unSerialize(value);
} catch (Exception e) {
isBroken = true;
throw ProcessCodeEnum.PROCESS_ERR.buildProcessException("jedis get object have error",e);
}finally{
release(jedis, isBroken);
}
return result;
}
/**
* 从缓存中删除
* @param key
* @return
*/
public boolean del(String key){
boolean isBroken = false;
if(StringUtils.isBlank(key))
throw ProcessCodeEnum.PROCESS_ERR.buildProcessException("jedis del key can not be null");
Jedis jedis = null;
boolean isSuc = false;
try {
jedis = getJedis();
isSuc = jedis.del(key.getBytes())>0;
} catch (Exception e) {
isBroken = true;
throw ProcessCodeEnum.PROCESS_ERR.buildProcessException("jedis del object have error",e);
}finally{
release(jedis, isBroken);
}
return isSuc;
}
}
相关推荐
为了解决这个问题,我们可以利用Redis这种高性能的键值存储系统来代替文件存储Session。Redis支持内存存储,读写速度极快,特别适合处理大量并发请求。 首先,我们需要了解`session_set_save_handler`函数。这是PHP...
为了提升性能和扩展性,可以使用Redis这种高性能的内存数据结构存储系统来代替文件存储Session数据。 Redis(Remote Dictionary Server)是一个开源的使用ANSI C语言编写的、支持网络、基于内存、可选持久性的键值...
描述中提到,“通过Redis实现session分布式”,这表明我们将使用Redis作为分布式会话存储,代替默认的基于JVM内存的会话管理方式。这种方式能够确保即使用户在集群中的不同Tomcat实例之间跳转,其会话状态也能保持...
- **使用Redis的集群功能**:将session数据存储在Redis集群中。 - **使用客户端路由**:根据session ID确定数据所在的节点。 #### 42、memcached与redis的区别? - **数据持久化**:Redis支持数据持久化,而...
5. **使用Token代替Session**:JWT(JSON Web Token)是一种流行的方式,将用户信息加密后作为Token,每次请求时携带Token验证用户身份,减少了服务器对Session的依赖。 6. **Spring-Session与Redis集成**:将...
Redis是一个开源的使用内存存储数据和对象的高性能键值存储系统,常用作数据库、缓存和消息中间件。在PHP中,可以使用内置的`redis`扩展来与Redis进行交互。 在使用Redis作为Session存储时,同样需要实现`...
6. **Session共享**:在分布式环境中,Redis可存储用户的Session,实现跨服务器会话共享。 7. **排行榜**:Sorted Set数据结构可用于实时更新和查询排行榜信息,如游戏积分榜、销售排行榜等。 8. **分布式唯一ID...
- 合理配置二级缓存,如使用 EhCache 或 Redis 提供的分布式缓存,减少对数据库的依赖。 - 设置合适的缓存级别,例如集合、实体、查询结果等,根据业务需求选择是否缓存。 - 注意缓存同步问题,避免并发环境下...
还有第三方缓存服务如Memcached或Redis可供选择。 5. **事务管理**: NHibernate 支持.NET的TransactionScope或手动管理的ISession.Transaction,确保数据一致性。 6. **生命周期管理**: NHibernate提供了多种...
- 二级缓存:跨Session共享,存储范围为Mapper(Namespace),可自定义存储实现,如 Ehcache 或 Redis。 这些面试知识点涵盖了MySQL的查询优化和MyBatis的基本操作,对于准备面试的开发者来说,理解并掌握这些内容...
二级缓存可以配置为进程内或分布式,如使用 EhCache 或 Redis 实现。 6. **事件和拦截器**:NHibernate允许注册事件监听器和拦截器,以便在特定操作(如对象的加载、保存等)前后执行自定义逻辑。这提供了高度的...
- 适当使用`session_start()`和`session_write_close()`,减少session锁对性能的影响。 - 利用`ob_start()`和`ob_end_flush()`开启输出缓冲,一次性发送完整页面,减少服务器与客户端的交互次数。 了解并熟练运用...
- 在高并发环境下,考虑使用分布式session管理,如将session数据存储在数据库、缓存(如Redis)或其他外部存储中,以减轻单个服务器的压力。 - 定期清理无用的session,避免内存泄漏。可以通过监听器或过滤器来实现...
Sa-Token v1.23.0这可能是史上功能最全的 Java ...—— 根据账号id踢人下线、根据Token值踢人下线账号封禁 —— 指定天数封禁、永久封禁、设定解封时间持久层扩展 —— 可集成Redis、Memcached等专业缓存中间件,重启数
使用这些扩展,开发人员可以优化他们的应用程序性能,例如通过 igbinary 更高效地存储 session 数据,以及通过 Redis 实现快速的键值存储和缓存功能。在安装和使用这些扩展时,确保 PHP、WAMP 服务器和扩展版本之间...
2. **Cache策略**:对象级缓存如HashMap在单机环境下可能无法适应集群环境,需要采用分布式缓存如Ehcache、JBossCache、OSCache,或者集中式缓存如Memcached。选择哪种取决于项目需求。 3. **线程和定时器**:在...
- 对于频繁访问的数据,可以使用Redis等缓存技术来存储。 - 使用Output Buffering (OB)等技术实现动态页面的静态化。 **4. 主从复制与读写分离** 通过MySQL主从复制实现读写分离,提高数据库的读取性能。 **5. ...
7. **实体状态管理**:合理使用Hibernate的`Session`和`Transaction`,避免脏读、不可重复读和幻读等问题。 综上所述,`applicationContext.xml`和`hibernate.cfg.xml`是Struts2应用性能优化的关键。通过调整bean...
具体的技术点包括使用可扩展的应用设计(例如Spring框架),以及Web服务器(如Apache、Nginx、IIS、JBoss)和数据库服务器(如MySQL、Oracle、Redis)的分离。 在架构演变的第二步,采取缓存处理是减少对网站访问、...