/**
* 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.youkuaiyun.com/zhoucheng05_13/article/details/79864568
*
* 存储列表数据(3种方式)
* 原生字符串类型:每个属性一个键
* 优点:简单直观,每个属性都支持更新操作
* 缺点:占用过多的键,内存占用量大,内聚性差,生产勿用
* 序列化字符串类型:将用户信息序列化后用一个键保存
* 优点:简化编程
* 缺点:序列化和反序列化开销大更新不支持一个field单独更新
* hash类型:每个用户属性使用一对field-value,,但是使用一个键保存
* 优点:简单直观,若使用合理则减少内存开销
* 缺点:要控制哈希在ziplist和hashtable两种内部编码的转换,hashtable会消耗更多的内存
* 参考: https://blog.youkuaiyun.com/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--用户排名信息
*/