Redis 是一个开源的基于内存的数据结构存储,Redis 是远程字典服务(Remote Dictionary Server )的简写 ,它通常被用作数据库,缓存,消息代理和流引擎。Redis提供的数据结构有string,hashes,lists,sets,sorted sets五种,Redis内置了复制,Lua脚本,LRU驱动事件,事务以及不同级别的磁盘持久方法。并提供了高可用的Redis 哨兵和Redis集群方案
1. Jedis是什么
Jedis 是 Redis 官方首选的 Java 客户端开发包, Jedis客户端同时支持单机模式、分片模式、集群模式的访问模式,通过构建Jedis类对象实现单机模式下的数据访问,通过构建ShardedJedis类对象实现分片模式的数据访问,通过构建JedisCluster类对象实现集群模式下的数据访问。
2. Jedis工作模式
Jedis主要有四大模块, Jedis,JedisCluster,JedisSentinel和ShardedJedis对应了Redis的四种工作模式
序号 | 模块 | Redis模式 |
1 | Jedis | Redis Standalone(单节点模式) |
2 | JedisCluster | Redis Cluster(集群模式) |
3 | JedisSentinel | Redis Sentinel(哨兵模式) |
4 | ShardedJedis | Redis Sharding(分片模式) |
3. Jedis用例
依赖第三方包 jedis-2.7.2.jar 、commons-pool2-2.3.jar
JedisPoolManager用户管理数据库连接,比如获取或者释放
package com.redis.jedis.project.common;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisPoolManager {
//private static String REDISDB_IP = "192.168.62.44";
private static String REDISDB_IP = "127.0.0.1";
private static int REDISDB_PORT = 6379;
private JedisPool jedisPool;
public JedisPoolManager() {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(20);
config.setMaxIdle(5);
config.setMaxWaitMillis(1000l);
config.setTestOnBorrow(false);
jedisPool = new JedisPool(config, REDISDB_IP, REDISDB_PORT);
}
public Jedis getJedis() throws Exception {
try {
Jedis jedis = jedisPool.getResource();
return jedis;
} catch (Exception e) {
throw e;
}
}
public void releaseJedis(Jedis jedis) {
if (jedis != null) {
jedis.close();
}
}
}
JedisManager 用户Redis数据库操作,当前只写了增删改查等常用行为
package com.redis.jedis.project.common;
import java.util.Map;
import redis.clients.jedis.Jedis;
public class JedisManager {
private JedisPoolManager pool = new JedisPoolManager();
protected void set(int dbIndex, String key, String value, int cashSeconds)
throws Exception {
Jedis jedis = null;
try {
jedis = pool.getJedis();
jedis.select(dbIndex);
jedis.set(key, value);
if (cashSeconds > 0) {
jedis.expire(key, cashSeconds);
}
} catch (Exception e) {
throw e;
} finally {
pool.releaseJedis(jedis);
}
}
protected String get(int dbIndex, String key) throws Exception {
Jedis jedis = null;
try {
jedis = pool.getJedis();
jedis.select(dbIndex);
return jedis.get(key);
} catch (Exception e) {
throw e;
} finally {
pool.releaseJedis(jedis);
}
}
protected void delete(int dbIndex, String key) throws Exception {
Jedis jedis = null;
try {
jedis = pool.getJedis();
jedis.select(dbIndex);
jedis.del(key);
} catch (Exception e) {
throw e;
} finally {
pool.releaseJedis(jedis);
}
}
protected Map<String, String> hgetAll(int dbIndex, String key)
throws Exception {
Jedis jedis = null;
try {
jedis = pool.getJedis();
jedis.select(dbIndex);
return jedis.hgetAll(key);
} catch (Exception e) {
System.out.println(e);
throw e;
} finally {
pool.releaseJedis(jedis);
}
}
protected void hset(int dbIndex, String key, String field, String value)
throws Exception {
Jedis jedis = null;
try {
jedis = pool.getJedis();
jedis.select(dbIndex);
jedis.hset(key, field, value);
} catch (Exception e) {
throw e;
} finally {
pool.releaseJedis(jedis);
}
}
protected void hmset(int dbIndex, String key, Map<String, String> maps,
int cacheSeconds) throws Exception {
Jedis jedis = null;
try {
jedis = pool.getJedis();
jedis.select(dbIndex);
jedis.hmset(key, maps);
if (cacheSeconds >= 0) {
jedis.expire(key, cacheSeconds);
}
} catch (Exception e) {
throw e;
} finally {
pool.releaseJedis(jedis);
}
}
protected void del(int dbIndex, String key) throws Exception {
Jedis jedis = null;
try {
jedis = pool.getJedis();
jedis.select(dbIndex);
jedis.del(key);
} catch (Exception e) {
throw e;
} finally {
pool.releaseJedis(jedis);
}
}
}
服务接口,实现具体业务,假设是登陆操作
package com.redis.jedis.project.common;
public interface ILoginCash {
public boolean longin(LoginDTO loginDTO,int cashSeconds) throws Exception;
public LoginDTO getLogInfo(int userId) throws Exception;
public boolean longout(int userId) throws Exception;
}
package com.redis.jedis.project.common;
import java.io.Serializable;
public class LoginDTO implements Serializable {
private static final long serialVersionUID = 1L;
private int userId;
private String code;
private String name;
private String ip;
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
}
实现服务接口时,同时继承JedisManager管理类,这样可以使用JedisManager封装的操作数据库的行为,为了更好的方便管理KEY名称,一般Rredis中的KEY 都是由 对象:ID 或者对象:ID:类型 等结构管理的
package com.redis.jedis.project.common;
import java.util.HashMap;
import java.util.Map;
public class LoginCashManager extends JedisManager implements ILoginCash {
private static final String REDIS_USER = "user";
@Override
public boolean longin(LoginDTO loginDTO, int cashSeconds) throws Exception {
boolean result = false;
String key = REDIS_USER + ":" + loginDTO.getUserId();
try {
Map<String, String> map = new HashMap<String, String>();
map.put("code", loginDTO.getCode());
map.put("name", loginDTO.getName());
map.put("ip", loginDTO.getIp());
hmset(RedisDBConstants.USER_DB_INDEX, key, map, cashSeconds);
result = true;
} catch (Exception e) {
System.out.println(e);
}
return result;
}
@Override
public LoginDTO getLogInfo(int userId) throws Exception {
if (userId <= 0) {
return null;
}
String key = REDIS_USER + ":" + userId;
LoginDTO loginDTO = null;
try {
Map<String, String> map = hgetAll(RedisDBConstants.USER_DB_INDEX,
key);
if (map != null && !map.isEmpty()) {
loginDTO = new LoginDTO();
loginDTO.setUserId(userId);
loginDTO.setCode(map.get("code"));
loginDTO.setName(map.get("name"));
loginDTO.setIp(map.get("ip"));
}
} catch (Exception e) {
System.out.println(e);
}
return loginDTO;
}
@Override
public boolean longout(int userId) throws Exception {
if (userId <= 0) {
return false;
}
String tokenKey = REDIS_USER + ":" + userId;
boolean result = false;
try {
del(RedisDBConstants.USER_DB_INDEX, tokenKey);
result = true;
} catch (Exception e) {
System.out.println(e);
}
return result;
}
}
Redis默认有16个库,分别由数字 0到15编号,为方便管理,可以通过名称定义的方式以便查找
package com.redis.jedis.project.common;
public class RedisDBConstants {
public static int SYS_DB_INDEX = 0;
public static int USER_DB_INDEX = 1;
}
测试类
package com.redis.jedis.project.common;
public class MainTestRedis {
public static void main(String[] args) throws Exception {
LoginCashManager logincash = new LoginCashManager();
System.out.println("==SAVE NOW==");
LoginDTO loginDTO = new LoginDTO();
loginDTO.setUserId(1000);
loginDTO.setCode("1003");
loginDTO.setName("LIUY");
loginDTO.setIp("127.0.0.1");
logincash.longin(loginDTO,50);
System.out.println("==SAVE END==");
LoginDTO login =logincash.getLogInfo(1000);
System.out.println("==GET INFO==");
System.out.println("id="+login.getUserId());
System.out.println("code="+login.getCode());
System.out.println("name="+login.getName());
System.out.println("loginIP="+login.getIp());
}
}
打印测试结果
==SAVE NOW==
==SAVE END==
==GET INFO==
id=1000
code=1003
name=LIUY
loginIP=127.0.0.1