`
godsend_jin
  • 浏览: 41815 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

使用redis管理对象缓存,可代替session

 
阅读更多

这里简易封装了一下对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。Redis支持内存存储,读写速度极快,特别适合处理大量并发请求。 首先,我们需要了解`session_set_save_handler`函数。这是PHP...

    PHP使用Redis替代文件存储Session的方法

    为了提升性能和扩展性,可以使用Redis这种高性能的内存数据结构存储系统来代替文件存储Session数据。 Redis(Remote Dictionary Server)是一个开源的使用ANSI C语言编写的、支持网络、基于内存、可选持久性的键值...

    redis-tomcat

    描述中提到,“通过Redis实现session分布式”,这表明我们将使用Redis作为分布式会话存储,代替默认的基于JVM内存的会话管理方式。这种方式能够确保即使用户在集群中的不同Tomcat实例之间跳转,其会话状态也能保持...

    Redis面试知识点.pdf

    - **使用Redis的集群功能**:将session数据存储在Redis集群中。 - **使用客户端路由**:根据session ID确定数据所在的节点。 #### 42、memcached与redis的区别? - **数据持久化**:Redis支持数据持久化,而...

    分布式Session解决方案.docx

    5. **使用Token代替Session**:JWT(JSON Web Token)是一种流行的方式,将用户信息加密后作为Token,每次请求时携带Token验证用户身份,减少了服务器对Session的依赖。 6. **Spring-Session与Redis集成**:将...

    PHP实现Session入库/存入redis的方法

    Redis是一个开源的使用内存存储数据和对象的高性能键值存储系统,常用作数据库、缓存和消息中间件。在PHP中,可以使用内置的`redis`扩展来与Redis进行交互。 在使用Redis作为Session存储时,同样需要实现`...

    Redis小记

    6. **Session共享**:在分布式环境中,Redis可存储用户的Session,实现跨服务器会话共享。 7. **排行榜**:Sorted Set数据结构可用于实时更新和查询排行榜信息,如游戏积分榜、销售排行榜等。 8. **分布式唯一ID...

    一次hibernate的优化实践

    - 合理配置二级缓存,如使用 EhCache 或 Redis 提供的分布式缓存,减少对数据库的依赖。 - 设置合适的缓存级别,例如集合、实体、查询结果等,根据业务需求选择是否缓存。 - 注意缓存同步问题,避免并发环境下...

    NHibernate学习文档

    还有第三方缓存服务如Memcached或Redis可供选择。 5. **事务管理**: NHibernate 支持.NET的TransactionScope或手动管理的ISession.Transaction,确保数据一致性。 6. **生命周期管理**: NHibernate提供了多种...

    面试整理.pdf

    - 二级缓存:跨Session共享,存储范围为Mapper(Namespace),可自定义存储实现,如 Ehcache 或 Redis。 这些面试知识点涵盖了MySQL的查询优化和MyBatis的基本操作,对于准备面试的开发者来说,理解并掌握这些内容...

    NHibernate3.3源码

    二级缓存可以配置为进程内或分布式,如使用 EhCache 或 Redis 实现。 6. **事件和拦截器**:NHibernate允许注册事件监听器和拦截器,以便在特定操作(如对象的加载、保存等)前后执行自定义逻辑。这提供了高度的...

    PHP动态网站开发中常用的几个小技巧.pdf

    - 适当使用`session_start()`和`session_write_close()`,减少session锁对性能的影响。 - 利用`ob_start()`和`ob_end_flush()`开启输出缓冲,一次性发送完整页面,减少服务器与客户端的交互次数。 了解并熟练运用...

    JSP session配置对web应用的影响

    - 在高并发环境下,考虑使用分布式session管理,如将session数据存储在数据库、缓存(如Redis)或其他外部存储中,以减轻单个服务器的压力。 - 定期清理无用的session,避免内存泄漏。可以通过监听器或过滤器来实现...

    Sa-Token:这可能是史上功能最全的Java权限认证框架!目前已集成——登录认证、权限认证、分布式Session会话、微服务网关鉴权、单点登录、OAuth2.0、踢人下线、Redis集成、前后台分离、记住我模式、模拟他人账号、临时身份切换、账号封禁、多账号认证体系、注解式鉴权、路由拦截式鉴权、花式token生成、自动续签、同端互斥登录、会话治理、密码加密、jwt集成、Spring集成、WebFlux集成..

    Sa-Token v1.23.0这可能是史上功能最全的 Java ...—— 根据账号id踢人下线、根据Token值踢人下线账号封禁 —— 指定天数封禁、永久封禁、设定解封时间持久层扩展 —— 可集成Redis、Memcached等专业缓存中间件,重启数

    php_igbinary-1.1.1-5.5-ts-vc11-x86

    使用这些扩展,开发人员可以优化他们的应用程序性能,例如通过 igbinary 更高效地存储 session 数据,以及通过 Redis 实现快速的键值存储和缓存功能。在安装和使用这些扩展时,确保 PHP、WAMP 服务器和扩展版本之间...

    java应用服务器集群环境下代码编写要注意的问题参照.pdf

    2. **Cache策略**:对象级缓存如HashMap在单机环境下可能无法适应集群环境,需要采用分布式缓存如Ehcache、JBossCache、OSCache,或者集中式缓存如Memcached。选择哪种取决于项目需求。 3. **线程和定时器**:在...

    PHP面试题集锦(包含mysql相关)

    - 对于频繁访问的数据,可以使用Redis等缓存技术来存储。 - 使用Output Buffering (OB)等技术实现动态页面的静态化。 **4. 主从复制与读写分离** 通过MySQL主从复制实现读写分离,提高数据库的读取性能。 **5. ...

    app+hib 配置文件

    7. **实体状态管理**:合理使用Hibernate的`Session`和`Transaction`,避免脏读、不可重复读和幻读等问题。 综上所述,`applicationContext.xml`和`hibernate.cfg.xml`是Struts2应用性能优化的关键。通过调整bean...

    大型网站技术架构分析(余浩东).pdf

    具体的技术点包括使用可扩展的应用设计(例如Spring框架),以及Web服务器(如Apache、Nginx、IIS、JBoss)和数据库服务器(如MySQL、Oracle、Redis)的分离。 在架构演变的第二步,采取缓存处理是减少对网站访问、...

Global site tag (gtag.js) - Google Analytics