1. 程式人生 > >Redis 3.Redis資料型別

Redis 3.Redis資料型別

Redis

@Author:hanguixian
@Email:[email protected]

三 Redis資料型別

1 Redis的五大資料型別

1.1 string(字串)

  • string是redis最基本的型別,你可以理解成與Memcached一模一樣的型別,一個key對應一個value。
  • string型別是二進位制安全的。意思是redis的string可以包含任何資料。比如jpg圖片或者序列化的物件 。
  • string型別是Redis最基本的資料型別,一個redis中字串value最多可以是512M

1.2 hash(雜湊,類似java裡的Map)

  • Redis hash 是一個鍵值對集合。
  • Redis hash是一個string型別的field和value的對映表,hash特別適合用於儲存物件。
  • 類似Java裡面的Map<String,Object>

1.3 List(列表)

  • Redis 列表是簡單的字串列表,按照插入順序排序。你可以新增一個元素導列表的頭部(左邊)或者尾部(右邊)。
  • 它的底層實際是個連結串列

1.4 Set(集合)

  • Redis的Set是string型別的無序集合。它是通過HashTable實現實現的

1.5 zset(sorted set:有序集合)

  • Redis的zset 和 set 一樣也是string型別元素的集合,且不允許重複的成員。
  • 不同的是每個元素都會關聯一個double型別的分數。
  • redis正是通過分數來為集合中的成員進行從小到大的排序。zset的成員是唯一的,但分數(score)卻可以重複。

2 常見資料型別操作命令

官網:http://redisdoc.com/

redis命令

3 Redis 鍵(key)

3.1 常用命令

  • keys *
  • exists key的名字,判斷某個key是否存在
  • move key db —>當前庫就沒有了,被移除了
  • expire key 秒鐘:為給定的key設定過期時間
  • ttl key 檢視還有多少秒過期,-1表示永不過期,-2表示已過期
  • type key 檢視你的key是什麼型別
  • 詳情參考:http://redisdoc.com/key/index.html

3.2 示例

[[email protected] bin]# redis-server /hanguixian/myredis/redis.conf 
14897:C 27 Nov 2018 17:32:46.353 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
14897:C 27 Nov 2018 17:32:46.353 # Redis version=5.0.0, bits=64, commit=00000000, modified=0, pid=14897, just started
14897:C 27 Nov 2018 17:32:46.353 # Configuration loaded
[[email protected] bin]# redis-cli 
127.0.0.1:6379> FLUSHDB 
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> KEYS *
1) "k1"
127.0.0.1:6379> EXISTS k1
(integer) 1
127.0.0.1:6379> EXISTS k2
(integer) 0
127.0.0.1:6379> move k1 2
(integer) 1
127.0.0.1:6379> KEYS *
(empty list or set)
127.0.0.1:6379> SELECT 2
OK
127.0.0.1:6379[2]> KEYS *
1) "k1"
127.0.0.1:6379[2]> SELECT 0
OK
127.0.0.1:6379> KEYS *
(empty list or set)
127.0.0.1:6379> set k02 v02
OK
127.0.0.1:6379> KEYS *
1) "k02"
127.0.0.1:6379> EXPIRE k02 10
(integer) 1
127.0.0.1:6379> ttl k02
(integer) 2
127.0.0.1:6379> ttl k02
(integer) 0
127.0.0.1:6379> EXPIRE k02 10
(integer) 0
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set k03 v03 
OK
127.0.0.1:6379> type k03
string
127.0.0.1:6379> type v03
none
127.0.0.1:6379> type set01
set
127.0.0.1:6379> ttl set01
(integer) -1

4 Redis字串(String)

  • 單值單value

4.1 常用命令

  • set/get/del/append/strlen
    • set:將字串值 value 關聯到 key
    • get:返回 key 所關聯的字串值。
    • del:刪除給定的一個或多個 key 。不存在的 key 會被忽略。
    • append:如果 key 已經存在並且是一個字串, APPEND 命令將 value 追加到 key 原來的值的末尾。 如果 key 不存在, APPEND 就簡單地將給定 key 設為 value ,就像執行 SET key value 一樣。
    • strlen:返回 key 所儲存的字串值的長度。
  • Incr/decr/incrby/decrby,一定要是數字才能進行加減
    • Incr:將 key 中儲存的數字值增一。
    • decr:將 key 中儲存的數字值減一。
    • incrby:將 key 所儲存的值加上增量 increment
    • decrby:將 key 所儲存的值減去減量 decrement
  • getrange/setrange
    • getrange:返回 key 中字串值的子字串,字串的擷取範圍由 startend 兩個偏移量決定(包括 startend 在內)。
    • setrange:用 value 引數覆寫(overwrite)給定 key 所儲存的字串值,從偏移量 offset 開始。
  • setex(set with expire)鍵秒值/setnx(set if not exist)
    • setex:將值 value 關聯到 key ,並將 key 的生存時間設為 seconds (以秒為單位)。
    • setnx:將 key 的值設為 value ,當且僅當 key 不存在。
  • mset/mget/msetnx
    • mset:同時設定一個或多個 key-value 對。
    • mget:返回所有(一個或多個)給定 key 的值。
    • msetnx:同時設定一個或多個 key-value 對,當且僅當所有給定 key 都不存在。
  • getset(先get再set)
    • 將給定 key 的值設為 value ,並返回 key 的舊值(old value)。
  • 詳情參考:http://redisdoc.com/string/index.html

4.2 示例

[[email protected] bin]# redis-server /hanguixian/myredis/redis.conf 
15038:C 27 Nov 2018 19:49:09.640 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
15038:C 27 Nov 2018 19:49:09.640 # Redis version=5.0.0, bits=64, commit=00000000, modified=0, pid=15038, just started
15038:C 27 Nov 2018 19:49:09.640 # Configuration loaded
[[email protected] bin]# redis-cli 
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> append k1 aaaaaa
(integer) 8
127.0.0.1:6379> get k1
"v1aaaaaa"
127.0.0.1:6379> STRLEN k1
(integer) 8
127.0.0.1:6379> INCR k1
(error) ERR value is not an integer or out of range
127.0.0.1:6379> set int01 1
OK
127.0.0.1:6379> INCR int01
(integer) 2
127.0.0.1:6379> INCR int01
(integer) 3
127.0.0.1:6379> INCRBY int01 20
(integer) 23
127.0.0.1:6379> getrange k1 1 5 
"1aaaa"
127.0.0.1:6379> SETRANGE k1 1 bbb
(integer) 8
127.0.0.1:6379> get k1
"vbbbaaaa"
127.0.0.1:6379> setex k1 10 555555
OK
127.0.0.1:6379> get k1
"555555"
127.0.0.1:6379> get k1
(nil)
127.0.0.1:6379> mset k2 v2 k3 v3
OK
127.0.0.1:6379> mget k1 k2 k3
1) (nil)
2) "v2"
3) "v3"
127.0.0.1:6379> getset k2 mmmm
"v2"
127.0.0.1:6379> getset k2 uuuu
"mmmm"
127.0.0.1:6379> get k2
"uuuu"

5 Redis列表(List)

  • 單值多value

5.1 常用命令

  • lpush/rpush/lrange
    • lpush:將一個或多個值 value 插入到列表 key 的表頭
    • rpush:將一個或多個值 value 插入到列表 key 的表尾(最右邊)。
    • lrange:返回列表 key 中指定區間內的元素,區間以偏移量 startstop 指定。
  • lpop/rpop
    • lpop:移除並返回列表 key 的頭元素。
    • rpop:移除並返回列表 key 的尾元素。
  • lindex,按照索引下標獲得元素(從上到下)
    • 返回列表 key 中,下標為 index 的元素。
  • llen
    • 返回列表 key 的長度。
  • lrem key 刪N個value
    • 根據引數 count 的值,移除列表中與引數 value 相等的元素。
  • ltrim key 開始index 結束index,擷取指定範圍的值後再賦值給key
    • ltrim:擷取指定索引區間的元素,格式是ltrim list的key 起始索引 結束索引
  • rpoplpush 源列表 目的列表
    • 移除列表的最後一個元素,並將該元素新增到另一個列表並返回
  • lset key index value
    • 將列表 key 下標為 index 的元素的值設定為 value
  • linsert key before/after 值1 值2
    • 在list某個已有值的前後再新增具體值
  • 詳情參考:http://redisdoc.com/list/index.html

5.2 示例

127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> lpush scope a b 1 2
(integer) 4
127.0.0.1:6379> LRANGE scope  0 -1
1) "2"
2) "1"
3) "b"
4) "a"
127.0.0.1:6379> RPOP scope
"a"
127.0.0.1:6379> LRANGE scope  0 -1
1) "2"
2) "1"
3) "b"
127.0.0.1:6379> lindex scope 2
"b"

5.3 效能總結

  • 它是一個字串連結串列,left、right都可以插入新增;
  • 如果鍵不存在,建立新的連結串列;
  • 如果鍵已存在,新增內容;
  • 如果值全移除,對應的鍵也就消失了。
  • 連結串列的操作無論是頭和尾效率都極高,但假如是對中間元素進行操作,效率就很慘淡了。

6 Redis集合(Set)

  • 單值多value

6.1 常用命令

  • sadd/smembers/sismember
    • sadd:將一個或多個 member 元素加入到集合 key 當中,已經存在於集合的 member 元素將被忽略。
    • smembers:返回集合 key 中的所有成員。
    • sismember:判斷 member 元素是否集合 key 的成員。
  • scard,獲取集合裡面的元素個數
  • srem key value 刪除集合中元素
    • 移除集合 key 中的一個或多個 member 元素,不存在的 member 元素會被忽略。
  • srandmember key 某個整數(隨機出幾個數)
    • 從set集合裡面隨機取出2個
    • 如果超過最大數量就全部取出
    • 如果寫的值是負數,比如-3 ,表示需要取出3個,但是可能會有重複值。
  • spop key 隨機出棧
  • smove key1 key2 在key1裡某個值:作用是將key1裡的某個值賦給key2
    • SMOVE source destination member:將 member 元素從 source 集合移動到 destination 集合。
  • 數學集合類
    • 差集:sdiff
      • 返回一個集合的全部成員,該集合是所有給定集合之間的差集。
    • 交集:sinter
      • 返回一個集合的全部成員,該集合是所有給定集合的交集。
    • 並集:sunion
      • 返回一個集合的全部成員,該集合是所有給定集合的並集。
  • 詳情參考:http://redisdoc.com/set/index.html

6.2 示例

127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> sadd cc 1 2 3 n n d 1
(integer) 5
127.0.0.1:6379> SMEMBERS cc
1) "2"
2) "n"
3) "3"
4) "d"
5) "1"
127.0.0.1:6379> scard cc
(integer) 5

7 Redis雜湊(Hash)

  • KV模式不變,但V是一個鍵值對

7.1 常用命令

  • hset/hget/hmset/hmget/hgetall/hdel
    • hset:HSET key field value
      • 將雜湊表 key 中的域 field 的值設為 value
    • hget:HGET key field
      • 返回雜湊表 key 中給定域 field 的值。
    • hmset:HMSET key field value [field value …]
      • 同時將多個 field-value (域-值)對設定到雜湊表 key 中。
    • hmget:HMGET key field [field …]
      • 返回雜湊表 key 中,一個或多個給定域的值。
    • hgetall:HGETALL key
      • 返回雜湊表 key 中,所有的域和值。
    • hdel:HDEL key field [field …]
      • 刪除雜湊表 key 中的一個或多個指定域,不存在的域將被忽略。
  • hlen
    • HLEN key
    • 返回雜湊表 key 中域的數量。
  • hexists key 在key裡面的某個值的key
    • HEXISTS key field
    • 檢視雜湊表 key 中,給定域 field 是否存在。
  • hkeys/hvals
    • hkeys:HKEYS key
      • 返回雜湊表 key 中的所有域
    • hvals:HVALS key
      • 返回雜湊表 key 中所有域的值。
  • hincrby/hincrbyfloat
    • hincrby:HINCRBY key field increment
      • 為雜湊表 key 中的域 field 的值加上增量 increment
    • hincrbyfloat:HINCRBY key field increment
      • 為雜湊表 key 中的域 field 的值加上增量 increment
  • hsetnx
    • HSETNX key field value
    • 將雜湊表 key 中的域 field 的值設定為 value ,當且僅當域 field 不存在。
  • 詳情參考:http://redisdoc.com/hash/index.html

7.2 示例

[[email protected] bin]# redis-cli 
127.0.0.1:6379> KEYS *
(empty list or set)
127.0.0.1:6379> hset englishBook price 100
(integer) 1
127.0.0.1:6379> hget englishBook price
"100"
127.0.0.1:6379> hmset englishBook name youtube1 master 89
OK
127.0.0.1:6379> hmget englishBook name master
1) "youtube1"
2) "89"
127.0.0.1:6379> HGETALL englishBook
1) "price"
2) "100"
3) "name"
4) "youtube1"
5) "master"
6) "89"
127.0.0.1:6379> HEXISTS englishBook name
(integer) 1
127.0.0.1:6379> HEXISTS englishBook name1
(integer) 0
127.0.0.1:6379> HKEYS englishBook
1) "price"
2) "name"
3) "master"
127.0.0.1:6379> HVALS englishBook
1) "100"
2) "youtube1"
3) "89"

8 Redis有序集合Zset(sorted set)

8.1 常用命令

  • zadd/zrange
    • zadd:ZADD key score member [[score member][score member] …]
      • 將一個或多個 member 元素及其 score 值加入到有序集 key 當中。
    • zrange:ZRANGE key start stop [WITHSCORES]
      • 返回有序集 key 中,指定區間內的成員。
  • zrangebyscore key 開始score 結束score
    • ZRANGEBYSCORE key min max [WITHSCORES][LIMIT offset count]
    • 返回有序集 key 中,所有 score 值介於 minmax 之間(包括等於 minmax )的成員。有序整合員按 score 值遞增(從小到大)次序排列。
  • 詳情參考:http://redisdoc.com/sorted_set/index.html

8.2 示例

127.0.0.1:6379> zadd student 100 lili 90 limei 70 lili
(integer) 2
127.0.0.1:6379> ZRANGE student 0 -1
1) "lili"
2) "limei"
127.0.0.1:6379> ZRANGE student 0 -1 WITHSCORES
1) "lili"
2) "70"
3) "limei"
4) "90"