redis在開發中常用於緩衝,使用者權限管理,訊息佇列等功能,今天學習一下springboot整合redis的方式,redis的安裝啟動可以百度到,這裡只講代碼的實現方式。
首先,引入相關依賴:
<!-- 添加redis支援 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>1.2.8.RELEASE</version> </dependency>
將我們之前在讀取設定檔中建立的ReadProperties更名為RedisUtil,代碼更改如下:
/** * @Package:com.springboot.utils * @ClassName:RedisUtil * @Description:redis工具類 * @Author Shuyu.Wang * @Date 2017-12-07 12:18 **/@EnableConfigurationProperties({Redis.class})@Componentpublic class RedisUtil { @Autowired private Redis redis; public void read(){ System.out.println(redis.getIp()); } /** * 非切片連結池 */ private JedisPool jedisPool; /** * 非切片串連池初始化 */ private JedisPool initialPool() { // 池基本配置 JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(redis.getMaxTotal()); config.setMaxIdle(redis.getMaxIdle()); config.setMaxWaitMillis(redis.getMaxActive()); config.setTestOnBorrow(redis.getTestOnBorrow()); config.setTestOnReturn(redis.getTestOnReturn()); jedisPool = new JedisPool(config, redis.getIp(), redis.getPort()); return jedisPool; } /** * 在多線程環境同步初始化 * */ private synchronized void poolInit() { if (jedisPool == null) { initialPool(); } } /** * 非切片用戶端連結 同步擷取非切片Jedis執行個體 * * @return Jedis * */ @SuppressWarnings("deprecation") public synchronized Jedis getJedis() { if (jedisPool == null) { poolInit(); } Jedis jedis = null; try { if (jedisPool != null) { jedis = jedisPool.getResource(); // jedis.auth(password); } } catch (Exception e) { System.out.println("拋錯"); e.printStackTrace(); // 釋放jedis對象 jedisPool.returnBrokenResource(jedis); } finally { // 返還串連池 if (jedis != null && jedisPool != null) { jedisPool.returnResource(jedis); } } return jedis; }}
另外新進一個工具類,實現序列化和還原序列化:
/** * 序列化工具類 * @author Shuyu.Wang * */public class SerializeUtil { /** * 序列化 * @param value * @return */ public static byte[] serialize(Object value) { if (value == null) { throw new NullPointerException("Can't serialize null"); } byte[] rv = null; ByteArrayOutputStream bos = null; ObjectOutputStream os = null; try { bos = new ByteArrayOutputStream(); os = new ObjectOutputStream(bos); os.writeObject(value); os.close(); bos.close(); rv = bos.toByteArray(); } catch (IOException e) { throw new IllegalArgumentException("Non-serializable object", e); } finally { try { if (os != null) os.close(); if (bos != null) bos.close(); } catch (Exception e2) { e2.printStackTrace(); } } return rv; } /**還原序列化 * @param bytes * @return */ public static Object unserialize(byte[] bytes) { Object rv = null; ByteArrayInputStream bis = null; ObjectInputStream is = null; try { if (bytes != null) { bis = new ByteArrayInputStream(bytes); is = new ObjectInputStream(bis); rv = is.readObject(); is.close(); bis.close(); } } catch (Exception e) { e.printStackTrace(); } finally { try { if (is != null) is.close(); if (bis != null) bis.close(); } catch (Exception e2) { e2.printStackTrace(); } } return rv; }}
另外建立一個redis的包,建立RedisService介面類,和對應的實作類別RedisServiceImpl;
代碼分別如下;
/** * @ClassName: RedisDao * @Description: redis介面 * @author shuyu.wang * @date 2017年11月23日 下午3:55:53 * @version V1.0 */public interface RedisService { public void setString(String key, int seconds, String value); public boolean exist(String key); /** * 儲存String * @param key * @param param */ public <T> boolean setString(String key, String param); /** * 擷取Stringֵ * @param key * @return String */ public String getString(String key); /** * 儲存實體類 * @param key * @param bean */ public <T> boolean setBean(String key, Object bean); /** * 擷取實體類 * @param key * @return T */ public <T> T getBean(String key); /** * 儲存 list * @param key * @param list */ public <T> boolean setList(String key, List<T> list); /** * 擷取list * @param key * @return list */ public <T> List<T> getList(String key); /** * 儲存 map * @param key * @param map */ public <T> boolean setMap(String key, Map<String, T> map); /** * 擷取map * @param key * @return Map */ public <T> Map<String, T> getMap(String key); /** * @param key * @return */ public boolean del(String key); /** * @param key * @param num * @return */ public <T> boolean setInteger(String key, Integer num); /** * @param key * @return */ public Integer getSetInteger(String key, Integer num); /** * @param key * @return */ public Integer getInteger(String key); /** * 非序列化儲存 * @param key * @param map * @return */ public <T> boolean setHash(String key, Map<String, String> map); /**擷取key中所有的map的key值 * @param key * @return */ public Map<String, String> getAllHash(String key); /**擷取key中的Map中的key=fields 的value集合 * @param key * @param fields * @return */ public List<String> getHashm(String key, String... fields); /** * @Title: login * @Description: TODO * @param userId * @param second * @return String 返回token * @throws */ public String login(String userId, int second); public Boolean validate(String token); public void logout(String token); public String getUserId(String token);}
/** * @ClassName: RedisDaoImpl * @Description: TODO * @author shuyu.wang * @date 2017年10月19日 下午2:54:39 * @version V1.0 */@Servicepublic class RedisServiceImpl implements RedisService { private static final String VIRTUAL_COURSE_PREX = "lc_vc_"; @Autowired private RedisUtil redisUtil; private static final String RETURN_OK="OK"; /** * * @param key * @return */ public String buildKey(String key) { return VIRTUAL_COURSE_PREX + key; } /* * (non-Javadoc) * * @see com.shuyu.cache.RedisDao#setString(java.lang.String, int, * java.lang.String) */ @Override public void setString(String key, int seconds, String value) { Jedis jedis = redisUtil.getJedis(); jedis.setex(buildKey(key), seconds, value); } /* * (non-Javadoc) * * @see com.shuyu.cache.RedisDao#exist(java.lang.String) */ @Override public boolean exist(String key) { Jedis jedis = redisUtil.getJedis(); String bKey = buildKey(key); if (jedis == null || !jedis.exists(bKey)) { return false; } return true; } /** * * @param key * @param param */ @Override public <T> boolean setString(String key, String param) { Jedis jedis = redisUtil.getJedis(); String bKey = buildKey(key); String set = null; System.out.println("jedis=============="+jedis); set = jedis.set(bKey.getBytes(), SerializeUtil.serialize(param)); if (!set.isEmpty() && (RETURN_OK).equals(set)) { return true; } else { return false; } } /** * ��ȡStringֵ * * @param key * @return String */ @Override public String getString(String key) { Jedis jedis = redisUtil.getJedis(); String bKey = buildKey(key); String retru = null; if (jedis == null || !jedis.exists(bKey)) { return null; } byte[] in = jedis.get(bKey.getBytes()); retru = SerializeUtil.unserialize(in).toString(); return retru; } /** * * @param key * @param bean */ @Override public <T> boolean setBean(String key, Object bean) { String bKey = buildKey(key); Jedis jedis = redisUtil.getJedis(); String set = null; set = jedis.set(bKey.getBytes(), SerializeUtil.serialize(bean)); if (!set.isEmpty() && (RETURN_OK).equals(set)) { return true; } else { return false; } } /** * * @param key * @return T */ @SuppressWarnings("unchecked") @Override public <T> T getBean(String key) { Jedis jedis = redisUtil.getJedis(); String bKey = buildKey(key); T bean = null; if (jedis == null || !jedis.exists(bKey.getBytes())) { return null; } byte[] in = jedis.get(bKey.getBytes()); bean = (T) SerializeUtil.unserialize(in); return bean; } /** * @param key * @param list */ @Override public <T> boolean setList(String key, List<T> list) { Jedis jedis = redisUtil.getJedis(); String bKey = buildKey(key); String set = null; set = jedis.set(bKey.getBytes(), SerializeUtil.serialize(list)); if (!set.isEmpty() && (RETURN_OK).equals(set)) { return true; } else { return false; } } /** * * @param key * @return list */ @SuppressWarnings("unchecked") @Override public <T> List<T> getList(String key) { Jedis jedis = redisUtil.getJedis(); String bKey = buildKey(key); List<T> list = null; if (jedis == null || !jedis.exists(bKey.getBytes())) { return null; } byte[] in = jedis.get(bKey.getBytes()); list = (List<T>) SerializeUtil.unserialize(in); return list; } /** * * @param <T> * @param key */ @Override public <T> boolean setMap(String key, Map<String, T> map) { String bKey = buildKey(key); Jedis jedis = redisUtil.getJedis(); String set = null; set = jedis.set(bKey.getBytes(), SerializeUtil.serialize(map)); if (!set.isEmpty() && (RETURN_OK).equals(set)) { return true; } else { return false; } } /** * * @param key * @return Map */ @Override @SuppressWarnings("unchecked") public <T> Map<String, T> getMap(String key) { String bKey = buildKey(key); Jedis jedis = redisUtil.getJedis(); Map<String, T> map = null; if (jedis == null || !jedis.exists(bKey.getBytes())) { return null; } byte[] in = jedis.get(bKey.getBytes()); map = (Map<String, T>) SerializeUtil.unserialize(in); return map; } @Override public boolean del(String key) { String bKey = buildKey(key); Jedis jedis = redisUtil.getJedis(); Long del = (long) 0; if (jedis == null || !jedis.exists(bKey.getBytes())) { return false; } del = jedis.del(bKey.getBytes()); if (del > 0) { return true; } return false; } @Override public <T> boolean setInteger(String key, Integer num) { Jedis jedis = redisUtil.getJedis(); String bKey = buildKey(key); String set = null; set = jedis.set(bKey, String.valueOf(num)); if (!set.isEmpty() && (RETURN_OK).equals(set)) { return true; } else { return false; } } @Override public Integer getSetInteger(String key, Integer num) { String bKey = buildKey(key); Jedis jedis = redisUtil.getJedis(); String set = null; set = jedis.getSet(bKey, String.valueOf(num)); return Integer.valueOf(set); } @Override public Integer getInteger(String key) { String bKey = buildKey(key); Jedis jedis = redisUtil.getJedis(); String set = null; if (jedis == null || !jedis.exists(bKey)) { return null; } set = jedis.get(bKey); return Integer.valueOf(set); } @Override public <T> boolean setHash(String key, Map<String, String> map) { String bKey = buildKey(key); Jedis jedis = redisUtil.getJedis(); String hmset = null; hmset = jedis.hmset(bKey, map); if (!hmset.isEmpty() && (RETURN_OK).equals(hmset)) { return true; } else { return false; } } @Override public Map<String, String> getAllHash(String key) { String bKey = buildKey(key); Jedis jedis = redisUtil.getJedis(); Map<String, String> map = null; if (jedis == null || !jedis.exists(bKey)) { return null; } map = jedis.hgetAll(bKey); return map; } @Override public List<String> getHashm(String key, String... fields) { String bKey = buildKey(key); Jedis jedis = redisUtil.getJedis(); List<String> list = null; if (jedis == null || !jedis.exists(bKey)) { return null; } list = jedis.hmget(bKey, fields); return list; } /* * (non-Javadoc) * * @see com.hc.redis.dao.RedisDao#login(java.lang.String, int) */ @Override public String login(String userId, int second) { Jedis jedis = redisUtil.getJedis(); String token = buildKey(userId); if (jedis == null || !jedis.exists(token)) { // token生產規則自訂ֵ jedis.setex(token, second, userId); } else { jedis.expire(token, second); } return token; } @Override public Boolean validate(String token) { Jedis jedis = redisUtil.getJedis();