複習電商筆記-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值的大小寫是區分的。