Redis數據類型之散列類型hash
阿新 • • 發佈:2017-10-28
exists 順序 hset 判斷 設置 其他 get div enc
在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命令不區分插入和更新操作,
當執行插入操作時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 user1) "username" 2) "chen" 3) "age" 4) "30" 127.0.0.1:6379>
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設置和獲取對象屬性
註意:上面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