1. 程式人生 > 資訊 >換季斷碼清倉:凡客帆布鞋 39 元好價(官網 119 元)

換季斷碼清倉:凡客帆布鞋 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想象成一個以位為單位的陣列, 陣列的每個單元只能儲存01, 陣列的下標在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型別的支援。GEOGeographic,地理資訊的縮寫。該型別,就是元素的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;
    }
}