/**
* 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--用戶排名信息
*/