Redis中的数据结构

五种数据类型:
  • 字符串( String )
  • 哈希( hash )
  • 字符串列表( list )
  • 字符串集合( set )
  • 有序字符串集合( sorted set )

字符串( String ):

介绍:
  1. 二进制安全的,存入和获取的数据相同
  2. Value最多可以容纳的数据长度是512M。

常用命令:
  1. 赋值:set key value
    例如:set company cc
  2. 取值:get  key
    例如:get cc
  3. 先取值再赋值:getset key value
    例如:getset company baidu:先获取值(cc),在设置为(baidu),再次查看是指为baidu.
  4. 数值递增:incr key 
    比如:incr num 即先将num初始为0,在加1,获取之后为1,再次incr num,获取之后为2. 
    如果是字符串,不能累加,否则将会抛出异常 比如:incr company.
  5. 数值减:decr key
    比如:decr num 之前为2,递减之后为1,获取为1。如果没有这个值,则会初始为0,之后递减为-1,获得-1。同样,如果是字符串,不能递减,否则报错。
  6. 删除:del key
    比如:del company ,
    nil:表示该值不存在
扩展命令:
  1. incrby key num:可以让指定key的value增加几,如果这个key不存在,设置为0再加,字符不能转成整型,将会抛出异常。
    例如: incrby num 5 之前num的值是1,加5之后,获得为6 。incrby xx 5 没有xx这个值,将会初始为0,在加5,获取为5.
  2. decrby key num:可以让指定key的value减少几,如果这个key不存在,设置为0再减,字符不能转成整型,将会抛出异常。
    例如:decrby num 3 之前为6,减3之后,获取为3 。decrby num4 5 没有这个值,初始为0,0减5之后,获取为-5.
  3. append key value拼凑字符串,如果这个key存在,就会在原有的value后,追加这个值。如果不存在,就会创建一个新的key-value.
    比如:append num  3,因为之前num为5,会在5的后面追加字符串3,新值为53。如果key原来不存在就会直接创建一个字符value。




哈希( Hash ):

介绍:
  1. String Key 和 String Value的map容器
  2. 每一个Hash可以存储4294967295个键值对 

常用命令:
  1. 存储单个:hset 容器名 键 值;
  2. 存储多个:hmset 容器名 键 值 键 值 …
    例如:
    hmset hash name lisi password  hahaha
  3. 单个取值:hget 容器名 键;
  4. 多个取值:hmget 容器名 键 键 …
  5. 取全:hgetall 容器名 获取map容器中所有使用的key和value
    例如:hgetall hash,则会返回:name,lisi,password,hahaha
  6. 删除某一个key以及对应的valuehdel 容器名 键...
  7. 全删此容器下所有的key和value:del 容器名
  8. 增指定值:hincrby 容器名 键 [integer](这个integer表示增值,一定是整数)
    例如:hincrby hash num 3
  9. 判断存在:hexists 名称 键 
  10. 键值对数量:hlen 名称
  11. 取所有键:hkeys 名称
  12. 取所有值:hvals 名称




字符串列表( List ):

介绍:
  1. ArrayList使用数组方式:根据索引去查询速度非常快,但是新增与删除元素时需要涉及到位移操作,效率比较低
  2. LinkedList使用双向链接方式:每个元素都记录了前后元素的指针,插入和删除数据时,只是改变了前后元素指针所指向的元素,速度快。

总览:
  • 左推入:lpush list-name (data)+   
  • 右推入:rpush list-name (date)+   
  • 当队列存在时左推入:lpushx list-name (data)+  
  • 当队列存在时右推入:rpushx list-name (data)+
  • 显示:lrange list-name begin-indedx end-index
  • 左弹出:lpop list-name 
  • 右弹出:rpop list-name 
  • 显示长度:llen list-name 
  • 队列存在时左推入:lpushx list-name (data)+   
  • 队列存在时右推入:rpushx list-name (data)+
  • 删除指定值的元素:lrem list-name count value
  • 指定下标设置元素:lset list-name index value
  • 在指定元素前插入元素:linsert list-name before exists-value new-value 
  • 在指定元素后插入元素:linsert list-name after exists-value new-value 
  • 将一个队列的值弹出并推入另一个队列中:rpoplpush list-name1 list-name2 

详细:
  • lpush:左侧插入
    如:lpush mylist1 a b c 返回3(实际排列:c b a)表示是数量,然后继续 lpush mylist1 1 2 3 返回6
    (实际排列:3 2 1 c b a )
  • rpush:右侧插入
    如:rpush mylist2 a b c (实际排列:a b c),rpush mylist2 1 2 3 (实际排列:a b c 1 2 3
  • lrange:查看列表,从哪开始到哪结束(必须是从左到右)
    0:表示链表头部(左起)的第一个元素,如:lrange mylist1 0 5,返回:3,2,1,c,b,a.
    -1:表示链表的尾部第一个元素,lrange mylist1 0 -1,返回:3,2,1,c,b,a
    -2:表示链表的尾部第二个元素,lrange mylist1 0 -2,返回:3,2,1,c,b.
    必须是从左到右:lrange mylist1 -2 -1,返回:b,a(即从倒数第二个到倒数第一个)
    lrange mylist1 -1 -2,返回:错误(不可以从右往左查看)
  • lpop:左弹出
    它会返回并弹出指定链表名所关联的那个链表中的第一个元素,不存在返回nil
    如:lpop mylist1,弹出3,弹出之后,里面就没有这个元素了,lrange mylist 0 -1,返回的结果中,不在在3这个元素了,返回:2,1,c,b,a。
  • rpop:右弹出
    如rpop mylist2,弹出3,弹出之后,lrange mylist2 0 -1,查看,这个元素已经不存在了。
  • llen:获取列表中的元素个数
    如果这个列表不存在,则返回0,如:llen mylist1,返回5.
  • lpushx: 仅当我们参数中指定的key存在时,可以向关联的list的头部去插入一个值,如果不存在,就不会进行插入,返回0
    如:lpushx mylisy1 x,表示将x插入到链表的头部,lrange mylist 0 -1,可以看到新插入的元素。
  • rpushx:仅当我们参数中指定的key存在时,可以向关联的list的尾部去插入一个值,如果不存在,就不会进行插入,返回0
    如:rpushx mylist2 y ,表示向mylist2列表的尾部插入一个元素y,lrange mylist2 0 -1,查看,可以看到y元素在最后面。
  • lrem:先写上具体的一个链表名,后面再跟上一个count,value。它会删除count个值为value的元素。( lrem <listname> <count> <value> )
    • 如果count大于0,它就会从头向尾遍历,并删除count个为value的元素,
    • 如果count小于0,它会从后面向前面遍历,并删除count个为value的元素
    • 如果count等于0,则删除链表中所有等于value的元素。
      如:lrem mylist1 1 3, 表示从头到尾删除列表中的1个3.
      lrem mylist2 -1 2,表示从后面向前删除1个2.
      lrem mylist2 0 2,表示删除mylist2中的所有2
  • lset: 来设置列表中的某个index的角标的元素的值(下标必须是存在的,不然会下标溢出)
    • 0表示第一个元素,
    • -1表示最尾的元素。
      我们可以操作链表的角标,如果不存在,就抛出异常。
      如:原来的mylist1中现在是:a,b,c,这时候 lset mylist1 0 ok,表示将链表mylist1的第一个值替换为ok. mylist1中现在是:ok,b,c,如果lset mylist1 3 bad,即设置第四个为bad,但是第四个值是不存在的,所以会报错.
  • linsert: 在某个元素的前或后插入某个元素( linsert <listname> [before/afert] <value> <new value> )
    如:linsert mylist1 before b 11,表示在mylist1链表中的b之前插入11。
    linsert mylist1 after b 22,表示在mylist4链表中的b后面插入22
  • rpoplpush: 将第一个链表中的尾部元素弹出,并添加第二个链表的头部
    ( rpoplpush <listname1> <listname2> )

应用场景:
当存在一个消费队列时,可以想象成外卖订单的队列,每一次送餐员都从这个队列中pop一份外卖,但送餐的途中一旦出现问题就需要重做,但是此时外卖订单队列中的值却无法恢复了,所以我们可以再设置一个备份队列,rpoplpush 外卖订单队列 备份队列
此时每一个从外卖订单队列中pop出的外卖都会添加到备份队列中,当送餐员送完餐后,再将这个从备份队列中删除这个值。我们可
外卖订单队列中,由下一个送餐员继续送。




字符串集合( Set ):

介绍:
  • 存储Set 和list类型不同 ,set集合中不允许出现重复元素和java hashSet 差不多
  • set 可包含的最大元素数量是4294967295

命令:
  1. 添加:sadd 集合名 [值...]
  2. 删除:srem 集合名 [值...]
  3. 查看:smembers 集合名
  4. 查看是否存在:sismember 集合名 值,1表示存在,0表示不存
  5. 差集(A与B的差集表示所有属于A且不属于B的元素构成的集合):sdiff 集合名1 集合名2 (与顺序有关)
  6. 交集:sinter 集合名1 集合名2
  7. 并集:sunion 集合名1 集合名2
  8. 查看集合中元素数量:scard 集合名
  9. 随机查:srandmember 集合名
  10. 将差集存到新集合中:sdiffstore 新集合名 集合名1 集合名2
  11. 将交集存到新集合中:sinterstore 新集合名 集合名1 集合名2
  12. 将并集存到新集合中:sunionstore 新集合名 集合名1 集合名2




有序字符串集合( Sorted-Set ):

介绍:
  • 可存储有序但不重复的数据,每个元素都有一个分数与之对应,靠分数来排序。
  • 因为元素有序,所以访问高效

命令:
  1. 存储:zadd 集合名 [分数 值]...
    例如:zadd 
    mysort 70 aa 80 bb,此时如果zadd mysort 50 aa,则会覆盖原来aa的分数
  2. 查分数:zscore 集合名 值
  3. 查数量:zcard 集合名
  4. 单点删除(但是值可以写多个):zrem 集合名 值...
  5. 范围删除:zremrangebyrank 集合名 [begin,end]
    例如:zremrangebyrank 
    mysort 0 2,删除下标从0到2的三个元素
  6. 升序查值:zrange 集合名 [begin,end] <withscores>(两者可为正负数,-1表示最后一个值)(withscores带分数,可选项)
    例如:zrange mysort 0 -1 withscores
  7. 降序查值:zrevrange 集合名 [begin,end] <withscores>(两者可为正负数,-1表示最后一个值)(withscores带分数,可选项)
  8. 分数查值:zrangebyscore 集合名 [begin,end] <withscores>
    例如:zrangebyscore 
    mysort 70 80,表示查找分数在70和80之间的值
  9. 分页查值:zrangebyscore 集合名 [begin,end] <withscores limit [offset count]>
    例如:zrangebyscore mysort 0 100 withscores limit 0 2,这里分页指从下标0开始的2个元素
    zrangebyscore mysort 0 100 withscores limit 1 2,这里分页指从下标1开始的2个元素
  10. 为某个元素增加分数:zincrby  集合名  addnum 值
    例如:zincrby mysort 3 aa,则aa的分数由原来的50变为53
  11. 显示分数区间内元素个数:zcount 集合名 [begin,end]
    例如:zcount mysort 80 90//显示80到90分的元素个数

使用场景:
  1. 游戏的排名,每次游戏动作后,更新玩家对应的分数,然后redis会自动排名
  2. 微博的热点
  3. 构建索引数据



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值