/*************************************************************************
* HONGLING CAPITAL CONFIDENTIAL AND PROPRIETARY
*
* COPYRIGHT (C) HONGLING CAPITAL CORPORATION 2012
* ALL RIGHTS RESERVED BY HONGLING CAPITAL CORPORATION. THIS PROGRAM
* MUST BE USED SOLELY FOR THE PURPOSE FOR WHICH IT WAS FURNISHED BY
* HONGLING CAPITAL CORPORATION. NO PART OF THIS PROGRAM MAY BE REPRODUCED
* OR DISCLOSED TO OTHERS,IN ANY FORM, WITHOUT THE PRIOR WRITTEN
* PERMISSION OF HONGLING CAPITAL CORPORATION. USE OF COPYRIGHT NOTICE
* DOES NOT EVIDENCE PUBLICATION OF THE PROGRAM.
* HONGLING CAPITAL CONFIDENTIAL AND PROPRIETARY
*************************************************************************/
package com.hongling.common.cache;
import com.hongling.common.exception.CacheException;
import com.hongling.common.util.CommonUtils;
import org.apache.commons.io.Charsets;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import redis.clients.jedis.Jedis;
import java.util.Date;
import java.util.Set;
/**
* 缓存中存储会话。
*
* @author Yelin.G at 2015/08/03
*/
public class CacheSessionStorage extends CacheStorageAdapter {
protected static final Logger LOG = LogManager.getLogger(CacheSessionStorage.class);
protected JedisClient jedisClient;
public static final String USER_LIMT_LOCK_KEY="USER_LIMT_LOCK_";
public CacheSessionStorage() {
super();
}
public CacheSessionStorage(JedisClient jedisClient) {
super();
this.jedisClient = jedisClient;
}
/**
* 保存数据在缓存中。
*
* @param key 键。
* @param value 值。
* @param expiredTime 过期时间。
*/
@Override
public void set(String key, Object value, int expiredTime, Jedis jedis) {
if(value instanceof String) {
jedis.set(key, (String) value);
jedis.expire(key, expiredTime);
} else {
try {
jedis.set(key.getBytes("utf8"), CommonUtils.objectToByte(value));
jedis.expire(key, expiredTime);
} catch (Exception ex) {
LOG.error("设置kv-store值失败:{}={}", key, value);
throw new CacheException(ex);
}
}
}
/**
* 保存数据在缓存中。
*
* @param key 键。
* @param value 值。
*/
@Override
public void set(String key, Object value, Jedis jedis) {
if(value instanceof String) {
jedis.set(key, (String) value);
} else {
try {
jedis.set(key.getBytes("utf8"), CommonUtils.objectToByte(value));
} catch (Exception ex) {
LOG.error("设置kv-store值失败:{}={}", key, value);
throw new CacheException(ex);
}
}
}
/**
* 保存数据在缓存中。
*
* @param key 键。
* @param value 值。
* @param expiredTime 过期时间。
*/
@Override
public void setAndClose(String key, Object value, int expiredTime) {
Jedis jedis = null;
try {
jedis = jedisClient.getJedis();
set(key, value, expiredTime, jedis);
} finally {
if(jedis != null) {
jedis.close();
}
}
}
/**
* 保存数据在缓存中。
*
* @param key 键。
* @param value 值。
*/
@Override
public void setAndClose(String key, Object value) {
Jedis jedis = null;
try {
jedis = jedisClient.getJedis();
set(key, value, jedis);
} finally {
if(jedis != null) {
jedis.close();
}
}
}
/**
* 保存数据在缓存中。
*
* @param key 键。
* @param value 值。
* @param expiredTime 过期时间。
*/
@Override
public void set(String key, Object value, Date expiredTime, Jedis jedis) {
Long expire = expiredTime.getTime() - System.currentTimeMillis();
if(expire > Integer.MAX_VALUE * 1000){
set(key, value, Integer.MAX_VALUE, jedis);
}
set(key, value, expire.intValue()/1000, jedis);
}
/**
* 保存数据在缓存中。
*
* @param key 键。
* @param value 值。
* @param expiredTime 过期时间。
*/
@Override
public void setAndClose(String key, Object value, Date expiredTime) {
Jedis jedis = null;
try {
jedis = jedisClient.getJedis();
set(key, value, expiredTime, jedis);
} finally {
if(jedis != null) {
jedis.close();
}
}
}
/**
* 从缓存中获取数据。
*
* @param key 键。
* @return 缓存中数据。
*/
@Override
public String get(String key, Jedis jedis) {
return jedis.get(key);
}
/**
* 从缓存中获取数据。
*
* @param key 键。
* @return 缓存中数据。
*/
@Override
public String getAndClose(String key) {
Jedis jedis = null;
try {
jedis = jedisClient.getJedis();
return jedis.get(key);
} finally {
if(jedis != null) {
jedis.close();
}
}
}
/**
* 从缓存中获取数据。
*
* @param key 键。
* @return 缓存中数据。
*/
@Override
public Object get(byte[] key, Jedis jedis) {
try {
return CommonUtils.byteToObject(jedis.get(key));
} catch (Exception ex) {
LOG.error("获取kv-store值失败:key={}", new String(key, Charsets.UTF_8));
throw new CacheException(ex);
}
}
/**
* 从缓存中获取数据。
*
* @param key 键。
* @return 缓存中数据。
*/
@Override
public Object getAndClose(byte[] key) {
Jedis jedis = null;
try {
jedis = jedisClient.getJedis();
return get(key, jedis);
} finally {
if(jedis != null) {
jedis.close();
}
}
}
/**
* 将缓存中的数据增加1。
*
* @param key 键。
* @param jedis {@link redis.clients.jedis.Jedis}
* @return 计算后缓存的值。
*/
public Long increase(String key, Jedis jedis) {
return jedis.incr(key);
}
/**
* 将缓存中的数据增加1。
*
* @param key 键。
* @return 计算后缓存的值。
*/
public Long increaseAndClose(String key) {
Jedis jedis = null;
try {
jedis = jedisClient.getJedis();
return jedis.incr(key);
} finally {
if(jedis != null) {
jedis.close();
}
}
}
/**
* 将缓存中的数据减去1。
*
* @param key 键。
* @param jedis {@link redis.clients.jedis.Jedis}
* @return 计算后缓存的值。
*/
public Long decrease(String key, Jedis jedis) {
return jedis.decr(key);
}
/**
* 将缓存中的数据减去1。
*
* @param key 键。
* @return 计算后缓存的值。
*/
public Long decreaseAndClose(String key) {
Jedis jedis = null;
try {
jedis = jedisClient.getJedis();
return jedis.decr(key);
} finally {
if(jedis != null) {
jedis.close();
}
}
}
/**
* 将缓存中的数据增加指定值。
*
* @param key 键。
* @param num 增加的数值。
* @param jedis {@link redis.clients.jedis.Jedis}
* @return 计算后缓存的值。
*/
public Long increaseBy(String key, long num, Jedis jedis) {
return jedis.incrBy(key, num);
}
/**
* 将缓存中的数据增加指定值。
*
* @param key 键。
* @param num 增加的数值。
* @return 计算后缓存的值。
*/
public Long increaseByAndClose(String key, long num) {
Jedis jedis = null;
try {
jedis = jedisClient.getJedis();
return jedis.incrBy(key, num);
} finally {
if(jedis != null) {
jedis.close();
}
}
}
/**
* 将缓存中的数据减去指定值。
*
* @param key 键。
* @param num 增加的数值。
* @param jedis {@link redis.clients.jedis.Jedis}
* @return 计算后缓存的值。
*/
public Long decreaseBy(String key, long num, Jedis jedis) {
return jedis.decrBy(key, num);
}
/**
* 将缓存中的数据减去指定值。
*
* @param key 键。
* @param num 增加的数值。
* @return 计算后缓存的值。
*/
public Long decreaseByAndClose(String key, long num) {
Jedis jedis = null;
try {
jedis = jedisClient.getJedis();
return jedis.decrBy(key, num);
} finally {
if(jedis != null) {
jedis.close();
}
}
}
/**
* 从缓存中移除数据。
*
* @param key 键。
* @return {@link Long}。
*/
@Override
public Long remove(String key, Jedis jedis) {
return jedis.del(key);
}
/**
* 从缓存中移除数据。
*
* @param key 键。
* @return {@link Long}。
*/
@Override
public Long removeAndClose(String key) {
Jedis jedis = null;
try {
jedis = jedisClient.getJedis();
return jedis.del(key);
} finally {
if(jedis != null) {
jedis.close();
}
}
}
/************************************SET集合操作start************************************************/
/**
* 将字符串数据放入SET集合中。
*
* @param key 键。
* @param values 数据集合。
* @return {@link Long}。
*/
@Override
public Long addToSet(String key, String... values) {
Jedis jedis = null;
try {
jedis = jedisClient.getJedis();
return jedis.sadd(key, values);
} finally {
if(jedis != null) {
jedis.close();
}
}
}
/**
* 将字符串数据放入SET集合中。
*
* @param key 键。
* @param expiredTime 过期时间。
* @param values 数据集合。
* @return {@link Long}。
*/
@Override
public Long addToSet(String key, int expiredTime, String... values) {
Jedis jedis = null;
try {
jedis = jedisClient.getJedis();
Long sadd = jedis.sadd(key, values);
jedis.expire(key, expiredTime);
return sadd;
} finally {
if(jedis != null) {
jedis.close();
}
}
}
/**
* 将指定字符串数据移除SET集合中。
*
* @param key 键。
* @param values 数据集合。
* @return {@link Long}。
*/
@Override
public Long removeFromSet(String key, String... values) {
Jedis jedis = null;
try {
jedis = jedisClient.getJedis();
return jedis.srem(key, values);
} finally {
if(jedis != null) {
jedis.close();
}
}
}
/**
* 检测指定字符串数据是否在SET集合中。
*
* @param key 键。
* @param value 数据集合。
* @return {@link java.lang.Boolean}。
*/
@Override
public Boolean isMemberInSet(String key, String value) {
Jedis jedis = null;
try {
jedis = jedisClient.getJedis();
return jedis.sismember(key, value);
} finally {
if(jedis != null) {
jedis.close();
}
}
}
/**
* 检测指定字符串数据是否在SET集合中。
*
* @param key 键。
* @return {@link java.util.Set}。
*/
@Override
public Set<String> getAllMembersInSet(String key) {
Jedis jedis = null;
try {
jedis = jedisClient.getJedis();
return jedis.smembers(key);
} finally {
if(jedis != null) {
jedis.close();
}
}
}
/**
* 查询指定Key的SET集合数量。
*
* @param key 键。
* @return {@link java.lang.Long}。
*/
@Override
public Long getMemberCountInSet(String key) {
Jedis jedis = null;
try {
jedis = jedisClient.getJedis();
return jedis.scard(key);
} finally {
if(jedis != null) {
jedis.close();
}
}
}
/************************************SET集合操作end************************************************/
/**
* 关闭连接。
*
*/
public void close(Jedis jedis) {
if(jedis != null) {
jedis.close();
}
}
/**
* jedis获取锁。
*
* @param key 键。
* @return
*/
public boolean lock(String key,String value){
Jedis jedis = null;
try {
jedis = jedisClient.getJedis();
if(jedis.setnx(key,value) == 1){
jedis.expire(key,60*5); //默认5分钟
return true;
}else {
return false;
}
} finally {
if(jedis != null) {
jedis.close();
}
}
}
/**
* jedis获取锁。
*
* @param key 键。
* @return
*/
public boolean lock(String key){
return this.lock(key,"1");
}
/**
* 从jedis释放锁
*
* @param key 键。
* @return
*/
public Long unlock(String key){
return removeAndClose(key);
}
/**
* 设置{@link com.hongling.common.cache.JedisClient}。
*
* @param jedisClient {@link com.hongling.common.cache.JedisClient}。
*/
public void setJedisClient(JedisClient jedisClient) {
this.jedisClient = jedisClient;
}
/**
* 获取{@link redis.clients.jedis.Jedis}。
*
*/
public Jedis getJedis() {
return jedisClient.getJedis();
}
}
相关推荐
"阿里巴巴Redis使用规范" 本文将详细介绍阿里巴巴28条Redis使用规范,涵盖了Redis性能优化、数据存储、安全、实例管理等方面的内容。 规范一:控制key的长度 为了避免Redis中的keys过长,阿里巴巴建议控制key的...
设计缓存的前世今生,以及分布式缓存redis,以及4.0新增功能和阿里云增强版
在云计算日益普及的今天,阿里云提供了便捷的公共服务,如Redis缓存服务,帮助企业或个人快速构建高效、可靠的分布式应用。本教程将详细讲解如何在阿里云上搭建公网Redis集群,并利用Java进行访问。 一、阿里云公网...
【基于Redis缓存数据库和Nginx负载均衡技术的购物网站性能优化】 随着互联网的快速发展,电子商务已经成为人们日常生活的重要组成部分。购物网站的性能优化对于提供流畅的用户体验和支撑大规模并发访问至关重要。本...
阿里云Redis技术服务概述是阿里云提供的一项高性能、可靠性的Redis技术服务,旨在帮助用户构建高效、可靠的数据存储和缓存系统。本文概述了阿里云Redis技术服务的主要特点和优势,包括技术创新、变革未来发展历程...
文件“alisoft-xplatform-asf-cache”可能是指阿里巴巴开源的XPlatform中的ASF Cache模块,这是一个分布式缓存框架,结合了上述缓存技术的一些特点,可能包含有对这些缓存系统的研究和实现,适用于大型分布式系统。...
主要有视频播放器插件、阿里云OSS存储、支付宝即时到账接口、Redis缓存、PHPmailer批量发送邮件、Monolog 日志工具、ECharts图表库、PDO预处理、PHP-FFmpeg、WebSocket、无限级分类
阿里云Redis服务提供了高性能的缓存解决方案,帮助游戏开发者解决数据库的压力问题。 阿里云Redis服务的特性包括: * 高性能:阿里云Redis服务提供了高性能的缓存解决方案,能够满足游戏行业的高性能需求。 * 可靠...
Redis,全称Remote Dictionary Server,是一款高性能的键值存储系统,广泛应用于缓存、消息队列、数据库等多个领域。在阿里云Linux环境下安装和配置Redis,可以极大地提升应用的响应速度和处理能力。以下是关于Redis...
Redis作为一个流行的键值对存储数据库,广泛用于数据库、缓存和消息中间件的角色。其高性能和持久化能力使其成为云存储时代开发者的重要工具。 在"乘云上"部分,通过一个基于Redis实现特殊消息队列的案例,介绍了...
Redis是一个开源的内存数据存储系统,常用于实现高速缓存、消息队列和实时数据存储等场景。阿里云的ApsaraDB for Redis基于原生Redis进行了优化,提供了高可用性、高性能和便捷的管理能力。 2. 积分排行榜场景: ...
阿里云Redis技术架构是针对企业级应用而设计的高性能、高可用的数据存储解决方案。该架构主要分为单机、集群、容灾和多活四种模式,分别适用于不同的业务场景。 单机模式适合对协议敏感且对性能有较高要求的场景,...
阿里云Redis云服务是针对企业级应用而设计的高性能、高可用的数据存储解决方案。作为一款基于ApsaraDB平台的服务,阿里云Redis提供了多种产品形态,包括主从双副本、主从单副本以及集群双副本,以满足不同业务场景的...
例如,使用Redis缓存数据库查询结果以提高响应速度,用原子操作实现计数器,通过发布订阅模式实现消息传递等。 6. **性能优化**:学习如何配置和优化Redis以获得最佳性能,比如调整内存大小、设置适当的过期策略、...
这款工具对于那些需要高效管理Redis缓存的开发者来说,是不可或缺的利器。 首先,Redis是一款开源的、基于内存的数据结构存储系统,它可以作为数据库、缓存和消息代理使用。它支持多种数据结构,如字符串、哈希、...
4. 性能优化:云数据库的性能优化是非常重要的,阿里云 Redis 版云数据库提供了多种性能优化方法,包括调整服务器参数、优化查询语句、使用缓存等。 5. 安全管理:云数据库的安全管理是非常重要的,阿里云 Redis 版...
4. **Redis**:Redis是一个高性能的键值对存储系统,通常被用作缓存服务。它可以极大地提高读取速度,降低对数据库的压力。在这个项目中,Redis将作为缓存层,存储热点数据。当应用接收到请求时,首先尝试从Redis中...
标题 "memcached数据完整迁移到redis" 描述的是一个数据迁移的过程,从使用 memcached 存储的数据转换到使用 redis 存储。这个过程在 IT 领域中是常见的,因为不同的缓存系统有不同的特性和优势。让我们深入探讨这个...
Redis是一种高性能的键值数据库,常用于数据缓存、消息队列和数据库功能。它支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,这使得Redis在处理实时数据操作方面表现出色。在Linux和Windows操作系统上...
而Codis是阿里巴巴开源的一个分布式Redis解决方案,通过Proxy代理实现多实例的统一访问,解决了单个Redis实例无法满足大规模并发和大容量数据的问题。 Codis到Redis Cluster的迁移工具支持将已经在Codis集群中的...