项目中用到Redis 主要用于缓存 项目帮助类如下:

import java.io.Serializable;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import org.apache.commons.lang3.SerializationUtils;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.StringRedisTemplate;

import com.meitianhui.platform.bootconfig.SpringContextUtil;

/***
* Redis工具类
*/
public class RedisUtil {

private static StringRedisTemplate redisTemplate = SpringContextUtil.getBean(StringRedisTemplate.class);

/**
* 加入缓存
* @param key
* @param value
*/
public static void set(String key, Serializable value) {
RedisConnection connection = RedisUtil.getConnection();
try {
connection.set(key.getBytes(), SerializationUtils.serialize(value));
} finally {
closeConnection(connection);
}
}
/**
* 置新值到缓存中,如果key存在,则返回false
* @param key
* @param value
* @return
*/
public static boolean setNx(String key, Serializable value) {
RedisConnection connection = RedisUtil.getConnection();
try {
return connection.setNX(key.getBytes(), SerializationUtils.serialize(value));
} finally {
closeConnection(connection);
}
}

/***
* 加入缓存,并设置缓存时间
* @param key
* @param value
* @param seconds
*/
public static void setEx(String key, Serializable value, long seconds) {
RedisConnection connection = RedisUtil.getConnection();
try {
connection.setEx(key.getBytes(), seconds, SerializationUtils.serialize(value));
} finally {
closeConnection(connection);
}
}

/***
* 获取缓存信息
* @param key
* @return
*/
public static <T> T get(String key){
RedisConnection connection = RedisUtil.getConnection();
try {
byte[] bytes = connection.get(key.getBytes());
if(bytes == null){
return null;
}
return SerializationUtils.deserialize(bytes);
} finally {
closeConnection(connection);
}
}

/***
* 设置新值,并返回旧值
* @param key
* @param value
* @return
*/
public static <T> T getSet(String key, Serializable value){
RedisConnection connection = RedisUtil.getConnection();
try {
byte[] bytes = connection.getSet(key.getBytes(), SerializationUtils.serialize(value));
if(bytes == null){
return null;
}
return SerializationUtils.deserialize(bytes);
} finally {
closeConnection(connection);
}
}

/***
* 删除指定缓存
* @param keys
* @return
*/
public static boolean del(String... keys){
RedisConnection connection = RedisUtil.getConnection();
try {
byte[][] rawKeys = new byte[keys.length][0];
for (int i = 0; i < keys.length; i++) {
rawKeys[i] = keys[i].getBytes();
}
long num = connection.del(rawKeys);
return num > 0;
} finally {
closeConnection(connection);
}
}

/***
* 重置过期时间
* @param key
* @param seconds
* @return
*/
public static Boolean expire(String key, long seconds){
RedisConnection connection = RedisUtil.getConnection();
try{
return connection.expire(key.getBytes(), seconds);
} finally{
closeConnection(connection);
}
}

/***
* 检查key是否已经存在
* @param key
* @return
*/
public static Boolean exists(String key){
RedisConnection connection = RedisUtil.getConnection();
try{
return connection.exists(key.getBytes());
} finally{
closeConnection(connection);
}
}

/***
* 根据匹配规则查询key值
* @param pattern
* @return
*/
public static Set<String> keys(String pattern){
RedisConnection connection = RedisUtil.getConnection();
try{
Set<String> strSet = new HashSet<String>();
Set<byte[]> set = connection.keys(pattern.getBytes());
if(set != null && !set.isEmpty()){
Iterator<byte[]> iterator = set.iterator();
while(iterator.hasNext()){
strSet.add((String)SerializationUtils.deserialize(iterator.next()));
}
}
return strSet;
} finally{
closeConnection(connection);
}
}

/***
* 获取redis数据数量
* @return
*/
public static long dbSize(){
RedisConnection connection = RedisUtil.getConnection();
try{
return connection.dbSize();
} finally{
closeConnection(connection);
}
}

/***
* 获取连接
*/
private static RedisConnection getConnection(){
return redisTemplate.getConnectionFactory().getConnection();
}

/***
* 关闭连接
* @param connection
*/
private static void closeConnection(RedisConnection connection){
if(connection != null){
connection.close();
}
}
}

Redis 五种数据类型

Redis的键值可以使用物种数据类型:字符串,散列表,列表,集合,有序集合

字符串类型:字符串是Redis中最基本的数据类型,它能够存储任何类型的字符串,包含二进制数据。可以用于存储邮箱,JSON化的对象,甚至是一张图片,一个字符串允许存储的最大容量为512MB。字符串是其他四种类型的基础,与其他几种类型的区别从本质上来说只是组织字符串的方式不同而已。

散列类型:散列类型相当于Java中的HashMap,他的值是一个字典,保存很多key,value对,每对key,value的值个键都是字符串类型,换句话说,散列类型不能嵌套其他数据类型。一个散列类型键最多可以包含2的32次方-1个字段。

列表类型:列表类型(list)用于存储一个有序的字符串列表,常用的操作是向队列两端添加元素或者获得列表的某一片段。列表内部使用的是双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度是O(1),获取越接近列表两端的元素的速度越快。但是缺点是使用列表通过索引访问元素的效率太低(需要从端点开始遍历元素)。所以列表的使用场景一般如:朋友圈新鲜事,只关心最新的一些内容。借助列表类型,Redis还可以作为消息队列使用。

集合类型:集合在概念在高中课本就学过,集合中每个元素都是不同的,集合中的元素个数最多为2的32次方-1个,集合中的元素是没有顺序的。

有序集合类型:有序集合类型与集合类型的区别就是他是有序的。有序集合是在集合的基础上为每一个元素关联一个分数,这就让有序集合不仅支持插入,删除,判断元素是否存在等操作外,还支持获取分数最高/最低的前N个元素。有序集合中的每个元素是不同的,但是分数却可以相同。有序集合使用散列表和跳跃表实现,即使读取位于中间部分的数据也很快,时间复杂度为O(log(N)),有序集合比列表更费内存。