Redis 数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
String(字符串)
string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
Redis 字符串命令
127.0.0.1:6379> set key1 hello,redis #设置 OK 127.0.0.1:6379> get key1 #获取 "hello,redis" 127.0.0.1:6379> getset key1 hello,word #获取并设置,返回替换前的值 "hello,redis" 127.0.0.1:6379> getrange key1 1 3 #获取截取值 "ell" 127.0.0.1:6379> mset key2 value2 key3 value3 key4 value4 #设置一个或多个 OK 127.0.0.1:6379> mget key1 key2 key3 key4 #获取一个或多个 1) "hello,word" 2) "value2" 3) "value3" 4) "value4" 127.0.0.1:6379> setex key6 10 guoqishijian #设置过去时间,单位秒 OK 127.0.0.1:6379> ttl key6 (integer) 4 127.0.0.1:6379> ttl key6 (integer) 2 127.0.0.1:6379> ttl key6 (integer) -2 127.0.0.1:6379> get key6 (nil) 127.0.0.1:6379> setnx key4 value5 #如果存在key,设置失败 (integer) 0 127.0.0.1:6379> setnx key6 value6 #如果不存在key,设置成功 (integer) 1 127.0.0.1:6379> get key6 "value6" 127.0.0.1:6379> setrange key1 1 xx #替换指定位置和其后的字符 (integer) 10 127.0.0.1:6379> get key1 "hxxlo,word" 127.0.0.1:6379> setrange key1 1 e #写几个字符替换几个字符 (integer) 10 127.0.0.1:6379> get key1 "hexlo,word" 127.0.0.1:6379> strlen key1 #字符串长度 (integer) 10 127.0.0.1:6379> set key7 0 OK 127.0.0.1:6379> incr key7 #增一 (integer) 1 127.0.0.1:6379> incr key7 (integer) 2 127.0.0.1:6379> incr key7 (integer) 3 127.0.0.1:6379> incr key7 (integer) 4 127.0.0.1:6379> decr key7 #减一 (integer) 3 127.0.0.1:6379> decr key7 (integer) 2 127.0.0.1:6379> decr key7 (integer) 1 127.0.0.1:6379> append key2 appendvalue #字符拼接 (integer) 17 127.0.0.1:6379> get key2 "value2appendvalue"
Hash(哈希)
Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
Redis hash 命令
hash命令是操作key、操作String类型的命令前加个H,hash自身命令
127.0.0.1:6379> hset user name zhangsan age 12 sex 0 #设置 (integer) 3 127.0.0.1:6379> hget user name #取值 "zhangsan" 127.0.0.1:6379> hget user age "12" 127.0.0.1:6379> hget user sex "0" 127.0.0.1:6379> hmset user2 name lisi age 20 sex 1 #设置 OK 127.0.0.1:6379> hmget user name age #取值 1) "zhangsan" 2) "12" 127.0.0.1:6379> hscan user 0 match "n*" #查找包含n的字段 1) "0" 2) 1) "name" 2) "zhangsan" 127.0.0.1:6379> hkeys user #获取对象所有字段 1) "name" 2) "age" 3) "sex" 127.0.0.1:6379> hgetAll user #获取对象字段和值 1) "name" 2) "zhangsan" 3) "age" 4) "12" 5) "sex" 6) "0" 127.0.0.1:6379> hvals user #获取对象中的值 1) "zhangsan" 2) "12" 3) "0" 127.0.0.1:6379> hexists user name #判断是否存在 (integer) 1 127.0.0.1:6379> hdel user name #删除指定key (integer) 1 127.0.0.1:6379> hexists user name (integer) 0 127.0.0.1:6379> hincrby user age 1 #加一 (integer) 13 127.0.0.1:6379> hincrby user age -1 #减一 (integer) 12 127.0.0.1:6379> hsetnx user name xiaoqiang #判断对象的字段是否存在,不存在设置 (integer) 1 127.0.0.1:6379> hsetnx user name xiaoli #存在不设置 (integer) 0 127.0.0.1:6379> hget user name "xiaoqiang"
应用场景
存储、读取、修改用户属性
List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
队列(先进先出)、栈(先进后出)
Redis List命令
127.0.0.1:6379> lpush list item (integer) 1 127.0.0.1:6379> lpush list item1 (integer) 2 127.0.0.1:6379> lpush list item2 (integer) 3 127.0.0.1:6379> lpush list item3 (integer) 4 127.0.0.1:6379> lpush list item4 (integer) 5 127.0.0.1:6379> lpush list item5 #从左侧压入列表 (integer) 6 127.0.0.1:6379> llen list #查看列表长度 (integer) 6 127.0.0.1:6379> lpush list item6 (integer) 7 127.0.0.1:6379> lpop list #从左侧弹出 "item6" 127.0.0.1:6379> lrange list 0 -1 #查看列表所有元素 1) "item5" 2) "item4" 3) "item3" 4) "item2" 5) "item1" 6) "item" 127.0.0.1:6379> lindex list 2 #通过索引获取列表中的元素 "item3" 127.0.0.1:6379> lset list 5 item0 #通过索引修改列表中的元素 OK 127.0.0.1:6379> lrange list 0 -1 1) "item5" 2) "item4" 3) "item3" 4) "item2" 5) "item1" 6) "item0" 127.0.0.1:6379> rpush list item6 item7 item8 item9 #从右侧压入数据 (integer) 10 127.0.0.1:6379> lrange list 0 -1 1) "item5" 2) "item4" 3) "item3" 4) "item2" 5) "item1" 6) "item0" 7) "item6" 8) "item7" 9) "item8" 10) "item9" 127.0.0.1:6379> rpoplpush list destlist #取出list中最后一个元素放到目标列表中 "item9" 127.0.0.1:6379> lrange list 0 -1 1) "item5" 2) "item4" 3) "item3" 4) "item2" 5) "item1" 6) "item0" 7) "item6" 8) "item7" 9) "item8" 127.0.0.1:6379> lrange destlist 0 -1 1) "item9" 127.0.0.1:6379> rpop list #右侧弹出 "item8" 127.0.0.1:6379> lrange list 0 -1 1) "v3" 2) "v2" 3) "v1" 4) "item5" 5) "item4" 6) "item3" 7) "item2" 8) "item1" 9) "item0" 10) "item6" 11) "item7" 127.0.0.1:6379> linsert list before v1 v4 #插入指定元素到指定位置 (integer) 12 127.0.0.1:6379> lrange list 0 -1 1) "v3" 2) "v2" 3) "v4" 4) "v1" 5) "item5" 6) "item4" 7) "item3" 8) "item2" 9) "item1" 10) "item0" 11) "item6" 12) "item7" 127.0.0.1:6379> rpop list #从右侧弹出元素 "item7" 127.0.0.1:6379> lrange list 0 -1 1) "v3" 2) "v2" 3) "v4" 4) "v1" 5) "item5" 6) "item4" 7) "item3" 8) "item2" 9) "item1" 10) "item0" 11) "item6" 127.0.0.1:6379> lrem list 2 v4 #移除指定元素 (integer) 1 127.0.0.1:6379> lrange list 0 -1 1) "v3" 2) "v2" 3) "v1" 4) "item5" 5) "item4" 6) "item3" 7) "item2" 8) "item1" 9) "item0" 10) "item6" 127.0.0.1:6379> ltrim list 2 4 #列表只保留指定索引范围值 OK 127.0.0.1:6379> lrange list 0 -1 1) "v1" 2) "item5" 3) "item4"
应用场景
- 最新消息排行等功能(比如朋友圈的时间线)
- 消息队列
Set(集合)
Redis 的 Set 是 string 类型的无序集合,内容不可重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
为集合提供了求交集、并集、差集等操作
Redis Set命令
#追加 127.0.0.1:6379> sadd dept1 zhangsan lisi wangwu zhouliu (integer) 4 127.0.0.1:6379> sadd dept2 qianqi zhaoba lisan wanger aa bb (integer) 6 127.0.0.1:6379> sadd dept1 aa bb cc (integer) 3 127.0.0.1:6379> smembers dept1 #查看set中所有成员 1) "wangwu" 2) "bb" 3) "zhouliu" 4) "cc" 5) "zhangsan" 6) "lisi" 7) "aa" #删除 127.0.0.1:6379> spop dept1 #移除随机成员 "cc" 127.0.0.1:6379> srem dept1 wangwu #移除指定成员 (integer) 1 127.0.0.1:6379> smembers dept1 1) "bb" 2) "zhouliu" 3) "zhangsan" 4) "lisi" 5) "aa" 127.0.0.1:6379> smove dept2 destdept qianqi #移除指定成员到指定目标set (integer) 1 127.0.0.1:6379> smembers dept2 1) "bb" 2) "zhaoba" 3) "lisan" 4) "wanger" 5) "aa" 127.0.0.1:6379> smembers destdept 1) "qianqi" #差集 127.0.0.1:6379> clear 127.0.0.1:6379> sdiff dept1 dept2 #返回第一个集合与其他集合之间的差异 1) "lisi" 2) "zhouliu" 3) "zhangsan" 127.0.0.1:6379> sdiffstore destdept dept1 dept2 (integer) 3 127.0.0.1:6379> smembers destdept 1) "lisi" 2) "zhouliu" 3) "zhangsan" #交集 127.0.0.1:6379> sinter dept1 dept2 1) "bb" 2) "aa" 127.0.0.1:6379> sinterstore destdept dept1 dept2 (integer) 2 127.0.0.1:6379> smembers destdept 1) "bb" 2) "aa" #并集 127.0.0.1:6379> sinterstore destdept dept1 dept2 (integer) 2 127.0.0.1:6379> smembers destdept 1) "bb" 2) "aa" 127.0.0.1:6379> sunion dept1 dept2 1) "bb" 2) "zhouliu" 3) "zhangsan" 4) "zhaoba" 5) "lisi" 6) "wanger" 7) "lisan" 8) "aa" 127.0.0.1:6379> sunionstore destdept dept1 dept2 (integer) 8 127.0.0.1:6379> smembers destdept 1) "bb" 2) "zhouliu" 3) "zhangsan" 4) "zhaoba" 5) "lisi" 6) "wanger" 7) "lisan" 8) "aa" #查询 127.0.0.1:6379> scard dept1 #获取集合的成员数 (integer) 5 127.0.0.1:6379> sismember dept1 lisi #判断指定元素是否是集合的成员 (integer) 1 127.0.0.1:6379> smembers dept2 #查看集合中所有成员 1) "bb" 2) "zhaoba" 3) "lisan" 4) "wanger" 5) "aa" 127.0.0.1:6379> sscan dept2 0 match *a* #遍历集合中元素 1) "0" 2) 1) "zhaoba" 2) "lisan" 3) "wanger" 4) "aa" 127.0.0.1:6379> srandmember dept1 #集合中一个或多个随机数 "bb" 127.0.0.1:6379> srandmember dept1 "bb" 127.0.0.1:6379> srandmember dept1 "lisi" 127.0.0.1:6379> srandmember dept1 "aa"
应用场景
- 共同好友
- 利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐
zset(sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
将Set中的元素增加一个权重参数score,元素按score有序排列,数据插入集合时,已经进行天然排序
zset的成员是唯一的,但分数(score)却可以重复。
Redis ZSet命令
##############追加#################### 127.0.0.1:6379> zadd zset 1 member1 (integer) 1 127.0.0.1:6379> zadd zset 2 member2 (integer) 1 127.0.0.1:6379> zadd zset 3 member3 (integer) 1 127.0.0.1:6379> zadd zset 4 member4 (integer) 1 127.0.0.1:6379> zadd zset 7 member7 5 member5 6 member6 ##############查看成员#################### 127.0.0.1:6379> zrange zset 0 -1 #通过索引查找 1) "member1" 2) "member2" 3) "member3" 4) "member4" 5) "member5" 6) "member6" 7) "member7" 127.0.0.1:6379> zrange zset 0 4 1) "member1" 2) "member2" 3) "member3" 4) "member4" 5) "member5" 127.0.0.1:6379> zrangeBylex zset - + #通过字典区查找 1) "member1" 2) "member2" 3) "member3" 4) "member4" 5) "member5" 6) "member6" 7) "member7 127.0.0.1:6379> zrangeBylex zset - [member3 1) "member1" 2) "member2" 3) "member3" " 127.0.0.1:6379> zrangeBylex zset - (member4 1) "member1" 2) "member2" 3) "member3" 127.0.0.1:6379> zrangeBylex zset (member2 (member4 1) "member3" 127.0.0.1:6379> zrangeByscore zset -inf +inf #通过分数查找 1) "member1" 2) "member2" 3) "member3" 4) "member4" 5) "member5" 6) "member6" 7) "member7" 127.0.0.1:6379> zrangeByscore zset 1 5 1) "member1" 2) "member2" 3) "member3" 4) "member4" 5) "member5" 127.0.0.1:6379> zrangeByscore zset (1 5 1) "member2" 2) "member3" 3) "member4" 4) "member5" ##############查看成员数#################### 127.0.0.1:6379> zcard zset #获取集合的成员数 (integer) 7 127.0.0.1:6379> zcount zset 1 5 #根据分数区间获取成员数 (integer) 5 127.0.0.1:6379> zlexcount zset [member1 (member5 #根据字典区间获取成员数 (integer) 4 127.0.0.1:6379> zlexcount zset - + (integer) 7 ############查看成员分数################## 127.0.0.1:6379> zscore zset member1 #指定成员的分数 "1" 127.0.0.1:6379> zincrby zset 1 member1 #指定成员的分数加上增量 increment "2" 127.0.0.1:6379> zincrby zset 10 member1 "12" ##############排序#################### 127.0.0.1:6379> zrevrange zset 0 -1 #指定索引区间,获取成员,根据分数降序 1) "member7" 2) "member6" 3) "member5" 4) "member4" 5) "member3" 6) "member2" 7) "member1" 127.0.0.1:6379> zrevrange zset 0 4 1) "member7" 2) "member6" 3) "member5" 4) "member4" 5) "member3" 127.0.0.1:6379> zrevrangebyscore zset +inf -inf #指定分数区间,获取成员,根据分数降序 1) "member7" 2) "member6" 3) "member5" 4) "member4" 5) "member3" 6) "member2" 7) "member1" 127.0.0.1:6379> zrevrangebyscore zset 4 0 1) "member4" 2) "member3" 3) "member2" 4) "member1" ############## 索引 #################### 127.0.0.1:6379> zrevrank zset member3 #获取指定成员的索引,根据分数降序 (integer) 4 127.0.0.1:6379> zrank zset member3 #获取指定成员的索引,根据分数升序 (integer) 2 ############## 移除 #################### 127.0.0.1:6379> zrem zset member1 member3 #移除指定成员 (integer) 2 127.0.0.1:6379> zrange zset 0 -1 1) "member2" 2) "member4" 3) "member5" 4) "member6" 5) "member7" 127.0.0.1:6379> zremrangebylex zset [member2 (member5 #移除 指定字典(成员)区间 (integer) 2 127.0.0.1:6379> zrange zset 0 -1 1) "member5" 2) "member6" 3) "member7" 127.0.0.1:6379> zremrangebylex zset - + (integer) 3 127.0.0.1:6379> zrange zset 0 -1 (empty array) 127.0.0.1:6379> zadd zset 1 value1 2 value2 3 value3 4 value4 5 value5 6 value6 7 value7 (integer) 7 127.0.0.1:6379> zremrangebyrank zset 2 5 #移除指定排名(索引)区间的成员 (integer) 4 127.0.0.1:6379> zrange zset 0 -1 1) "value1" 2) "value2" 3) "value7" 127.0.0.1:6379> zremrangebyrank zset 0 -1 (integer) 3 127.0.0.1:6379> zrange zset 0 -1 (empty array) 127.0.0.1:6379> zadd zset 1 value1 2 value2 3 value3 4 value4 5 value5 6 value6 7 value7 (integer) 7 127.0.0.1:6379> zrange zset 0 -1 1) "value1" 2) "value2" 3) "value3" 4) "value4" 5) "value5" 6) "value6" 7) "value7" 127.0.0.1:6379> zremrangebyscore zset 3 4 #移除指定分数区间的成员 (integer) 2 127.0.0.1:6379> zrange zset 0 -1 1) "value1" 2) "value2" 3) "value5" 4) "value6" 5) "value7" 127.0.0.1:6379> zremrangebyscore zset -inf +inf (integer) 5 127.0.0.1:6379> zrange zset 0 -1 (empty array) ############## 交集和并集 #################### 127.0.0.1:6379> zrange zset 0 -1 1) "value1" 2) "value2" 3) "value3" 4) "value4" 5) "value5" 6) "value6" 7) "value7" 8) "aa" 9) "bb" 127.0.0.1:6379> zrange zzset 0 -1 1) "value1" 2) "value2" 3) "value3" 4) "value4" 5) "value5" 6) "value6" 7) "value7" ZINTERSTORE destination numkeys key [key ...] destination:交集结果的新集合 numkeys:参与交集key的个数 127.0.0.1:6379> zinterstore destset 2 zzset zset #交集 (integer) 7 127.0.0.1:6379> zrange destset 0 -1 1) "value1" 2) "value2" 3) "value3" 4) "value4" 5) "value5" 6) "value6" 7) "value7" ZUNIONSTORE destination numkeys key [key ...] destination:并集结果的新集合 numkeys:参与并集key的个数 127.0.0.1:6379> zunionstore destunion 2 zset zzset #并集 (integer) 9 127.0.0.1:6379> zrange destunion 0 -1 1) "value1" 2) "value2" 3) "value3" 4) "aa" 5) "value4" 6) "bb" 7) "value5" 8) "value6" 9) "value7" ############## 遍历 #################### zscan key cursor [MATCH pattern] [COUNT count] cursor - 游标。 pattern - 匹配的模式。 count - 指定从数据集里返回多少元素,默认值为 10 。 127.0.0.1:6379> zscan zset 0 match *a* #从零开始遍历 匹配包含a字符的成员,返回成员和分数 1) "0" 2) 1) "value1" 2) "1" 3) "value2" 4) "2" 5) "value3" 6) "3" 7) "value4" 8) "4" 9) "value5" 10) "5" 11) "value6" 12) "6" 13) "value7" 14) "7" 15) "aa" 16) "8"
应用场景
- 排行榜
- 带权重的消息队列