換季斷碼清倉:凡客帆布鞋 39 元好價(官網 119 元)
一、介紹
Redis誕生於2009年全稱是Remote Dictionary Server,遠端詞典伺服器,是一個基於記憶體 的鍵值型NoSQL資料庫。
特徵:
●鍵值(key-value)型, value支援 多種不同資料結構,功能豐富
●單執行緒, 每個命令具備原子性
●低延遲,速度快(基於記憶體、10多路複用、良好的編碼)。
●支援資料持久化
●支援主從叢集、分片叢集
●支援多語言客戶端
二、常用資料型別及用法
1. String型別
String分為3種格式:字串、int、float
String的常見命令有:
●SET: 新增或者修改已經存在的一個String型別的鍵值對
●GET: 根據key獲取String型別的value
●MSET: 批量新增多個String型別的鍵值對
●MGET: 根據多個key獲取多個String型別的value
●INCR: 讓一個整型的key自增1
●INCRBY: 讓一個整型的key自增並指定步長,例如: incrby num 2讓num值自增2
●INCRBYFLOAT: 讓一個浮點型別的數字自增並指定步長
●SETNX: 新增一個String型別的鍵值對,前提是這個key不存在,否則不執行
●SETEX: 新增一個String型別的鍵值對,並且指定有效期
為了避免不同表的id值相同,為了區別開,key的層級格式可以定義為以下:
[專案名]:[業務名]:[型別]:[id]
2. Hash型別
Hash型別,也叫雜湊,其value是一個無序字典, 類似於Java中的HashMap結構。
Hash的常見命令有:
●HSET key field value: 新增或者修改hash型別key的field的值
●HGET key field: 獲取一個hash型別key的field的值
●HMSET: 批量新增多個hash型別key的field的值
●HMGET: 批量獲取多個hash型別key的field的值
●HGETALL: 獲取一個hash型別的key中的所有的field和value
●HKEYS: 獲取一個hash型別的key中的所有的field
●HVALS: 獲取一個hash型別的key中的所有的value
●HINCRBY: 讓一個hash型別key的欄位值自增並指定步長
●HSETNX: 新增一個hash型別的key的field值,前提是這個field不存在,否則不執行
3. List型別
Redis中的List型別與Java中的LinkedList類似,可以看做是一個雙向連結串列結構。既可以支援正向檢索和也可以支援反向檢索。
特徵也與LinkedList類似:
●有序
●元素可以重複
●插入和刪除快
●查詢速度一般
List的常見命令有:
●LPUSH key element... :向列表左側插入一個或多個元素
●LPOP key:移除並返回列表左側的第一個元素,沒有則返回nil
●RPUSH key element... :向列表右側插入一個或多個元素
●RPOP key:移除並返回列表右側的第一個元素
●LRANGE key star end:返回一 段角標範圍內的所有元素
●BLPOP和BRPOP:與LPOP和RPOP類似,只不過在沒有元素時等待指定時間,而不是直接返回nil
4. Set型別
Redis的Set結構與Java中的HashSet類似,可以看做是一個value為null的HashMap。因為也是一個hash表,因此具備與HashSet類似的特徵:
●無序
●元素不可重複
●查詢快
●支援交集、 並集、差集等功能
Set的常見命令有:
●SADD key member ... :向set中新增一一個或多個元素
●SREM key member ... :移除set中的指定元素
●SCARD key:返回set中元素的個數
●SISMEMBER key member:判斷一個元素是否存在於set中
●SMEMBERS: 獲取set中的所有元素
●SINTER key1 key2 ... :求key1 與key2的交集
●SDIFF key1 key2 ... :求key1與key2的差集
●SUNION key1 key2 ..:求key1和key2的並集
5. ZSet型別
Redis的ZSet是一個可排序的set集合,與Java中 的TreeSet有些類似,但底層資料結構卻差別很大。ZSet中的每一個元素都帶有一個score屬性,可以基於score屬性對元素排序,底層的實現是一個跳錶(SkipList) 加hash表。
ZSet具備下列特性:
●可排序
●元素不重複
●查詢速度快
因為ZSet的可排序特性,經常被用來實現排行榜這樣的功能。
ZSet的常見命令有:
●ZADD key score member:新增一個或多個元素到Zset,如果已經存在則更新其score值
●ZREM key member:刪除Zset中的一個指定元素
●ZSCORE key member :獲取Zset中的指定元素的score值
●ZRANK key member:獲取Zset中的指定元素的排名
●ZCARD key:獲取Zset中的元素個數
●ZCOUNT key min max:統計score值在給定範圍內的所有元素的個數
●ZINCRBY key increment member:讓Zset中的指定元素自增,步長為指定的increment值
●ZRANGE key min max:按照score排序後,獲取指定排名範圍內的元素
●ZRANGEBYSCORE key min max:按照score排序後,獲取指定score範圍內的元素
●ZDIFF、 ZINTER、ZUNION:求差集、交集、並集
6. Bitmaps型別
Redis提供了Bitmaps這個“資料型別”可以實現對位的操作:
(1) Bitmaps本身不是一種資料型別, 實際上它就是字串(key-value) , 但是它可以對字串的位進行操作。
(2) Bitmaps單獨提供了一套命令, 所以在Redis中使用Bitmaps和使用字串的方法不太相同。 可以把Bitmaps想象成一個以位為單位的陣列, 陣列的每個單元只能儲存0和1, 陣列的下標在Bitmaps中叫做偏移量
當資料量特別大的時候,使用Bitmaps能夠節省很多的記憶體空間,尤其是隨著時間推移,節省的記憶體是非常可觀的。
但是當資料量並不是非常大的時候,使用Bitmaps就不太合適了,因為基本大部分位都是0。
7. HyperLogLog型別
Redis HyperLogLog 是用來做基數統計的演算法,HyperLogLog 的優點是,在輸入元素的數量或者體積非常非常大時,計算基數所需的空間總是固定的、並且是很小的。
(1)pfadd:pfadd <key>< element> [element ...] 新增指定元素到 HyperLogLog 中
(2)pfcount: pfcount<key> [key ...] 計算HLL的近似基數,可以計算多個HLL,比如用HLL儲存每天的UV
可檢視基數的個數
(3)pfmerge:pfmerge<destkey><sourcekey> [sourcekey ...] 將一個或多個HLL合併後的結果儲存在另一個HLL中。
示例將kll資料加入program中
8. Geospatial型別
Redis 3.2 中增加了對GEO型別的支援。GEO,Geographic,地理資訊的縮寫。該型別,就是元素的2維座標,在地圖上就是經緯度。redis基於該型別,提供了經緯度設定,查詢,範圍查詢,距離查詢,經緯度Hash等常見操作。
(1)geoadd:geoadd<key>< longitude><latitude><member> [longitude latitude member...] 新增地理位置(經度,緯度,名稱)
也可以儲存多個值
(2)geopos:geopos <key><member> [member...] 獲得指定地區的座標值
geopos <key><member> [member...] 獲得指定地區的座標值
(3)geodist:geodist<key><member1><member2> [m|km|ft|mi ] 根據設定的經緯度,獲取兩個位置之間的直線距離
(4)georadius:georadius<key>< longitude><latitude>radius m|km|ft|mi 以給定的經緯度為中心,找出某一半徑內的元素
三、redis訂閱和釋出
Redis釋出訂閱(pub/sub) 是一種訊息通訊模式 :傳送者(pub) 傳送訊息,訂閱者(sub)接收訊息。。
//客戶端1進行訂閱 subscribe channel1 //客戶端2進行釋出 publish channel1 hello
可見客戶端1訂閱後能夠監視 channel1通道, 當客戶端2向channel1通道傳送資料時,客戶端能夠及時接收
四、Java中Redis操作
1.普通maven專案使用Jedis
(1)引入依賴
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.2.0</version> </dependency>
(2)測試程式碼
//建立Jedis物件 Jedis jedis = new Jedis("121.41.52.53",6379); //測試ping String ping = jedis.ping(); System.out.println(ping); //PONG
//獲取所有keys值
Set<String> keys = jedis.keys("*");
for (String key : keys) {
System.out.println(key);
}
2. springboot整合redis
(1)引入依賴
<!-- redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- spring2.X整合redis所需common-pool2--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.6.0</version> </dependency>
(2)properties檔案配置
#Redis伺服器地址
spring.redis.host=192.168.140.136
#Redis伺服器連線埠
spring.redis.port=6379
#Redis資料庫索引(預設為0)
spring.redis.database= 0
#連線超時時間(毫秒)
spring.redis.timeout=1800000
#連線池最大連線數(使用負值表示沒有限制)
spring.redis.lettuce.pool.max-active=20
#最大阻塞等待時間(負數表示沒限制)
spring.redis.lettuce.pool.max-wait=-1
#連線池中的最大空閒連線
spring.redis.lettuce.pool.max-idle=5
#連線池中的最小空閒連線
spring.redis.lettuce.pool.min-idle=0
(3)配置類
@EnableCaching @Configuration public class configuration extends CachingConfigurerSupport { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); RedisSerializer<String> redisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); template.setConnectionFactory(factory); //key序列化方式 template.setKeySerializer(redisSerializer); //value序列化 template.setValueSerializer(jackson2JsonRedisSerializer); //value hashmap序列化 template.setHashValueSerializer(jackson2JsonRedisSerializer); return template; } @Bean public CacheManager cacheManager(RedisConnectionFactory factory) { RedisSerializer<String> redisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); //解決查詢快取轉換異常的問題 ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); // 配置序列化(解決亂碼的問題),過期時間600秒 RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofSeconds(600)) .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) .disableCachingNullValues(); RedisCacheManager cacheManager = RedisCacheManager.builder(factory) .cacheDefaults(config) .build(); return cacheManager; } }
(4)測試類
@RestController @RequestMapping("/redis") public class Controller { @Resource private RedisTemplate redisTemplate; @GetMapping public String m1(){ redisTemplate.opsForValue().set("name","ycl"); String name = (String) redisTemplate.opsForValue().get("name"); return name; } }