Redis的数据结构 - 五种数据类型
Redis是key-value键值对的数据库,比较常用:字符串String、哈希hash
key定义注意
-
不要太长(最好<1024字节)
- 否则消耗内存、降低查找效率
-
不要过短
- 否则降低可读性
-
项目中统一命名规范
字符串String
-
二进制安全的,存入和获取的数据相同
-
Value最多可以容纳的数据长度是512M
常用命令:
-
赋值
get company id1 (给company赋值为1) getset company baidu (先获取company的值(会输出),再变为 baidu )
-
删除
del company (del key的名字,出现 (integer)1 说明删除成功)
-
取值
get company (会输出 “id1” ,输出 (nil) 表示该值不存在 )
-
数值增减
incr/decr key (把指定key的value加1/减1)
-
扩展命令
incrby/decrby key x (把指定key的value加x/减x) append str 7 拼接字符串 (在str的value后去拼接字符串7,操作成功后返回的 (integer)3 ,3是字符串的长度)
字符串列表List
存储list数据:
-
ArrayList使用数组方式
- 所以根据索引去查询速度非常快、
- 增加、删除操作比较慢
-
LinkedList使用双向链接方式
- 插入、删除速度快
- 双向链表中增加数据
-
双向链表中增加数据
-
双向链表中删除数据
存储list常用命令:
-
两端添加
lpush mylist1 a b c 从左侧添加数据顺序cba,回车输出的是长度 rpush mylist2 1 2 3 从右侧添加数据
-
查看链表
lrange mylist 开始位置 结束位置 开始和结束的位置可以写0(第一个元素)、-1(链表尾部元素)、-2(链表倒数第二个元素)
-
两端弹出
lpop mylist 左边弹出链表头部元素,返回的是链表头部元素,不存在返回nil rpop mylist
-
获取列表中元素个数
llen mylist
-
扩展命令
lpushx mylist x 往已存在的链表头部插入一个值,没有元素的话插入后回车是0(可以是 x21bc 这样的链表) rpush mylist x 链表最后插入x lrem mylist count value 删除count个值为value的元素,如果count>0则从前往后遍历删除,count<0从后往前遍历删除,count=0删除所有值为value的元素 linsert mylist before/after b 15 在第一个元素b前面/后面插入15 rpoplpush mylist1 mylist2 mylist1尾部元素弹出添加到mylist2头部
有序字符串集合Sorted-Set
存储Sorted-Set
-
不允许重复元素
-
Sorted-Set和Set的区别
+Sorted-Set都会有一个分数与之关联,元素唯一,分数可以重复。
删除、添加、更新很快速,时间复杂度为个数的对数。- Sorted-Set中的成员在集合中的位置是有序的。
Sorted-Set应用场景:
-
大型在线游戏积分排行榜
-
微博热点话题
-
构建索引数据
存储Sorted-Set常用命令:
-
添加元素
zadd mysort 70 zs 80 ww 返回的是所存元素个数 zadd mysort 100 zs 原来存在的的会有新的100替换原来的,返回的是0因为原来存在过zs zadd mysort 11 tom 返回1(而不是3)
-
获得元素
zscore mysort zs 获得成员分数(返回100) zcard mysort 获得成员数量(返回3)
-
删除元素
zrem mysort tom 删除tom
-
范围查询
zrange mysort 0 -1 (-1是最后一个元素)(该语句不显示分数) zrange mysort 0 -1 withscores (返回元素和分数)(分数由小到大排) zrevrange mysort 0 -1 withscores (返回元素和分数)(分数由大到小排) zremrangebyrank mysort 0 4 按照排名范围进行删除 zremrangebyscore mysort 80 100 按照分数范围(80~100)进行删除
-
扩展命令
zrangebyscore mysort 80 100 withscores limit 0 2 返回分数在某个之间的成员并按照分数从低到高排序 只显示两个 zincrby mysort 3 zs 给zs分数加3(原来80) zscore mysort zs 可以看到zs的分数(83) zcount mysort 80 100 可以分数在80~100之间的个数
哈希hash
-
可以看做是 String Key 和 Sting Value 的map容器
-
每一个Hash可以存储4294967295个键值对
常用命令:
-
赋值
hset myhash name jack (myhash是获取的名字,后面两个是键值对) hset myhash age 12 这两行是单个赋值 hmset myhash name jack age 12 多个赋值
-
取值
hget myhash name (输出 “jack”) 得到单个属性的值 hget myhash name age( 输出 1)“jack” 2)“18” ) 得到多个属性的值 hgetall myhash (获取所有属性和属性值)
-
删除
hdel myhash name age 删除多个属性(出现0说明删除的字段不存在) del myhash 删除整个集合(再次hget会显示nil)
-
增加数字
hincreby myhash age 6 (年纪+6)
-
自学命令
hexists myhash name 断指定key中的某个属性是否存在(存在1,否则0) hlen 获取属性个数(有几个) hgetall myhash 获取所有属性名称和值 hkeys myhash 获取所有属性名 hvals myhash 获取所有值
字符串集合set
存储set:
-
和list不同的是:set集合不允许出现重复的元素
-
set可包含的最大元素数量书4294967295
存储set常用命令:
-
添加/删除元素
sadd myset a b c 添加a、b、c 再次add myset a 是不行的,输出0 srem myset b 删除元素b
-
获得集合中的元素
smembers myset 获得集合中的所有元素 sismember myset x 判断x是否在myset中,存在1,不存在0
-
集合中的差集运算
sdiff my1 my2 返回my2在my1中没有的元素
-
集合中的交集运算
sinter my1 my2 返回两个集合中都有的元素
-
集合中的并集运算
sunion my1 my2 合并两个元素(重复元素去掉)
-
扩展命令
scard myset 获得set中成员数量 srandmember myset 随机返回set中任意元素 sdiffstore my1 my2 my 把my2在my1中没有的元素存到my中 sinterstore my1 my2 my my1和my2的交集存到my中 sunionstore my1 my2 my my1和my2的并集存到my中
存储set使用场景
-
跟踪一些唯一性数据
-
用于维护数据对象之间的关联关系