1. 程式人生 > >Redis數據類型之散列類型hash

Redis數據類型之散列類型hash

exists 順序 hset 判斷 設置 其他 get div enc

redis中用的最多的就是hashstring類型。

問題

假設有User對象以JSON序列化的形式存儲到redis中,

User對象有idusernamepasswordagename等屬性,

存儲的過程如下:

保存、更新:

User對象->json(string)->redis

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

Redis數據類型之散列類型hash

散列類型存儲了字段field)和字段值的映射,但字段值只能是字符串,不支持其他類型,

也就是說,散列類型不能嵌套其他的數據類型。

一個散列類型可以包含最多232-1個字段。

技術分享

hset / hget

賦值和取值

HSET命令不區分插入和更新操作,

當執行插入操作時HSET命令返回1,當執行更新操作時返回0

HSET key field value
HGET key field
HMSET key field value [field value…]
HMGET key field value [field value…]
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 #一次取key的所有字段及字段值 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>

hincrby(自增)

HINCRBYINCR區別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

HMSETHMGET設置和獲取對象屬性

註意:上面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>

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示例

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

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>

Redis數據類型之散列類型hash