Redis 是一个高性能的 key-value 数据库,有以下三个特点:
1.支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
2.不仅仅支持简单的key-value类型的数据,同时还提供数据类型有:string(字符串),hash(哈希),list(列表、双向链表),set(集合)及zset(sorted set:有序集合)等数据结构的存储,也支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
3.支持数据的备份,即master-slave模式的数据备份。
Redis的所有操作都是原子性的,要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
Redis还支持 publish/subscribe, 通知, key 过期等等特性。
导入jar包
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
redis连接创建:
public class JedisUtil {
/**缓存生存时间 */
private final int expire = 60000;
private static JedisPool jedisPool = null;
private JedisUtil() {
}
private static synchronized JedisPool getPool() {
if (jedisPool == null) {
JedisPoolConfig config = new JedisPoolConfig();
//如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
config.setMaxTotal(100);
//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
config.setMaxIdle(10);
//表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
config.setMaxWaitMillis(1000 * 100);
//在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
config.setTestOnBorrow(true);
jedisPool = new JedisPool(config, JRedisConfig.REDIS_IP,
JRedisConfig.REDIS_PORT,
10000, JRedisConfig.REDIS_PASSWORD);
}
return jedisPool;
}
/**
* 从jedis连接池中获取获取jedis对象
* @return
*/
public Jedis getJedis() {
return getPool().getResource();
}
private static final JedisUtil jedisUtil = new JedisUtil();
/**
* 获取JedisUtil实例
* @return
*/
public static JedisUtil getInstance() {
if(jedisUtil!=null){
return new JedisUtil();
}
return jedisUtil;
}
/**
* 回收jedis
* @param jedis
*/
public void returnJedis(Jedis jedis) {
try {
jedisPool.returnResource(jedis);
}catch (Exception ex){
if(jedis !=null){
returnBrokenJedis(jedis);
}
}
}
public void returnBrokenJedis(Jedis jedis) {
jedisPool.returnBrokenResource(jedis);
}
/**
* 设置过期时间
* @author
* @param
* @param
*/
public void expire(String key, int seconds) {
if (seconds <= 0) {
return;
}
Jedis jedis =null;
try {
jedis = getJedis();
jedis.expire(key, seconds);
returnJedis(jedis);
}catch (Exception ex ){
if(jedis!=null){
returnBrokenJedis(jedis);
}
}
}
/**
* 设置默认过期时间
* @author
* @param
*/
public void expire(String key) {
expire(key, expire);
}
}
redis工具类:
object JedisForModule {标签:String,getInstance,实现,userid,代码,Redis,jedis,JedisUtil,recType From: https://blog.51cto.com/u_15261296/5788841
/**
* JRedisConfig.REDIS_SELECT
* 是用于切换到指定的数据库,数据库索引号 index 用数字值指定,以 0 作为起始索引值
*/
/**
* Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
* Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
* @param recType
* @param userid
* @param gson
*/
def putJsonJedis(recType:String,userid:String,gson:String): Unit ={
if(recType!=null&&userid.nonEmpty){
val jedis = JedisUtil.getInstance.getJedis
if(JRedisConfig.REDIS_SELECT != null){
jedis.select(JRedisConfig.REDIS_SELECT.toInt)
}
jedis.hset(recType,userid,gson)
JedisUtil.getInstance.returnJedis(jedis)
}
}
def putJsonJedis(recType:String,userid:String,byte:Array[Byte]): Unit ={
if(recType!=null&&userid.nonEmpty){
val jedis = JedisUtil.getInstance.getJedis
if(JRedisConfig.REDIS_SELECT != null){
jedis.select(JRedisConfig.REDIS_SELECT.toInt)
}
jedis.hset(SafeEncoder.encode(recType),SafeEncoder.encode(userid),byte)
JedisUtil.getInstance.returnJedis(jedis)
}
}
def putMjedis(recType:String,hash:Map[String, String]): Unit ={
if(recType!=null && hash!= null &&hash.nonEmpty){
val jedis = JedisUtil.getInstance.getJedis
jedis.hmset(recType,hash)
JedisUtil.getInstance.returnJedis(jedis)
}
}
def hdelJedis(recType:String,userid:String): Unit ={
if(recType!=null&&userid.nonEmpty){
val jedis = JedisUtil.getInstance.getJedis
jedis.hdel(recType,userid)
JedisUtil.getInstance.returnJedis(jedis)
}
}
def getMixJedis(videotype:String,userid:String): String ={
val jedis: Jedis = JedisUtil.getInstance.getJedis
val result = jedis.hget(videotype,userid)
JedisUtil.getInstance.returnJedis(jedis)
result
}
def hgetByeJedis(recType:String,userid:String): Array[Byte] ={
var byte = Array[Byte]()
if(recType == null || userid == null) return byte
val jedis = JedisUtil.getInstance.getJedis
if(JRedisConfig.REDIS_SELECT != null){
jedis.select(JRedisConfig.REDIS_SELECT.toInt)
}
byte = jedis.hget(recType.getBytes,userid.getBytes)
JedisUtil.getInstance.returnJedis(jedis)
byte
}
/**
* Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
* 集合对象的编码可以是 intset 或者 hashtable。
* Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
* 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
* @param recType
* @param userid
*/
def putSetJedis(recType:String,userid:String): Unit ={
if(recType!=null&&userid.nonEmpty){
val jedis = JedisUtil.getInstance.getJedis
jedis.sadd(recType,userid)
JedisUtil.getInstance.returnJedis(jedis)
}
}
def getSetJedis(recType:String): util.Set[String] ={
var useridset = new util.HashSet[String]()
if(recType!=null){
val jedis = JedisUtil.getInstance.getJedis
useridset.addAll(jedis.smembers(recType))
JedisUtil.getInstance.returnJedis(jedis)
}
useridset
}
/**
* Redis 字符串数据类型的相关命令用于管理 redis 字符串值
* @param recType
* @param value
*/
def setJedis(recType:String,value:String): Unit ={
if(recType!=null && StringUtils.isNotBlank(value)){
val jedis = JedisUtil.getInstance.getJedis
jedis.set(recType,value)
JedisUtil.getInstance.returnJedis(jedis)
}
}
def getHistoryVideoIds(key:String,videoid:String): Set[String] ={
val jedis: Jedis = JedisUtil.getInstance.getJedis
val set = jedis.smembers(key)
jedis.sadd(key,videoid)
set.toSet
}
/**
* Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
* 一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
* @param key
* @return
*/
def getBRPOP(key:String): util.List[String] ={
val jedis = JedisUtil.getInstance.getJedis
val result = jedis.brpop(0,key)
JedisUserUtil.getInstance.returnJedis(jedis)
result
}
}