redis 5種類型

/**
     * String 是redis最基本類型,是二進制安全的 無需擔心特殊字符是否可用,沒有限制,底層是二進制存儲
     * 從內部實現來看,其實String可以看做byte數組,所以redis的String可以可以包含任何數據:字符串、序列化對象或文件
     * Redis的其他類型hash,list,set,sorted set,他們包含的元素本質上是String類型
     * 一個String的key,value最大上限均是512M
     * 如果是數值型數據的話,String也可以被部分命令按int處理,比如incr按原子遞增
     * [root@fucdnsitdb05 bin]#  cd /usr/local/redis-3.0.7/bin
     * [root@fucdnsitdb05 bin]# ./redis-cli
     * 127.0.0.1:6379> keys *
     * (empty list or set)
     * 127.0.0.1:6379>
     * Last login: Thu May 30 14:46:55 from 10.49.9.11
     * [root@fucdnsitdb05 ~]# cd /usr/local/redis-3.0.7/
     * [root@fucdnsitdb05 redis-3.0.7]# cd bin
     * [root@fucdnsitdb05 bin]# ./redis.cli
     * -bash: ./redis.cli: No such file or directory
     * [root@fucdnsitdb05 bin]# ./redis-cli
     * 127.0.0.1:6379> keys *
     * (empty list or set)
     * 127.0.0.1:6379> exit
     * [root@fucdnsitdb05 bin]# ps -ef|grep redis
     * root     11056  9819  0 15:37 pts/0    00:00:00 grep redis
     * [root@fucdnsitdb05 bin]# ./redis-cli
     * Could not connect to Redis at 127.0.0.1:6379: Connection refused
     * not connected> exit
     * [root@fucdnsitdb05 bin]# ./redis-cli
     * 127.0.0.1:6379> keys *
     * (empty list or set)
     * 127.0.0.1:6379> dbsize
     * (integer) 0
     * 127.0.0.1:6379> exit
     * [root@fucdnsitdb05 bin]# ./redis-cli
     * 127.0.0.1:6379> set zhuangwenbo sb
     * OK
     * 127.0.0.1:6379> keys *
     * 1) "zhuangwenbo"
     * 127.0.0.1:6379> dbsize
     * (integer) 1
     * 127.0.0.1:6379> zhuangwenbo type
     * (error) ERR unknown command 'zhuangwenbo'
     * 127.0.0.1:6379> ttl zhuangwenbo
     * (integer) -1
     * 127.0.0.1:6379> exists zhuangwenbo
     * (integer) 1
     * 127.0.0.1:6379> expire zhuangwenbo
     * (error) ERR wrong number of arguments for 'expire' command
     * 127.0.0.1:6379> expire zhuangwenbo 3
     * (integer) 1
     * 127.0.0.1:6379> ttl zhuangwenbo
     * (integer) -2
     * 127.0.0.1:6379> ttl zhuangwenbo
     * (integer) -2
     * 127.0.0.1:6379> ttl zhuangwenbo
     * (integer) -2  
     * 127.0.0.1:6379> del zhuangwenbo
     * (integer) 0
     * 127.0.0.1:6379> exists zhuangwenbo
     * (integer) 0
     * 127.0.0.1:6379> ttl zhuangwenbo
     * (integer) -2
     * 127.0.0.1:6379> set zhangwenbo sb
     * OK
     * 127.0.0.1:6379> get zhuangwenbo
     * (nil)
     * 127.0.0.1:6379> del zhangwenbo
     * (integer) 1
     * 127.0.0.1:6379> set zhuangwenbo sb
     * OK
     * 127.0.0.1:6379> get zhuangwenbo
     * "sb"
     * 127.0.0.1:6379> mset zengjian sb guozhijun sb
     * OK
     * 127.0.0.1:6379> mget zengjian guozhijun
     * 1) "sb"
     * 2) "sb"
     * 127.0.0.1:6379> incr zengjian
     * (error) ERR value is not an integer or out of range
     * 127.0.0.1:6379> set huangyinwei 1
     * OK
     * 127.0.0.1:6379> incr huangyinwei
     * (integer) 2
     * 127.0.0.1:6379> decr huangyinwei
     * (integer) 1
     * 127.0.0.1:6379> incrby huangyinwei 3
     * (integer) 4
     * 127.0.0.1:6379> decrby huangyinwei 5
     * (integer) -1
     * 127.0.0.1:6379> incrbyfloat huangyinwei
     * (error) ERR wrong number of arguments for 'incrbyfloat' command
     * 127.0.0.1:6379> incrbycloat huangyinwei 3
     * (error) ERR unknown command 'incrbycloat'
     * 127.0.0.1:6379> incrbyfloat huangyinwei 3
     * "2"
     * 127.0.0.1:6379> append zhuangwenbo sb
     * (integer) 4
     * 127.0.0.1:6379> keys *
     * 1) "huangyinwei"
     * 2) "guozhijun"
     * 3) "zhuangwenbo"
     * 4) "zengjian"
     * 127.0.0.1:6379> mget zhuangwenbo
     * 1) "sbsb"
     * 127.0.0.1:6379> del zhuangwenbo
     * (integer) 1
     * 127.0.0.1:6379> set zhuangwenbo sb
     * OK
     * 127.0.0.1:6379> get zhuangwenbo
     * "sb"
     * 127.0.0.1:6379> append zhuangwenbo sb
     * (integer) 4
     * 127.0.0.1:6379> get zhuangwenbo
     * "sbsb"
     * 127.0.0.1:6379> strlen zhuangwenbo
     * (integer) 4
     * 127.0.0.1:6379> append zhuangwenbo sbsb
     * (integer) 8
     * 127.0.0.1:6379> strlen zhuangwenbo
     * (integer) 8
     * 127.0.0.1:6379> setrange zhuangwenbo offset 1
     * (error) ERR value is not an integer or out of range
          * 127.0.0.1:6379> get zhuangwenbo
     * "sbsbsbsb"
     * 127.0.0.1:6379> setrange zhuangwenbo 1 is
     * (integer) 8
     * 127.0.0.1:6379> get zhuangwenbo
     * "sisbsbsb"
     * 127.0.0.1:6379> del zhuangwenbo
     * (integer) 1
     * 127.0.0.1:6379> set zhuangwenbo 1234567890
     * OK
     * 127.0.0.1:6379> getrange zhuangwenbo 0 3
     * "1234"
     * 127.0.0.1:6379> getrange zhuangwenbo 1 3
     * "234"
     * 127.0.0.1:6379> getrange zhuangwenbo 0 -1
     * "1234567890"
     * int 8個字節的長整型
     * embstr 小於等於39個字節的字符串
     * raw 大於39個字節的字符串
     * 應用場景:
     * 1、緩存 2、計數(統計視頻播放次數、點贊次數)3、session共享 4、限流
     */


   
/**
     * hash存儲的是一個field和value的映射表,即存儲的是是一個map,每一條數據可以看做key-field-value field-value對應的是一個map的鍵值對
     * [root@fucdnsitdb05 ~]# ps -ef|grep redis
     * root     10881 10848  0 19:14 pts/0    00:00:00 grep redis
     * root     11285     1  0 15:39 ?        00:00:08 ./redis-server *:6379
     * [root@fucdnsitdb05 ~]# cd /usr/local/redis-3.0.7/bin
     * [root@fucdnsitdb05 bin]# ./redis-cli
     * 127.0.0.1:6379> keys *
     * (empty list or set)
     * 127.0.0.1:6379> dbsize
     * (integer) 0
     * 127.0.0.1:6379> hset zhuangwenbo height short
     * (integer) 1
     * 127.0.0.1:6379> mget zhuangwenbo
     * 1) (nil)
     * 127.0.0.1:6379> mget zhuangwenbo height
     * 1) (nil)
     * 2) (nil)
     * 127.0.0.1:6379> hget zhuangwenbo
     * (error) ERR wrong number of arguments for 'hget' command
     * 127.0.0.1:6379> hget zhuangwenbo height
     * "short"
     * 127.0.0.1:6379> hdel zhuangwenbo
     * (error) ERR wrong number of arguments for 'hdel' command
     * 127.0.0.1:6379> hdel zhuangwenbo height
     * (integer) 1
     * 127.0.0.1:6379> dbsize
     * (integer) 0
     * 127.0.0.1:6379> hlen zhuangwenbo
     * (integer) 0
     * 127.0.0.1:6379> hset zhuangwenbo height short
     * (integer) 1
     * 127.0.0.1:6379> hlen zhuangwenbo
     * (integer) 1
     * 127.0.0.1:6379> hset zhuangwenbo height tall
     * (integer) 0
     * 127.0.0.1:6379> hlen zhuangwenbo
     * (integer) 1
     * 127.0.0.1:6379> hget zhuangwenbo height
     * "tall"
     * 127.0.0.1:6379> hset zhuangwenbo fail long
     * (integer) 1
     * 127.0.0.1:6379> hget zhuangwenbo fail
     * "long"
     * 127.0.0.1:6379> dbsize
     * (integer) 1
     * 127.0.0.1:6379> hget zhuangwenbo height fail
     * (error) ERR wrong number of arguments for 'hget' command
     * 127.0.0.1:6379> hget zhuangwenbo height zhuangwenbo fail
     * (error) ERR wrong number of arguments for 'hget' command
     * 127.0.0.1:6379> hgetall zhuangwenbo
     * 1) "height"
     * 2) "tall"
     * 3) "fail"
     * 4) "long"
     * 127.0.0.1:6379> hmget height fail
     * 1) (nil)
     * 127.0.0.1:6379> hmget zhuangwenbo height fail
     * 1) "tall"
     * 2) "long"
     * 127.0.0.1:6379> hmset zengjian height short fail short
     * OK
     * 127.0.0.1:6379> hmget zengjian height fail
     * 1) "short"
     * 2) "short"
     * 127.0.0.1:6379> hexists zengjian height
     * (integer) 1
     * 127.0.0.1:6379> hexists zengjian big
     * (integer) 0
     * 127.0.0.1:6379> hexists zengjian
     * (error) ERR wrong number of arguments for 'hexists' command
     * 127.0.0.1:6379> hexists zengjian height big
     * (error) ERR wrong number of arguments for 'hexists' command
     * 127.0.0.1:6379> hkeys zengjian
     * 1) "height"
     * 2) "fail"
     * 127.0.0.1:6379> hvals zengjian
     * 1) "short"
     * 2) "short"
     * 127.0.0.1:6379> hsetnx guozhijun height short
     * (integer) 1
     * 127.0.0.1:6379> hsetnx guozhijun height tall
     * (integer) 0
     * 127.0.0.1:6379> hget guozhijun height
     * "short"
     * 127.0.0.1:6379> hincrby guozhijun height increment
     * (error) ERR value is not an integer or out of range
     * 127.0.0.1:6379> hset guozhijun basketball 1
     * (integer) 1
     * 127.0.0.1:6379> hmget guozhijun height basketball
     * 1) "short"
     * 2) "1"
     * 127.0.0.1:6379> hincrby guozhijun basketball 10
     * (integer) 11
     * 127.0.0.1:6379> hincrbyfloat guozhijun basketball 10
     * "21"
     * 127.0.0.1:6379> hstrlen guozhijun
     * (error) ERR unknown command 'hstrlen'
     * 127.0.0.1:6379> hstrlen guozhijun basketball
     * (error) ERR unknown command 'hstrlen'
     * 127.0.0.1:6379> HSTRLEN myhash f2
     * (error) ERR unknown command 'HSTRLEN'
     *
     * ziplist (8個字節的長整型)
     * 元素個數小於hash-max-ziplist-entries配置 (默認512個)
     * 所有值都小於hash-max-ziplist-entries配置 (默認64)
     * 更加緊湊的數據結構,比hashtable節省內存
     * hashtable (<=39個字節的字符串)
     * 無法滿足ziplist的條件時,redis會使用hashtable作爲hash的內部實現
     * 不滿足ziplist條件時使用ziplist操作讀寫效率會下降,而hashtable的讀寫複雜度爲o(1)
     * 參考: https://blog.csdn.net/zhoucheng05_13/article/details/79864568
     *
     * 存儲列表數據(3種方式)
        * 原生字符串類型:每個屬性一個鍵
     *     優點:簡單直觀,每個屬性都支持更新操作
     *     缺點:佔用過多的鍵,內存佔用量大,內聚性差,生產勿用
     * 序列化字符串類型:將用戶信息序列化後用一個鍵保存
     *     優點:簡化編程
     *     缺點:序列化和反序列化開銷大更新不支持一個field單獨更新
     * hash類型:每個用戶屬性使用一對field-value,,但是使用一個鍵保存
     *     優點:簡單直觀,若使用合理則減少內存開銷
     *     缺點:要控制哈希在ziplist和hashtable兩種內部編碼的轉換,hashtable會消耗更多的內存
     * 參考: https://blog.csdn.net/fd2025/article/details/80066387
     */


     
/**
     * list類型其實就是每個子元素都是string類型的雙向列表
     * 我們可以通過push、pop操作從鏈表的頭部或者尾部添加刪除元素。這使得鏈表既可以用作棧,也可以用作隊列
     * Last login: Thu May 30 19:14:40 from 10.49.9.11
     * [root@fucdnsitdb05 ~]# ps -ef|grep redis
     * root     11285     1  0 15:39 ?        00:00:09 ./redis-server *:6379
     * root     15199 15161  0 19:43 pts/0    00:00:00 grep redis
     * [root@fucdnsitdb05 ~]# cd /usr/local/redis-3.0.7/bin
     * [root@fucdnsitdb05 bin]# ./redis-cli
     * 127.0.0.1:6379> keys *
     * 1) "guozhijun"
     * 2) "zhuangwenbo"
     * 3) "zengjian"
     * 127.0.0.1:6379> del guozhijun zhuangwenbo zengjian
     * (integer) 3
     * 127.0.0.1:6379> rpush zhuangwenbo 1
     * (integer) 1
     * 127.0.0.1:6379> lrange zhuangwenbo 0 2
     * 1) "1"
     * 127.0.0.1:6379> lrange zhuangwenbo 0 0
     * 1) "1"
     * 127.0.0.1:6379> lrange zhuangwenbo 1 2
     * (empty list or set)
     * 127.0.0.1:6379> lrange zhuangwenbo 1 0
     * (empty list or set)
     * 127.0.0.1:6379> lrange zhuangwenbo 0 -1
     * 1) "1"
     * 127.0.0.1:6379> rpush zhuangwenbo 2
     * (integer) 2
     * 127.0.0.1:6379> lrange zhuangwenbo  0 -1
     * 1) "1"
     * 2) "2"
     * 127.0.0.1:6379> lpush zhuangwenbo 3
     * (integer) 3
     * 127.0.0.1:6379> lrange zhuangwenbo 0 -1
     * 1) "3"
     * 2) "1"
     * 3) "2"
     * 127.0.0.1:6379> lindex zhuangwenbo 1
     * "1"
     * 127.0.0.1:6379> lindex zhuangwenbo 0
     * "3"
     * 127.0.0.1:6379> lindex zhuangwenbo -1
     * "2"
     * 127.0.0.1:6379> lindex zhuangwenbo -2
     * "1"
     * 127.0.0.1:6379> lindex zhuangwenbo 3
     * (nil)
     * 127.0.0.1:6379> lindex zhuangwenbo -4
     * (nil)
     * 127.0.0.1:6379> lindex zhuangwenbo -3
     * "3"
     * 127.0.0.1:6379> llen zhuangwenbo
     * (integer) 3
     * 127.0.0.1:6379> linsert zhuangwenbo before plvot 1
     * (integer) -1
     * 127.0.0.1:6379> lrange zhuangwenbo 0 -1\
     * (error) ERR value is not an integer or out of range
     * 127.0.0.1:6379> lrange zhuangwenbo 0 -1
     * 1) "3"
     * 2) "1"
     * 3) "2"
     * 127.0.0.1:6379> linsert zhuangwenbo before 1 1
     * (integer) 4
     * 127.0.0.1:6379> lrange zhuangwenbo 0 -1
     * 1) "3"
     * 2) "1"
     * 3) "1"
     * 4) "2"
     * 127.0.0.1:6379> linsert zhuangwenbo before 1 3
     * (integer) 5
     * 127.0.0.1:6379> lrange zhuangwenbo 0 -1
     * 1) "3"
     * 2) "3"
     * 3) "1"
     * 4) "1"
     * 5) "2"
     * 127.0.0.1:6379> linsert zhuangwenbo after 1 5
     * (integer) 6
     * 127.0.0.1:6379> lrange zhuangwenbo 0 -1
     * 1) "3"
     * 2) "3"
     * 3) "1"
     * 4) "5"
     * 5) "1"
     * 6) "2"
     * 127.0.0.1:6379> lpop zhuangwenbo
     * "3"
     * 127.0.0.1:6379> lrange zhuangwenbo 0 -1
     * 1) "3"
     * 2) "1"
     * 3) "5"
     * 4) "1"
     * 5) "2"
     * 127.0.0.1:6379> rpop zhuangwenbo
     * "2"
     * 127.0.0.1:6379> lrange zhuangwenbo 0 -1\
     * (error) ERR value is not an integer or out of range
     * 127.0.0.1:6379> lrange zhuangwenbo 0 -1
     * 1) "3"
     * 2) "1"
     * 3) "5"
     * 4) "1"
     * 127.0.0.1:6379> lrem zhuangwenbo 1 1
     * (integer) 1
     * 127.0.0.1:6379> rpush zhuangwenbo good
     * (integer) 4
     * 127.0.0.1:6379> rpush zhuangwenbo bad
     * (integer) 5
     * 127.0.0.1:6379> rpush zhuangwenbo cool
     * (integer) 6
     * 127.0.0.1:6379> lrange zhuangwenbo 0 p1
     * (error) ERR value is not an integer or out of range
     * 127.0.0.1:6379> lrange zhuangwenbo 0 -1
     * 1) "3"
     * 2) "5"
     * 3) "1"
     * 4) "good"
     * 5) "bad"
     * 6) "cool"
     * 127.0.0.1:6379> lpush zhuangwenbo sex
     * (integer) 7
     * 127.0.0.1:6379> lrange zhuangwenbo 0 -1
     * 1) "sex"
     * 2) "3"
     * 3) "5"
     * 4) "1"
     * 5) "good"
     * 6) "bad"
     * 7) "cool"
     * 127.0.0.1:6379> lrem zhuangwenbo 1 good
     * (integer) 1
     * 127.0.0.1:6379> lrange zhuangwenbo 0 -1
     * 1) "sex"
     * 2) "3"
     * 3) "5"
     * 4) "1"
     * 5) "bad"
     * 6) "cool"
     * 127.0.0.1:6379> lrem zhuangwenbo 1 good
     * (integer) 0
     * 127.0.0.1:6379> ltrim zhuangwenbo 0 -1
     * OK
     * 127.0.0.1:6379> lrange zhuangwenbo 0 -1
     * 1) "sex"
     * 2) "3"
     * 3) "5"
     * 4) "1"
     * 5) "bad"
     * 6) "cool"
     * 127.0.0.1:6379> ltrim zhuangwenbo 1 3
     * OK
     * 127.0.0.1:6379> lrange zhuangwenbo 0 -1
     * 1) "3"
     * 2) "5"
     * 3) "1"
     * 127.0.0.1:6379> lset zhuangwenbo 0 2
     * OK
     * 127.0.0.1:6379> lrange zhuangwenbo 0 -1
     * 1) "2"
     * 2) "5"
     * 3) "1"
     * 127.0.0.1:6379> lrange zhuangwenbo 3 8
     * (empty list or set)
     * 127.0.0.1:6379> lrange zhuangwenbo -2 7
     * 1) "5"
     * 2) "1"
     * 127.0.0.1:6379> lset zhuangwenbo 3 8
     * (error) ERR index out of range
     * 127.0.0.1:6379> lset zhuangwenbo -2 7
     * OK
     * 127.0.0.1:6379> lrange zhuangwenbo 0 -1
     * 1) "2"
     * 2) "7"
     * 3) "1"
     * 127.0.0.1:6379> blpop zhuangwenbo
     * (error) ERR wrong number of arguments for 'blpop' command
     * 127.0.0.1:6379> blpop zhuangwenbo 1
     * 1) "zhuangwenbo"
     * 2) "2"
     * 127.0.0.1:6379> lrange zhuangwenbo 0 -1
     * 1) "7"
     * 2) "1"
     * 127.0.0.1:6379> blpop zhuangwenbo 1
     * 1) "zhuangwenbo"
     * 2) "7"
     * 127.0.0.1:6379> lrange zhuangwenbo 0 -1
     * 1) "1"
     * 127.0.0.1:6379> blpop zhuangwenbo 1
     * 1) "zhuangwenbo"
     * 2) "1"
     * 127.0.0.1:6379> lrange zhuangwenbo 0 -1
     * (empty list or set)
     * 127.0.0.1:6379> blpop zhuangwenbo 3
     * (nil)
     * (3.10s)
     * 127.0.0.1:6379> blpop zhuangwenbo 3
     * (nil)
     * (3.03s)
     * 127.0.0.1:6379> blpop zhuangwenbo 3
     * 1) "zhuangwenbo"
     * 2) "1"
     * (2.95s)
     * 127.0.0.1:6379> blpop zhuangwenbo
     * (error) ERR wrong number of arguments for 'blpop' command
     * 127.0.0.1:6379> blpop zhuangwenbo 1000
     * 1) "zhuangwenbo"
     * 2) "1"
     * (5.02s)
     * 127.0.0.1:6379> brpop zhuangwenbo 1000
     * 1) "zhuangwenbo"
     * 2) "1"
     * (5.23s)
     * 內部編碼:
     * ziplist(壓縮列表)
     * 滿足兩個條件: 1.元素個數小於hash-max-ziplist-entries配置(默認512個)
     *                2.所有制都小於hash-max-ziplist-value配置(默認64)
     *  linkedlist(鏈表)
     *  無法滿足ziplist的條件時,redis會使用linkedlist作爲列表的內部實現
     *  quicklist(redis3.2版本提供)
     *  數據結構:以ziplist爲節點的linkedlist
     *  結合了ziplist和linkedlist兩者的優勢
     *
     *  1)使用push+brpop命令組合實現阻塞隊列(生產者與消費者模式)
     *       lpush生產者向列表左側插入數據
     *       brpop消費者阻塞式搶列表尾部元素
     *  2)使用hash保存文章信息
     *       key:文章id
     *       value:文章內容
     *  使用列表保存用戶與文章的關聯關係
     *       key:用戶id
     *       value:文章id列表
     *  通過用戶id 獲取文章key列表通過文章key列表遍歷獲取文章信息
     *  3)棧 lpush+lpop
     *  隊列 lpush+rpop
     *  消息隊列 lpush+brpop
     *  有限集合 lpush+ltrim
     */



/**
     * set是string類型的無序集合,集合中最大可以包含(2的32次方-1)個元素
     * set可以看做vlaue爲空的hash結構,所以不會出現重複的元素
     * set提供集合的並集、交集、差集的方法通過這些方法很容易實現好友推薦和blog的tab
     * [root@fucdnsitdb05 ~]# ps -ef|grep redis
     * root     11285     1  0 15:39 ?        00:00:12 ./redis-server *:6379
     * root     22927 22881  0 20:36 pts/0    00:00:00 grep redis
     * [root@fucdnsitdb05 ~]# cd /usr/local/redis-3.0.7/bin/
     * [root@fucdnsitdb05 bin]# ./redis-cli
     * 127.0.0.1:6379> keys *
     * (empty list or set)
     * 127.0.0.1:6379> sadd zhuangwenbo ss sss ssss ss
     * (integer) 3
     * 127.0.0.1:6379> srem zhuangwenbo
     * (error) ERR wrong number of arguments for 'srem' command
     * 127.0.0.1:6379> srem zhuangwenbo s
     * (integer) 0
     * 127.0.0.1:6379> srem zhuangwenbo ss
     * (integer) 1
     * 127.0.0.1:6379> scard zhuangwenbo
     * (integer) 2
     * 127.0.0.1:6379> smember zhuangwnbo
     * (error) ERR unknown command 'smember'
     * 127.0.0.1:6379> smember zhuangwenbo
     * (error) ERR unknown command 'smember'
     * 127.0.0.1:6379> smembers zhuangwenbo
     * 1) "ssss"
     * 2) "sss"
     * 127.0.0.1:6379> smembers zhuangwenbo sss
     * (error) ERR wrong number of arguments for 'smembers' command
     * 127.0.0.1:6379> srandmember zhuangwenbo 3
     * 1) "sss"
     * 2) "ssss"
     * 127.0.0.1:6379> srandmember zhuangwenbo
     * "ssss"
     * 127.0.0.1:6379> smembers zhuangwenbo
     * 1) "ssss"
     * 2) "sss"
     * 127.0.0.1:6379> sismember zhuangwenbo ss
     * (integer) 0
     * 127.0.0.1:6379> sismember zhuangwenbo sss
     * (integer) 1
     * 127.0.0.1:6379> sismember zhuangwenbo ssss
     * (integer) 1
     * 127.0.0.1:6379> spop zhuangwenbo
     * "sss"
     * 127.0.0.1:6379> smembers zhuangwenbo
     * 1) "ssss"
     * 127.0.0.1:6379> sismember zhuangwenbo ssss
     * (integer) 1
     * 127.0.0.1:6379> sismember zhuangwenbo sss
     * (integer) 0
     * 127.0.0.1:6379> sadd zengjian ss ssss
     * (integer) 2
     * 127.0.0.1:6379> smembers zengjian
     * 1) "ss"
     * 2) "ssss"
     * 127.0.0.1:6379> smembers zhuangwenbo
     * 1) "ssss"
     * 127.0.0.1:6379> sadd zhuangwenbo s
     * (integer) 1
     * 127.0.0.1:6379> smembers zhuangwenbo
     * 1) "s"
     * 2) "ssss"
     * 127.0.0.1:6379> smembers zengjian
     * 1) "ss"
     * 2) "ssss"
     * 127.0.0.1:6379> sinter zengjian zhuangwenbo
     * 1) "ssss"
     * 127.0.0.1:6379> suinon zengjian zhuangwenbo
     * (error) ERR unknown command 'suinon'
     * 127.0.0.1:6379> sunion zengjian zhuangwenbo
     * 1) "ss"
     * 2) "s"
     * 3) "ssss"
     * 127.0.0.1:6379> sdiff zengjian zhuangwenbo
     * 1) "ss"
     * 127.0.0.1:6379> sdiff zhuangwenbo zengjian
     * 1) "s"
     * intset(整數集合) 滿足兩個條件
     * 1.集合中的元素都是整數 2.元素個數小於set-max-intset-entries配置(默認512)
     * hashtable 不滿足intset條件時,redis使用hashtable作爲集合的內部實現
     * 使用場景
     * 標籤 sadd
     * 抽獎 spop/srandmember
     * 社交求共同好友 sadd+sinter
     */

/**
     * sorted set也是string類型元素的集合,不同的是每個元素都會關聯一個double的score,是一個有序的集合
     * [root@fucdnsitdb05 ~]# cd /usr/local/redis-3.0.7/bin/
     * [root@fucdnsitdb05 bin]# ./redis-cli
     * 127.0.0.1:6379> keys *
     * (empty list or set)
     * 127.0.0.1:6379> zadd zhuangwenbo 1 chinese 2 maths 3 english
     * (integer) 3
     * 127.0.0.1:6379> zrange zhuangwenbo 0 -1
     * 1) "chinese"
     * 2) "maths"
     * 3) "english"
     * 127.0.0.1:6379> zrevrange zhuangwenbo 0 -1
     * 1) "english"
     * 2) "maths"
     * 3) "chinese"
     * 127.0.0.1:6379> zrange zhuangwenbo 0 -1 withscores
     * 1) "chinese"
     * 2) "1"
     * 3) "maths"
     * 4) "2"
     * 5) "english"
     * 6) "3"
     * 127.0.0.1:6379> zrevrange zhuangwenbo 0 -1 withscores
     * 1) "english"
     * 2) "3"
     * 3) "maths"
     * 4) "2"
     * 5) "chinese"
     * 6) "1"
     * 127.0.0.1:6379> zscore zhuangwenbo english
     * "3"
     * 127.0.0.1:6379> zscore zhuangwenbo maths
     * "2"
     * 127.0.0.1:6379> zscore zhuangwenbo pe
     * (nil)
     * 127.0.0.1:6379> zcard zhuangwenbo
     * (integer) 3
     * 127.0.0.1:6379> zadd zhuagnwenbo 4 pe
     * (integer) 1
     * 127.0.0.1:6379> zcard zhuangwenbo
     * (integer) 3
     * 127.0.0.1:6379> del zhuagnwenbo
     * (integer) 1
     * 127.0.0.1:6379> zadd zhuangwenbo 4 pe
     * (integer) 1
     * 127.0.0.1:6379> zcard zhuangwenbo
     * (integer) 4
     * 127.0.0.1:6379> zrank zhuangwenbo pe
     * (integer) 3
     * 127.0.0.1:6379> zrank zhuangwenbo chinese
     * (integer) 0
     * 127.0.0.1:6379> zrevrank zhuangwenbo chinese
     * (integer) 3
     * 127.0.0.1:6379> zrevrank zhuangwenbo pe
     * (integer) 0
     * 127.0.0.1:6379> zrem zhuangwenbo  chinese
     * (integer) 1
     * 127.0.0.1:6379> zrange zhuangwenbo 0 -1
     * 1) "maths"
     * 2) "english"
     * 3) "pe"
     * 127.0.0.1:6379> zrem zhuangwenbo maths english pe
     * (integer) 3
     * 127.0.0.1:6379> zrange zhuangwenbo 0 -1
     * (empty list or set)
     * 127.0.0.1:6379> dbsize
     * (integer) 0
     * 127.0.0.1:6379> zadd zengjian chinese 3 maths 1 english 2
     * (error) ERR value is not a valid float
     * 127.0.0.1:6379> zadd zengjian chinese 3
     * (error) ERR value is not a valid float
     * 127.0.0.1:6379> zadd zengjian 3 chinese
     * (integer) 1
     * 127.0.0.1:6379> zadd zengjian 1 maths english 2
     * (error) ERR value is not a valid float
     * 127.0.0.1:6379> zadd zengjian 1 maths 2 english
     * (integer) 2
     * 127.0.0.1:6379> zrange zengjian 0 -1
     * 1) "maths"
     * 2) "english"
     * 3) "chinese"
     * 127.0.0.1:6379> zincrby zengjian 4 chinese
     * "7"
     * 127.0.0.1:6379> zrangebyscore zengjian 0 -1
     * (empty list or set)
     * 127.0.0.1:6379> zrangebyscore zengjian 0 6
     * 1) "maths"
     * 2) "english"
     * 127.0.0.1:6379> zrangebyscore zengjian 0 7
     * 1) "maths"
     * 2) "english"
     * 3) "chinese"
     * 127.0.0.1:6379> zrevrangebyscore zengjian 7 0
     * 1) "chinese"
     * 2) "english"
     * 3) "maths"
     * 127.0.0.1:6379> zrevrangebyscore zengjian 6 0
     * 1) "english"
     * 2) "maths"
     * 127.0.0.1:6379> zrevrangebyscore zengjian 6 0 withscores
     * 1) "english"
     * 2) "2"
     * 3) "maths"
     * 4) "1"
     * 127.0.0.1:6379> zrangebyscore zengjian 0 7 withscores
     * 1) "maths"
     * 2) "1"
     * 3) "english"
     * 4) "2"
     * 5) "chinese"
     * 6) "7"
     * 127.0.0.1:6379> zrenrangebyrank zengjian 0 7
     * (error) ERR unknown command 'zrenrangebyrank'
     * 127.0.0.1:6379> zremrangebyrank zengjian 0 7
     * (integer) 3
     * 127.0.0.1:6379> zremrangebyscore zengjian 07
     * (error) ERR wrong number of arguments for 'zremrangebyscore' command
     * 127.0.0.1:6379> zremrangebyscore zengjian 0 7
     * (integer) 0
     * 127.0.0.1:6379> zadd zengjian 1 chinese 3 english
     * (integer) 2
     * 127.0.0.1:6379> zadd zhuangwenbo 1 chinese 2 english
     * (integer) 2
     * 127.0.0.1:6379> zinterstore guozhijun 2 zengjian zhuangwenbo
     * (integer) 2
     * 127.0.0.1:6379> zrangebyscore guozhijun 0 7 withscores
     * 1) "chinese"
     * 2) "2"
     * 3) "english"
     * 4) "5"
     * 127.0.0.1:6379> zunionstore huangyinwei 2 zengjian zhuangwenbo
     * (integer) 2
     * 127.0.0.1:6379> zrangebyscore huangyinwei 0 7 withscores
     * 1) "chinese"
     * 2) "2"
     * 3) "english"
     * 4) "5"
     * 內部編碼:
     * ziplist 適用條件:
     *          1)元素個數小於zset-max-ziplist-entries配置(默認128個)
     *          2)每個元素個數的值小於zset-max-ziplist-value配置(默認64字節)
     *          優勢:有效減小內存的使用
     * skiplist 當ziplist不滿足條件時使用skiplist
     * 使用場景:
     * 添加用戶贊數: zadd和zincrby  zadd user:ranking:1 3 mike
     *                              zincrby user:ranking:3 1 mike
     * 將用戶從榜單中刪除 zrem
     * 展示或贊數最多的10個用戶 zrevrange user:ranking 0 10
     * 展示用戶信息以及用戶分數  zscore--用戶分數 zrank--用戶排名信息
     */


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章