1. 程式人生 > >複習電商筆記-26-redis操作命令

複習電商筆記-26-redis操作命令

 

Redis生存時間

expire

Redis在實際使用過程中更多的用作快取,然而快取的資料一般都是需要設定生存時間的,即到期後資料銷燬。

語法:EXPIRE key seconds

127.0.0.1:6379> flushall

OK

127.0.0.1:6379> set bomb tnt

OK

127.0.0.1:6379> expire bomb 10

(integer) 1

127.0.0.1:6379> ttl bomb

(integer) 5

127.0.0.1:6379> ttl bomb

(integer) 3

127.0.0.1:6379> ttl bomb

(integer) 3

127.0.0.1:6379> ttl bomb

(integer) 2

127.0.0.1:6379> ttl bomb

(integer) 1

127.0.0.1:6379> ttl bomb

(integer) -2

127.0.0.1:6379> ttl bomb

(integer) -2

127.0.0.1:6379>

TTL檢視key的剩餘時間,當返回值為-2時,表示鍵被刪除。

當 key 不存在時,返回 -2 。

當 key 存在但沒有設定剩餘生存時間時,返回 -1 。

否則,以毫秒為單位,返回 key 的剩餘生存時間。

注意:在 Redis 2.8 以前,當 key 不存在,或者 key 沒有設定剩餘生存時間時,命令都返回 -1 。

 

 

persist

語法:PERSIST key

127.0.0.1:6379> set bomb tnt

OK

127.0.0.1:6379> expire bomb 60

(integer) 1

127.0.0.1:6379> ttl bomb

(integer) 49

127.0.0.1:6379> persist bomb

(integer) 1

127.0.0.1:6379> ttl bomb

(integer) -1

127.0.0.1:6379>

設定新的資料時需要重新設定該key的生存時間。重新設定值也會清除生存時間。

 

 

pexpire

語法:PEXPIRE key milliseconds

127.0.0.1:6379> set bomb tnt

OK

127.0.0.1:6379> pexpire bomb 10000

(integer) 1

127.0.0.1:6379> ttl bomb

(integer) 6

127.0.0.1:6379> ttl bomb

(integer) 3

127.0.0.1:6379> ttl bomb

(integer) -2

127.0.0.1:6379>

設定生存時間為毫秒,可以做到更精確的控制。

 

Redis高階中的hash結構

在redis中用的最多的就是hash和string型別。

 

 

問題

假設有User物件以JSON序列化的形式儲存到redis中,User物件有id、username、password、age、name等屬性,儲存的過程如下:

儲存、更新:

User物件->json(string)->redis

如果在業務上只是更新age屬性,其他的屬性並不做更新應該怎麼做呢?

Redis資料型別之雜湊型別hash

雜湊型別儲存了欄位(field)和欄位值的對映,但欄位值只能是字串,不支援其他型別,也就是說,雜湊型別不能巢狀其他的資料型別。一個雜湊型別可以包含最多232-1個欄位。

hset/hget

 

 

HSET和HGET賦值和取值

HSET key field value

HGET key field

HMSET key field value [field value…]

HMGET key field [field ]

HGETALL key


127.0.0.1:6379> hset user username chenchen

(integer) 1

127.0.0.1:6379> hget user username

"chenchen"

127.0.0.1:6379> hset user username chen

(integer) 0

127.0.0.1:6379> keys user

1) "user"

127.0.0.1:6379> hgetall user

1) "username"

2) "chen"

127.0.0.1:6379>

127.0.0.1:6379> hset user age 30

(integer) 1

127.0.0.1:6379> hgetall user

1) "username"

2) "chen"

3) "age"

4) "30"

127.0.0.1:6379>

HSET命令不區分插入和更新操作,當執行插入操作時HSET命令返回1,當執行更新操作時返回0。

 

 

hincrby

HINCRBY和INCR區別在於HINCRBY如果沒有KEY 則自動建立KEY然後賦值而INCR只能新增不能判斷。

127.0.0.1:6379> hdecrby article total 1

127.0.0.1:6379> hincrby article total -1      #沒有hdecrby自減命令

(integer) 1

 

 

hmset/hmget

HMSET和HMGET設定和獲取物件屬性

127.0.0.1:6379> hmset person username tony age 18

OK

127.0.0.1:6379> hmget person age username

1) "18"

2) "tony"

127.0.0.1:6379> hgetall person

1) "username"

2) "tony"

3) "age"

4) "18"

127.0.0.1:6379>

注意:上面HMGET欄位順序可以自行定義

 

 

hexists

屬性是否存在

127.0.0.1:6379> hexists killer

(error) ERR wrong number of arguments for 'hexists' command

127.0.0.1:6379> hexists killer a

(integer) 0

127.0.0.1:6379> hexists user username

(integer) 1

127.0.0.1:6379> hexists person age

(integer) 1

127.0.0.1:6379>

 

 

hdel

刪除屬性

127.0.0.1:6379> hdel user age

(integer) 1

127.0.0.1:6379> hgetall user

1) "username"

2) "chen"

127.0.0.1:6379> hgetall person

1) "username"

2) "tony"

3) "age"

4) "18"

127.0.0.1:6379>

 

 

hkeys/hvals

只獲取欄位名HKEYS或欄位值HVALS

127.0.0.1:6379> hkeys person

1) "username"

2) "age"

127.0.0.1:6379> hvals person

1) "tony"

2) "18"

 

 

Hlen  

元素個數

127.0.0.1:6379> hlen user

(integer) 1

127.0.0.1:6379> hlen person

(integer) 2

127.0.0.1:6379>

 

 

Jredis示例

package cn.redis;



import java.util.Map;



import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;

import redis.clients.jedis.JedisPoolConfig;



public class JedisPoolDemoCMD {



    public static void main(String[] args) {

        // 構建連線池配置資訊

        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();

        // 設定最大連線數

        jedisPoolConfig.setMaxTotal(50);



        // 構建連線池

        JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379);



        // 從連線池中獲取連線

        Jedis jedis = jedisPool.getResource();



        jedis.hset("USER_1", "username", "zhangsan");

        jedis.hset("USER_1", "password", "123456");

       

        Map<String, String> val = jedis.hgetAll("USER_1");

        for (Map.Entry<String, String> entry : val.entrySet()) {

            System.out.println(entry.getKey() + "  " + entry.getValue());

        }



        // 將連線還回到連線池中

        jedisPool.returnResource(jedis);



        // 釋放連線池

        jedisPool.close();



    }



}

Redis中測試:

127.0.0.1:6379> hgetall USER_1

1) "username"

2) "zhangsan"

3) "password"

4) "123456"

127.0.0.1:6379> hgetall user_1

(empty list or set)

127.0.0.1:6379>

注意:key值的大小寫是區分的。