(三)redis之五种数据结构篇连载中……

1.redis 有五种数据结构:

1).String:字符串

2).list:字符串列表

3).sorted set:有序字符串集合

4).hash:哈希

5).set:字符串集合

以上五种类型中,String 和 hash 是常用类型。

2.由于 redis 本身是 key-value 键值对数据存储,注意以下几点:

1).key 不要过长,最好不要超过1024个字节

2).key 也不要过短,比如:a,这样会降低 key 的可读性

3).key 最好有统一命名规范

3.redis 五种数据结构的使用

1).存储 String

说明:数据以二进制数据存储,字符串的 value 值最多可以容纳 512M 数据

命令:

$ ./bin/redis-cli #打开客户端

$ set company ibm #存值

$ get company #取值

$ getset company baidu #先取值后重设值

$ del company #删除

$ incr num #num键值增加1,若num不存在,则先初始化为0,再加1,若num不是数字则报错

$ decr num #num键值减掉1,若num不存在,则先初始化为0,再减1,若num不是数字则报错

$ incrby num 3 #num键值增加指定大小,若num不存在,则先初始化为0,再加指定大小,若num不是数字则报错

$ decrby num 3 #num键值减掉指定大小,若num不存在,则先初始化为0,再减指定大小,若num不是数字则报错

$ append num 5 #会在num后追加一个字符串5,若num不存在则先创建,然后把num赋值5

2).存储 hash

说明:String key 和 String value 的 Map 容器,可以存储很大容量的键值对数据

命令:

$ hset user username jack #定义hash键,存入第1个键值对

$ hset user password 123 #刚才定义的hash键,存入第2个键值对

$ hmset person name tom age 20 #定义hash键,一次存入多个键值对数据

$ hget user username #获取键user的username值

$ hmget user username password #获取hash键的多个键值对值

$ hgetall user #获取hash键中存储的所有键值对的键和值

$ hdel person name age #删除hash键中的多个键值对

$ del user #会删除整个hash键包括存储的键值对集合

$ hincrby person age 3 #给hash键中age属性增加3

$ hexists person name #判断hash键中是否存在name属性,返回1存在,0不存在

$ hlen person #获取hash键中存储的键值对个数

$ hkeys person #获取hash键的所有key

$ hvals person #获取hash键的所有value

3).存储 list

说明:ArrayList数组方式存储、LinkedList双向链表方式存储、双向链表中添加数据、双向链表中删除数据

命令:

$ lpush mylist a b c #从链表左侧依次添加数据

$ rpush mylist 1 2 3 #从链表右侧依次添加数据

$ lrange mylist 0 5 #查看链表列表,从0到5个,-1表示倒数第一个

$ lpop mylist #两端弹出,即把最左边的第一个元素移出掉

$ rpop mylist #两端弹出,即把最右边的第一个元素移出掉

$ llen mylist #获取链表中元素个数,返回整型数字,若链表不存在返回0

$ lpushx mylist x #若链表存在,则向链表头部插入x

$ rpushx mylist x #若链表存在,则向链表尾部插入x

$ lrem mylist 1 x #移出1个为x的元素,若个数为0,则从头遍历,为负数从尾部遍历

$ lset mylist 2 y #在链表的第二个角标插入一个值

$ linsert mylist before a aa #在链表头部的a值之前添加aa

$ linsert mylist after a bb #在链表头部的a值之后添加bb

$ rpoplpush mylist1 mylist2 #将mylist1右边第一个元素弹出压入到mylist2的头部

redis中,执行rpop的称之为消费者,执行lpush的称之为生产者,当rpop执行时可能会发生信息丢失,所以会结合这两者进行信息备份放入到主消息队列中,以便其他消费者使用。

4).存储 set

说明:可以看作没有经过排序的字符串集合,和 list 不同的是,set 中不允许出现重复的元素,set 可包含的容量很大。

命令:

$ sadd myset1 a b c #向set中依次添加元素

$ srem myset1 a #删除set中指定元素

$ smembers myset1 #查看set中所有元素

$ sismember myset1 a #判断set中是否存在某个元素,返回1表示存在,0不存在

$ sdiff myset1 myset2 #set的差集运算,即返回两个集合中相差的成员元素

$ sinter myset1 myset2 #set的交集运算,即返回两个集合中相交的成员元素

$ sunion myset1 myset2 #set的并集运算,即返回两个集合去掉重复,合并后的元素

$ scard myset1 #set中成员元素的数量

$ srandmember myset1 #随机返回set中的一个成员元素

$ sdiffstore newset myset1 myset2 #把myset1和myset2中相差的元素存入newset中

$ sinterstore newset myset1 myset2 #把myset1和myset2中相交的元素存入newset中

$ sunionstore newset myset1 myset2 #把myset1和myset2中并集的元素存入newset中

使用场景:可以使用 set 跟踪具有唯一性的数据,比如:访问某一博客的唯一ip地址信息,数据对象的关联关系。

5).存储 sorted set

说明:可以看作是经过排序的字符串集合,和set一样不允许成员重复,另外 sorted set 中每一个元素都有其对应的分数(分数可重复),以便redis对成员的排序。由于 sorted set中所有元素都有顺序,所以查找其中一个也是非常高效的。

命令:

$ zadd mysort 60 a 70 b 80 c #新增一个sorted set,数字代表分数,a、b、c代表成员本身

$ zscore mysort a #获取某个成员的分数

$ zcard mysort #获取sorted set的成员个数

$ zrem mysort b c #删除sorted set中某个成员,可以删除多个

$ zrange mysort 0 -1 #范围查找成员

$ zrange mysort 0 -1 withscores #范围查找成员及其对应的分数,分数默认从小到大排序

$ zrevrange mysort 0 -1 withscores #范围查找成员及其对应的分数,分数按照从大到小排序

$ zremrangebyrank mysort 0 2 #按照排名范围删除

$ zremrangebyscore mysort 50 60 #按照分数范围删除

$ zremrangebyscore mysort 0 100 withscores limit 0 2 #返回分数在某个范围的成员,并按照分数从低到高的顺序排序,然后取指定范围成员

$ zincrby mysort 10 a #a成员增加10分

$ zscore mysort a #再次查看a的分数

$ zcount mysort 50 100 #获取分数在某个范围的成员个数

使用场景:游戏排名、构建索引数据、微博的热点话题等。

4.redis keys 的通用操作

$ keys * #所有key的查看

$ keys my? #查看所有以my开头的key

$ del mysort mysort2 #删除指定的key,可同时删除多个

$ exists mysort #判断某个key是否存在,存在返回1,否则返回0

$ rename mysort3 newsort #为key重命名

$ expire newsort 60 #为key设置过期时间,单位秒

$ ttl newsort #查看key所剩的过期时间,返回单位秒,若该key未设置过期时间返回-1

$ type newsort #获取指定key的类型

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180320G0G7T400?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券