省略redis服务的搭建
省略搭建SSM环境
1、在pom.xml文件中引入redis客户端依赖jedis
<!-- jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
2、 新建一个redis.propertis属性文件,用于存储redis的连接信息和配置信息
#远程主机地址
redis.hostname=填写你redis的主机地址
#redis服务端口
redis.port=6379
#redis数据库
redis.database=0
#最大连接数
redis.pool.maxActive=100
#最大空闲数
redis.pool.maxIdle=20
#最大等待时间
redis.pool.maxWait=3000
redis.pool.testOnBorrow=true
3、 封装jedis工具类
(1) jedisPoolWriper
作用:redis连接处
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class JedisPoolWriper {
//Redis连接池对象
private JedisPool jedisPool;
public JedisPoolWriper(final JedisPoolConfig poolConfig, final String host,
final int port) {
try {
jedisPool = new JedisPool(poolConfig, host, port);
} catch (Exception e) {
e.printStackTrace();
}
}
//获取Redis连接池对象
public JedisPool getJedisPool() {
return jedisPool;
}
// 注入Redis连接池对象
public void setJedisPool(JedisPool jedisPool) {
this.jedisPool = jedisPool;
}
}
(2) jedisUtil
作用:封装了jedis的常用AIP,方便调用
public class JedisUtil {
/**
* 缓存生存时间
*/
private final int expire = 60000;
/** 操作Key的方法 */
public Keys KEYS;
/** 对存储结构为String类型的操作 */
public Strings STRINGS;
/** 对存储结构为List类型的操作 */
public Lists LISTS;
/** 对存储结构为Set类型的操作 */
public Sets SETS;
/** 对存储结构为HashMap类型的操作 */
public Hash HASH;
/** Redis连接池对象 */
private JedisPool jedisPool;
/**
* 获取redis连接池
*
* @return
*/
public JedisPool getJedisPool() {
return jedisPool;
}
/**
* 设置redis连接池
*
* @return
*/
public void setJedisPool(JedisPoolWriper jedisPoolWriper) {
this.jedisPool = jedisPoolWriper.getJedisPool();
}
/**
* 从jedis连接池中获取获取jedis对象
*
* @return
*/
public Jedis getJedis() {
return jedisPool.getResource();
}
/**
* 设置过期时间
*
* @author xiangze
* @param key
* @param seconds
*/
public void expire(String key, int seconds) {
if (seconds <= 0) {
return;
}
Jedis jedis = getJedis();
jedis.expire(key, seconds);
jedis.close();
}
public void expire(String key) {
expire(key, expire);
}
public class Keys {
public String flushAll() {
Jedis jedis = getJedis();
String stata = jedis.flushAll();
jedis.close();
return stata;
}
public String rename(String oldkey, String newkey) {
return rename(SafeEncoder.encode(oldkey), SafeEncoder.encode(newkey));
}
public long renamenx(String oldkey, String newkey) {
Jedis jedis = getJedis();
long status = jedis.renamenx(oldkey, newkey);
jedis.close();
return status;
}
public String rename(byte[] oldkey, byte[] newkey) {
Jedis jedis = getJedis();
String status = jedis.rename(oldkey, newkey);
jedis.close();
return status;
}
public long expired(String key, int seconds) {
Jedis jedis = getJedis();
long count = jedis.expire(key, seconds);
jedis.close();
return count;
}
public long expireAt(String key, long timestamp) {
Jedis jedis = getJedis();
long count = jedis.expireAt(key, timestamp);
jedis.close();
return count;
}
public long ttl(String key) {
// ShardedJedis sjedis = getShardedJedis();
Jedis sjedis = getJedis();
long len = sjedis.ttl(key);
sjedis.close();
return len;
}
public long persist(String key) {
Jedis jedis = getJedis();
long count = jedis.persist(key);
jedis.close();
return count;
}
public long del(String... keys) {
Jedis jedis = getJedis();
long count = jedis.del(keys);
jedis.close();
return count;
}
public long del(byte[]... keys) {
Jedis jedis = getJedis();
long count = jedis.del(keys);
jedis.close();
return count;
}
public boolean exists(String key) {
// ShardedJedis sjedis = getShardedJedis();
Jedis sjedis = getJedis();
boolean exis = sjedis.exists(key);
sjedis.close();
return exis;
}
public List<String> sort(String key) {
// ShardedJedis sjedis = getShardedJedis();
Jedis sjedis = getJedis();
List<String> list = sjedis.sort(key);
sjedis.close();
return list;
}
public List<String> sort(String key, SortingParams parame) {
// ShardedJedis sjedis = getShardedJedis();
Jedis sjedis = getJedis();
List<String> list = sjedis.sort(key, parame);
sjedis.close();
return list;
}
public String type(String key) {
// ShardedJedis sjedis = getShardedJedis();
Jedis sjedis = getJedis();
String type = sjedis.type(key);
sjedis.close();
return type;
}
public Set<String> keys(String pattern) {
Jedis jedis = getJedis();
Set<String> set = jedis.keys(pattern);
jedis.close();
return set;
}
}
public String get(String key) {
// ShardedJedis sjedis = getShardedJedis();
Jedis sjedis = getJedis();
String value = sjedis.get(key);
sjedis.close();
return value;
}
public byte[] get(byte[] key) {
// ShardedJedis sjedis = getShardedJedis();
Jedis sjedis = getJedis();
byte[] value = sjedis.get(key);
sjedis.close();
return value;
}
public String set(String key, String value) {
return set(SafeEncoder.encode(key), SafeEncoder.encode(value));
}
public String set(String key, byte[] value) {
return set(SafeEncoder.encode(key), value);
}
public String set(byte[] key, byte[] value) {
Jedis jedis = getJedis();
String status = jedis.set(key, value);
jedis.close();
return status;
}
public String setEx(String key, int seconds, String value) {
Jedis jedis = getJedis();
String str = jedis.setex(key, seconds, value);
jedis.close();
return str;
}
public String setEx(byte[] key, int seconds, byte[] value) {
Jedis jedis = getJedis();
String str = jedis.setex(key, seconds, value);
jedis.close();
return str;
}
public long setnx(String key, String value) {
Jedis jedis = getJedis();
long str = jedis.setnx(key, value);
jedis.close();
return str;
}
public long setRange(String key, long offset, String value) {
Jedis jedis = getJedis();
long len = jedis.setrange(key, offset, value);
jedis.close();
return len;
}
public long append(String key, String value) {
Jedis jedis = getJedis();
long len = jedis.append(key, value);
jedis.close();
return len;
}
public long decrBy(String key, long number) {
Jedis jedis = getJedis();
long len = jedis.decrBy(key, number);
jedis.close();
return len;
}
public long incrBy(String key, long number) {
Jedis jedis = getJedis();
long len = jedis.incrBy(key, number);
jedis.close();
return len;
}
public String getrange(String key, long startOffset, long endOffset) {
// ShardedJedis sjedis = getShardedJedis();
Jedis sjedis = getJedis();
String value = sjedis.getrange(key, startOffset, endOffset);
sjedis.close();
return value;
}
public String getSet(String key, String value) {
Jedis jedis = getJedis();
String str = jedis.getSet(key, value);
jedis.close();
return str;
}
public List<String> mget(String... keys) {
Jedis jedis = getJedis();
List<String> str = jedis.mget(keys);
jedis.close();
return str;
}
public String mset(String... keysvalues) {
Jedis jedis = getJedis();
String str = jedis.mset(keysvalues);
jedis.close();
return str;
}
public long strlen(String key) {
Jedis jedis = getJedis();
long len = jedis.strlen(key);
jedis.close();
return len;
}
}
}
6、 Service层
接口:
public interface AreaService {
// redis key
public static final String AREA_LIST_KEY= "arealist";
List<Area> getAreaList();
}
实现类:
@Service
public class AreaServiceImpl implements AreaService {
// 自动注入DAO的实现
@Autowired
private AreaDao areaDao;
@Autowired
private JedisUtil.Keys jedisKeys;
@Autowired
private JedisUtil.Strings jedisStrings;
@Override
@Transactional
public List<Area> getAreaList() {
// redis的key
String key = AREA_LIST_KEY;
// 接收对象
List<Area> areaList = null;
// jackson操作类
ObjectMapper mapper = new ObjectMapper();
// 判断redis中key是否存在
// 1、存在,直接从redis中取数据
// 2、不存在,查询数据库,获取数据,并把数据更新到redis中
if (!jedisKeys.exists(key)) {
// 从数据库里面取出相应数据
areaList = areaDao.queryArea();
// 将查询出来的数据转JSON,存入redis
String jsonString;
try {
jsonString = mapper.writeValueAsString(areaList);
} catch (JsonProcessingException e) {
e.printStackTrace();
throw new AreaOperationException(e.getMessage());
}
jedisStrings.set(key, jsonString);
} else {
// 存在,查询出redis的数据
String jsonString = jedisStrings.get(key);
// 获取需要转换的JavaType
JavaType javaType = mapper.getTypeFactory().constructParametricType(ArrayList.class, Area.class);
try {
// 将相关key对应的value里的的string转换成java对象的实体类集合
areaList = mapper.readValue(jsonString, javaType);
} catch (JsonParseException e) {
e.printStackTrace();
throw new AreaOperationException(e.getMessage());
} catch (JsonMappingException e) {
e.printStackTrace();
throw new AreaOperationException(e.getMessage());
} catch (IOException e) {
e.printStackTrace();
throw new AreaOperationException(e.getMessage());
}
}
return areaList;
}
}
7、用debug模式启动测试类进行调试
@Test
public void testGetAreaList() {
List<Area> areaList = areaService.getAreaList();
System.out.println(areaList.get(1).getAreaName());
}