/*************************************************************************
* 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缓存服务,帮助企业或个人快速构建高效、可靠的分布式应用。本教程将详细讲解如何在阿里云上搭建公网Redis集群,并利用Java进行访问。 一、阿里云公网...
【基于Redis缓存数据库和Nginx负载均衡技术的购物网站性能优化】 随着互联网的快速发展,电子商务已经成为人们日常生活的重要组成部分。购物网站的性能优化对于提供流畅的用户体验和支撑大规模并发访问至关重要。本...
关于Dotnet_core的基础库,其中包含redis缓存以及,阿里大鱼短信服务以及七牛云存储、阿里_System.Extension.Core
阿里云Redis是一款基于开源Redis数据库服务的云产品,它提供了高性能、高可用、安全的数据存储解决方案,广泛应用于缓存、消息队列、数据结构服务器等多个场景。以下将详细阐述创建Redis实例、设置白名单以及连接...
文件“alisoft-xplatform-asf-cache”可能是指阿里巴巴开源的XPlatform中的ASF Cache模块,这是一个分布式缓存框架,结合了上述缓存技术的一些特点,可能包含有对这些缓存系统的研究和实现,适用于大型分布式系统。...
在这样的背景下,阿里云推出的Redis技术服务,作为一项依托于云平台的强大解决方案,不仅集合了Redis的优秀特性,还融入了阿里云在数据服务领域的技术创新,为用户构建高效和可靠的数据存储及缓存系统提供了坚实的...
主要有视频播放器插件、阿里云OSS存储、支付宝即时到账接口、Redis缓存、PHPmailer批量发送邮件、Monolog 日志工具、ECharts图表库、PDO预处理、PHP-FFmpeg、WebSocket、无限级分类
阿里云Redis服务提供了高性能的缓存解决方案,帮助游戏开发者解决数据库的压力问题。 阿里云Redis服务的特性包括: * 高性能:阿里云Redis服务提供了高性能的缓存解决方案,能够满足游戏行业的高性能需求。 * 可靠...
阿里Redis最佳实践与实战指南主要涵盖了Redis在阿里云上的应用和优化策略,旨在帮助开发者和运维人员更好地理解和使用Redis。以下是对文中提到的关键知识点的详细解释: 1. **Redis架构与版本** - **标准版**:最...
Redis,全称Remote Dictionary Server,是一款高性能的键值存储系统,广泛应用于缓存、消息队列、数据库等多个领域。在阿里云Linux环境下安装和配置Redis,可以极大地提升应用的响应速度和处理能力。以下是关于Redis...
根据提供的信息,我们可以总结出以下关于“阿里云Redis技术架构演进”的详细知识点: ### 一、阿里云Redis概述 **阿里云Redis**是阿里云提供的一种基于内存的数据存储服务,支持多种数据结构,如字符串(Strings)...
Redis作为一个流行的键值对存储数据库,广泛用于数据库、缓存和消息中间件的角色。其高性能和持久化能力使其成为云存储时代开发者的重要工具。 在"乘云上"部分,通过一个基于Redis实现特殊消息队列的案例,介绍了...
Redis是一个开源的内存数据存储系统,常用于实现高速缓存、消息队列和实时数据存储等场景。阿里云的ApsaraDB for Redis基于原生Redis进行了优化,提供了高可用性、高性能和便捷的管理能力。 2. 积分排行榜场景: ...
阿里云Redis技术架构是针对企业级应用而设计的高性能、高可用的数据存储解决方案。该架构主要分为单机、集群、容灾和多活四种模式,分别适用于不同的业务场景。 单机模式适合对协议敏感且对性能有较高要求的场景,...
Redis最佳实践与实战指南由七天玩转Redis实训营课程内容整理而成,不仅系统性地介绍Redis的整体架构及在多种场景下的最佳实践经验,而且揭秘阿里云Redis开发规范和运维解法,更有基于Redis的开发实操教程。...
阿里云Redis云服务是针对企业级应用而设计的高性能、高可用的数据存储解决方案。作为一款基于ApsaraDB平台的服务,阿里云Redis提供了多种产品形态,包括主从双副本、主从单副本以及集群双副本,以满足不同业务场景的...
- **增量更新**:当MySQL中的数据发生变化时,更新Redis中的缓存。 #### 2. 数据一致性 - **双写策略**:数据变化时,同时更新MySQL和Redis,保证数据的一致性。 - **异步更新**:先更新MySQL,再异步更新Redis。 ...
阿里云Redis数据库技术旨在提供高效、高可用的缓存与数据存储解决方案。在当前的阿里云Redis服务中,无论是主从版还是集群规格,读写操作均集中于master节点,以确保数据一致性。然而,这种架构在面对高并发读取需求...