搜索
您的当前位置:首页正文

redis五种数据类型

来源:好走旅游网
redis五种数据类型

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 0OK

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 -11) \"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 -11) \"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 -11) \"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 -11) \"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 dept11) \"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 dept21) \"bb\"

2) \"zhaoba\"3) \"lisan\"4) \"wanger\"5) \"aa\"

127.0.0.1:6379> smembers destdept1) \"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 destdept1) \"lisi\"2) \"zhouliu\"3) \"zhangsan\"

#交集

127.0.0.1:6379> sinter dept1 dept21) \"bb\"2) \"aa\"

127.0.0.1:6379> sinterstore destdept dept1 dept2(integer) 2

127.0.0.1:6379> smembers destdept1) \"bb\"2) \"aa\"

#并集

127.0.0.1:6379> sinterstore destdept dept1 dept2(integer) 2

127.0.0.1:6379> smembers destdept1) \"bb\"2) \"aa\"

127.0.0.1:6379> sunion dept1 dept21) \"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 destdept1) \"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 41) \"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 - (member41) \"member1\"

2) \"member2\"3) \"member3\"

127.0.0.1:6379> zrangeBylex zset (member2 (member41) \"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 51) \"member1\"2) \"member2\"3) \"member3\"4) \"member4\"5) \"member5\"

127.0.0.1:6379> zrangeByscore zset (1 51) \"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 41) \"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 01) \"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 -11) \"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 -11) \"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 -11) \"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 -11) \"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 -11) \"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 -11) \"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 -11) \"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 -11) \"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 -11) \"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\"

应⽤场景

排⾏榜

带权重的消息队列

因篇幅问题不能全部显示,请点此查看更多更全内容

Top