• Redis 基础数据结构


    string (字符串)

    是一种键值对的数据结构,定义一个唯一的key值来获取相应的value数据。

    > set name codehole
    OK
    > get name
    "codehole"
    > exists name
    (integer) 1
    > del name
    (integer) 1
    > get name
    (nil)
    
    批量操作
    > set name1 codehole
    OK
    > set name2 holycoder
    OK
    > mget name1 name2 name3 # 返回一个列表
    1) "codehole"
    2) "holycoder"
    3) (nil)
    > mset name1 boy name2 girl name3 unknown
    > mget name1 name2 name3
    1) "boy"
    2) "girl"
    3) "unknown"
    

    可以对 key 设置过期时间,到点自动删除,这个功能常用来控制缓存的失效时间。

    > set name codehole
    > get name
    "codehole"
    > expire name 5  # 5s 后过期
    ...  # wait for 5s
    > get name
    (nil)
    
    > setex name 5 codehole  # 5s 后过期,等价于 set+expire
    > get name
    "codehole"
    ... # wait for 5s
    > get name
    (nil)
    
    > setnx name codehole  # 如果 name 不存在就执行 set 创建
    (integer) 1
    > get name
    "codehole"
    > setnx name holycoder
    (integer) 0  # 因为 name 已经存在,所以 set 创建不成功
    > get name
    "codehole"  # 没有改变
    

    如果 value 值是一个整数,还可以对它进行自增操作

    > set age 30
    OK
    > incr age
    (integer) 31
    > incrby age 5
    (integer) 36
    > incrby age -5
    (integer) 31
    

    list(列表)

    相当于java里面的LinkedLis,意味着list的插入和删除非常快,但是索引定位很慢。

    右边进左边出:队列

    > rpush books python java golang
    (integer) 3
    > llen books
    (integer) 3
    > lpop books
    "python"
    > lpop books
    "java"
    > lpop books
    "golang"
    > lpop books
    (nil)
    

    右边进右边出:栈

    > rpush books python java golang
    (integer) 3
    > rpop books
    "golang"
    > rpop books
    "java"
    > rpop books
    "python"
    > rpop books
    (nil)
    

    lindex,lrange,ltrim
    lindex相当于java链表的get(int index)方法,性能随着参数index增大而变差
    lrange是获取范围内的数据
    ltrim是保留这个list范围里面的数据,范围外的丢弃

    > rpush books python java golang
    (integer) 3
    > lindex books 1  # O(n) 慎用
    "java"
    > lrange books 0 -1  # 获取所有元素,O(n) 慎用
    1) "python"
    2) "java"
    3) "golang"
    > ltrim books 1 -1 # O(n) 慎用
    OK
    > lrange books 0 -1
    1) "java"
    2) "golang"
    > ltrim books 1 0 # 这其实是清空了整个列表,因为区间范围长度为负
    OK
    > llen books
    (integer) 0
    

    hash(字典)
    这个数据结构相当于java里面的HashMap,它是无序的。内部实现是使用了数组+链表二维结构。如果发生hash碰撞的时候,就会将碰撞的元素使用链表串接起来。并且redis的字典的vlaue值只能是字符串。

    redis的字典在rehash的时候采用了渐进式策略,在rehash同时,会保留两个新旧hash结构,查询时会同时查询两个hash结构,然后再后续的定时任务中以及hash操作指令中,循序渐进地将旧 hash 的内容一点点迁移到新的 hash 结构中。当搬迁完成了,就会使用新的hash结构取而代之。

    > hset books java "think in java"  # 命令行的字符串如果包含空格,要用引号括起来
    (integer) 1
    > hset books golang "concurrency in go"
    (integer) 1
    > hset books python "python cookbook"
    (integer) 1
    > hgetall books  # entries(),key 和 value 间隔出现
    1) "java"
    2) "think in java"
    3) "golang"
    4) "concurrency in go"
    5) "python"
    6) "python cookbook"
    > hlen books
    (integer) 3
    > hget books java
    "think in java"
    > hset books golang "learning go programming"  # 因为是更新操作,所以返回 0
    (integer) 0
    > hget books golang
    "learning go programming"
    > hmset books java "effective java" python "learning python" golang "modern golang programming"  # 批量 set
    OK
    

    set (集合)

    它内部的键值对是无序的唯一的。它的内部实现相当于一个特殊的字典,字典中所有的 value 都是一个值NULL。

    > sadd books python
    (integer) 1
    > sadd books python  #  重复
    (integer) 0
    > sadd books java golang
    (integer) 2
    > smembers books  # 注意顺序,和插入的并不一致,因为 set 是无序的
    1) "java"
    2) "python"
    3) "golang"
    > sismember books java  # 查询某个 value 是否存在,相当于 contains(o)
    (integer) 1
    > sismember books rust
    (integer) 0
    > scard books  # 获取长度相当于 count()
    (integer) 3
    > spop books  # 弹出一个
    "java"
    

    zset (有序集合)

    一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个 value 赋予一个 score,代表这个 value 的排序权重。它的内部实现用的是一种叫做「跳跃列表」的数据结构。

    > zadd books 9.0 "think in java"
    (integer) 1
    > zadd books 8.9 "java concurrency"
    (integer) 1
    > zadd books 8.6 "java cookbook"
    (integer) 1
    > zrange books 0 -1  # 按 score 排序列出,参数区间为排名范围
    1) "java cookbook"
    2) "java concurrency"
    3) "think in java"
    > zrevrange books 0 -1  # 按 score 逆序列出,参数区间为排名范围
    1) "think in java"
    2) "java concurrency"
    3) "java cookbook"
    > zcard books  # 相当于 count()
    (integer) 3
    > zscore books "java concurrency"  # 获取指定 value 的 score
    "8.9000000000000004"  # 内部 score 使用 double 类型进行存储,所以存在小数点精度问题
    > zrank books "java concurrency"  # 排名
    (integer) 1
    > zrangebyscore books 0 8.91  # 根据分值区间遍历 zset
    1) "java cookbook"
    2) "java concurrency"
    > zrangebyscore books -inf 8.91 withscores # 根据分值区间 (-∞, 8.91] 遍历 zset,同时返回分值。inf 代表 infinite,无穷大的意思。
    1) "java cookbook"
    2) "8.5999999999999996"
    3) "java concurrency"
    4) "8.9000000000000004"
    > zrem books "java concurrency"  # 删除 value
    (integer) 1
    > zrange books 0 -1
    1) "java cookbook"
    2) "think in java"
    
  • 相关阅读:
    【Silverlight】Bing Maps系列文章汇总
    《MEF程序设计指南》博文汇总
    Flash中各种图形的绘制
    Bing Maps开发扩展二:基于Oracle Spatial的空间数据分析
    Bing Maps开发扩展三:Bing Maps中渲染ESRI SHP空间数据
    Spring Cloud Gateway
    Spring Cloud Gateway 整合 nacos
    Spring Cloud Gateway 断言(Predicate) (hoxton 版本)
    Python和Node.js支持尾递归吗?
    用OpenCv来做人脸识别
  • 原文地址:https://www.cnblogs.com/luozhiyun/p/10880722.html
Copyright © 2020-2023  润新知