REmote DIctionary Server(Redis) 是一個由 Salvatore Sanfilippo 寫的 key-value 存儲系統,是跨平台的非關系型數據庫。
Redis 是一個開源的使用 ANSI C 語言編寫、遵守 BSD 協議、支持網絡、可基於內存、分布式、可選持久性的鍵值對(Key-Value)存儲數據庫,並提供多種語言的 API。
Redis 通常被稱為數據結構服務器,因為值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等類型。
首先要明白redis是一個數據庫,redis是一個內存數據庫,所有數據基本上都存在於內存當中,會定時以追加或者快照的方式刷新到硬盤中。
由於redis是一個內存數據庫,所以讀取寫入的速度是非常快的,所以經常被用來做數據,頁面等的緩存。
Redis最為常用的數據類型主要有以下:
String
Hash
List
Set
Sorted set
pub/sub
Transactions
啟動redis:
依賴:
<!--集成redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>1.4.1.RELEASE</version> </dependency>
yml:
spring: redis: # Redis服務器地址 host: 127.0.0.1 # Redis服務器連接端口 port: 6379 # Redis服務器連接密碼(默認為空) password: # Redis數據庫索引(默認為0) database: 0 timeout: 50000 jedis: pool: # 連接池最大連接數(使用負值表示沒有限制) max-active: 8 # 連接池最大阻塞等待時間(使用負值表示沒有限制) max-wait: -1 # 連接池中的最大空閑連接 max-idle: 500 # 連接池中的最小空閑連接 min-idle: 0 lettuce: shutdown-timeout: 0
RedisUtil類代碼:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.*; import org.springframework.stereotype.Component; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import java.io.Serializable; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; @Component public class RedisUtil { @Value("${spring.redis.host}") private String host; @Value("${spring.redis.password}") private String password; @Value("${spring.redis.timeout}") private int timeout; @Value("${spring.redis.port}") private int port; @Value("${spring.redis.database}") private int database; private JedisPool pool = null; @Value("${spring.redis.jedis.pool.max-active}") private int maxActive; @Value("${spring.redis.jedis.pool.max-wait}") private int maxWait; @Value("${spring.redis.jedis.pool.max-idle}") private int maxIdle; @Value("${spring.redis.jedis.pool.min-idle}") private int minIdle; /** * 開啟redis * * @param * @param * @return */ public Jedis getJedis() { JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(maxActive);//大連接數 config.setMaxIdle(maxIdle);//大空閑實例數 config.setMaxWaitMillis(maxWait);//等連接池給連接的大時間,毫秒 config.setTestOnBorrow(true);//個實例的時,是否提前vaildate操作 System.out.println("--------------" + host); pool = new JedisPool(config, host, port, timeout); if (pool != null) { return pool.getResource(); } else { return null; } } /** * 關閉redis * * @param * @param * @return */ public void close(final Jedis redis) { if (redis != null) { redis.close(); } } @Autowired private RedisTemplate redisTemplate; /** * 寫入緩存 * * @param key * @param value * @return */ public boolean set(final String key, Object value) { boolean result = false; try { ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); operations.set(key, value); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } /** * 寫入緩存設置時效時間 * * @param key * @param value * @return */ public boolean set(final String key, Object value, Long expireTime, TimeUnit timeUnit) { boolean result = false; try { ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); operations.set(key, value); redisTemplate.expire(key, expireTime, timeUnit); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } /** * 批量刪除對應的value * * @param keys */ public void remove(final String... keys) { for (String key : keys) { remove(key); } } /** * 批量刪除key * * @param pattern */ public void removePattern(final String pattern) { Set<Serializable> keys = redisTemplate.keys(pattern); if (keys.size() > 0) { redisTemplate.delete(keys); } } /** * 刪除對應的value * * @param key */ public void remove(final String key) { if (exists(key)) { redisTemplate.delete(key); } } /** * 判斷緩存中是否有對應的value * * @param key * @return */ public boolean exists(final String key) { return redisTemplate.hasKey(key); } /** * 讀取緩存 * * @param key * @return */ public Object get(final String key) { Object result = null; ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); result = operations.get(key); return result; } /** * 哈希 添加 * * @param key * @param hashKey * @param value */ public void hmSet(String key, Object hashKey, Object value) { HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); hash.put(key, hashKey, value); } /** * 哈希獲取數據 * * @param key * @param hashKey * @return */ public Object hmGet(String key, Object hashKey) { HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); return hash.get(key, hashKey); } /** * 列表添加 * * @param k * @param v */ public void lPush(String k, Object v) { ListOperations<String, Object> list = redisTemplate.opsForList(); list.rightPush(k, v); } /** * 列表獲取 * * @param k * @param l * @param l1 * @return */ public List<Object> lRange(String k, long l, long l1) { ListOperations<String, Object> list = redisTemplate.opsForList(); return list.range(k, l, l1); } /** * 集合添加 * * @param key * @param value */ public void add(String key, Object value) { SetOperations<String, Object> set = redisTemplate.opsForSet(); set.add(key, value); } /** * 集合獲取 * * @param key * @return */ public Set<Object> setMembers(String key) { SetOperations<String, Object> set = redisTemplate.opsForSet(); return set.members(key); } /** * 有序集合添加 * * @param key * @param value * @param scoure */ public void zAdd(String key, Object value, double scoure) { ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); zset.add(key, value, scoure); } /** * 有序集合獲取 * * @param key * @param scoure * @param scoure1 * @return */ public Set<Object> rangeByScore(String key, double scoure, double scoure1) { ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); return zset.rangeByScore(key, scoure, scoure1); } /** * 存取List集合 * * @param key List<?> list * @return */ public void setList(String key, List<?> list) { Jedis jedis = getJedis(); try { if (list == null || list.size() == 0) { jedis.set(key.getBytes(), "".getBytes()); } else {//如果list為空,則設置一個空 jedis.set(key.getBytes(), SerializeUtilList.serializeList(list)); } } catch (Exception e) { e.printStackTrace(); } finally { jedis.close(); } } /** * 獲取List集合 * * @param key * @return */ public List<?> getList(String key) { Jedis jedis = getJedis(); if (jedis == null || !jedis.exists(key)) { return null; } byte[] data = jedis.get(key.getBytes()); jedis.close(); return SerializeUtilList.unserializeList(data); } }
序列化代碼:
import java.io.*; import java.util.ArrayList; import java.util.List; public class SerializeUtilList { /** * 序列化 list 集合 * * @param list * @return */ public static byte[] serializeList(List<?> list) { if (list == null || list.size() == 0) { return null; } ObjectOutputStream oos = null; ByteArrayOutputStream baos = null; byte[] bytes = null; try { baos = new ByteArrayOutputStream(); oos = new ObjectOutputStream(baos); for (Object obj : list) { oos.writeObject(obj); } bytes = baos.toByteArray(); } catch (Exception e) { e.printStackTrace(); } finally { close(oos); close(baos); } return bytes; } /** * 反序列化 list 集合 * * @param * @return */ public static List<?> unserializeList(byte[] bytes) { if (bytes == null) { return null; } List<Object> list = new ArrayList<Object>(); ByteArrayInputStream bais = null; ObjectInputStream ois = null; try { // 反序列化 bais = new ByteArrayInputStream(bytes); ois = new ObjectInputStream(bais); while (bais.available() > 0) { Object obj = (Object) ois.readObject(); if (obj == null) { break; } list.add(obj); } } catch (Exception e) { e.printStackTrace(); } finally { close(bais); close(ois); } return list; } public static void close(Closeable closeable) { if (closeable != null) { try { closeable.close(); } catch (Exception e) { e.printStackTrace(); } } } }
RedisController測試代碼:
@RestController @RequestMapping("redis") public class RedisController { @Autowired public RedisUtil rs; // redis查詢接口 @RequestMapping("/getRedisData") @ResponseBody public List getRedis(){ List listReis = rs.getList("wanli"); if(listReis == null ){ List list = new ArrayList(); list.add(1); list.add(2); rs.setList("wanli",list); } return listReis; } }