Redis的数据结构

Redis是key-value键值对的数据库,比较常用:字符串String、哈希hash

key定义注意

  1. 不要太长(最好<1024字节)

    • 否则消耗内存、降低查找效率
  2. 不要过短

    • 否则降低可读性
  3. 项目中统一命名规范

字符串String

  1. 二进制安全的,存入和获取的数据相同

  2. Value最多可以容纳的数据长度是512M

常用命令:

  1. 赋值

    get  company  id1  (给company赋值为1)
    getset  company  baidu      (先获取company的值(会输出),再变为 baidu )
    
  2. 删除

    del  company      (del key的名字,出现  (integer)1 说明删除成功)
    
  3. 取值

    get  company       (会输出  “id1” ,输出 (nil) 表示该值不存在 )
    
  4. 数值增减

    incr/decr  key      (把指定key的value加1/减1)
    
  5. 扩展命令

    incrby/decrby  key  x      (把指定key的value加x/减x)
    append str 7  拼接字符串      (在str的value后去拼接字符串7,操作成功后返回的  (integer)3  ,3是字符串的长度)
    

字符串列表List

存储list数据:

  1. ArrayList使用数组方式

    • 所以根据索引去查询速度非常快、
    • 增加、删除操作比较慢
  2. LinkedList使用双向链接方式

    • 插入、删除速度快
    • 双向链表中增加数据
  3. 双向链表中增加数据

  4. 双向链表中删除数据

存储list常用命令:

  1. 两端添加

    lpush mylist1 a b c       从左侧添加数据顺序cba,回车输出的是长度
    rpush mylist2 1 2 3       从右侧添加数据
    
  2. 查看链表

    lrange mylist 开始位置 结束位置      开始和结束的位置可以写0(第一个元素)、-1(链表尾部元素)、-2(链表倒数第二个元素)
    
  3. 两端弹出

    lpop mylist     左边弹出链表头部元素,返回的是链表头部元素,不存在返回nil
    rpop mylist
    
  4. 获取列表中元素个数

    llen mylist
    
  5. 扩展命令

    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

  1. 不允许重复元素

  2. Sorted-Set和Set的区别

    +Sorted-Set都会有一个分数与之关联,元素唯一,分数可以重复。
    删除、添加、更新很快速,时间复杂度为个数的对数。

    • Sorted-Set中的成员在集合中的位置是有序的。

Sorted-Set应用场景:

  1. 大型在线游戏积分排行榜

  2. 微博热点话题

  3. 构建索引数据

存储Sorted-Set常用命令:

  1. 添加元素

    zadd mysort 70 zs 80 ww      返回的是所存元素个数
    zadd mysort 100 zs      原来存在的的会有新的100替换原来的,返回的是0因为原来存在过zs
    zadd mysort 11 tom      返回1(而不是3)
    
  2. 获得元素

    zscore mysort zs      获得成员分数(返回100)
    zcard mysort      获得成员数量(返回3)
    
  3. 删除元素

    zrem mysort tom       删除tom
    
  4. 范围查询

    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)进行删除
    
  5. 扩展命令

    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

  1. 可以看做是 String Key 和 Sting Value 的map容器

  2. 每一个Hash可以存储4294967295个键值对

常用命令:

  1. 赋值

    hset myhash name jack            (myhash是获取的名字,后面两个是键值对)  
    hset myhash age 12            这两行是单个赋值
    hmset myhash name jack age 12            多个赋值
    
  2. 取值

    hget myhash name   (输出 “jack”) 得到单个属性的值
    hget myhash name age(   输出 1)“jack”    2)“18”   )   得到多个属性的值
    hgetall myhash       (获取所有属性和属性值)
    
  3. 删除

    hdel myhash name age     删除多个属性(出现0说明删除的字段不存在)
    del myhash      删除整个集合(再次hget会显示nil)
    
  4. 增加数字

    hincreby myhash age 6  (年纪+6)
    
  5. 自学命令

    hexists myhash name   断指定key中的某个属性是否存在(存在1,否则0)
    hlen      获取属性个数(有几个)
    hgetall myhash      获取所有属性名称和值
    hkeys myhash       获取所有属性名
    hvals myhash       获取所有值
    

字符串集合set

存储set:

  1. 和list不同的是:set集合不允许出现重复的元素

  2. set可包含的最大元素数量书4294967295

存储set常用命令:

  1. 添加/删除元素

    sadd myset a b c      添加a、b、c
    再次add myset a 是不行的,输出0
    srem myset b      删除元素b
    
  2. 获得集合中的元素

    smembers myset      获得集合中的所有元素
    sismember myset x      判断x是否在myset中,存在1,不存在0
    
  3. 集合中的差集运算

    sdiff my1 my2      返回my2在my1中没有的元素
    
  4. 集合中的交集运算

    sinter my1 my2      返回两个集合中都有的元素
    
  5. 集合中的并集运算

    sunion my1 my2      合并两个元素(重复元素去掉)
    
  6. 扩展命令

    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使用场景

  1. 跟踪一些唯一性数据

  2. 用于维护数据对象之间的关联关系

原文地址:https://www.cnblogs.com/OFSHK/p/14342648.html