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的类型
领取专属 10元无门槛券
私享最新 技术干货