zoukankan      html  css  js  c++  java
  • [03] Redis 数据类型

    Redis 基本指令

    • keys * 查询当前库的所有键
    • exists <key> 判断某个键是否存在
    • type <key> 查看键的类型
    • del <key> 删除某个键
    • expire <key> <seconds> 为键值设置过期时间,单位秒
    • ttl <key> 查看还有多少秒过期,-1 代表永不过期,-2 表示已过期
    • dbsize 查看当前数据库的 key 的数量
    • flushdb 清空当前库
    • flushall 通杀所有库

    string

    简述

    • string 是 Redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value
    • string 类型是二进制安全的。意味着 Redis 的 string 可以包含任何数据。比如 jpg 或者序列化的对象
    • string 类型是 Redis 最基本的数据类型,一个 Redis 中字符串 value 最多可以是 512M

    常用操作

    • 设置
      • set <key> <value> 添加键值对
      • setex <key> <过期时间> <value> 设置键值的同时,设置过期时间,单位秒
      • setnx <key> <value> 只有在 key 不存在时设置 key 的值
      • mset <key1> <value1> [<key2> <value2> ...] 同时设置 1 个或多个 key-value 对
      • msetnx <key1> <value1> [<key2> <value2> ...] 同时设置 1 个或多个 key-value 对,当且仅当所有给定 key 都不存在
    • 获取
      • get <key> 查询对应键值
      • mget <key1> [<key2> ...] 同时获取 1 个或多个 value
      • getset <key> <value> 以新换旧,设置了新值的同时获取旧值
      • strlen <key> 获取值的长度
      • getrange <key> <起始位置> <结束位置> 获取指定范围的值,类 Java 的 substring,但这里包前也包后
    • 修改
      • append <key> <value> 将给定的 value 追加到原值的末尾
      • incr <key> 将 key 中储存的数字值增 1,只能对数字值操作,如果为空,新增值为 1
      • decr <key> 将 key 中储存的数字值减 1,只能对数字值操作,如果为空,新增值为 -1
      • incrby / decrby <key> <步长> 将 key 中储存的数字值增减,自定义步长
      • setrange <key> <起始位置> <value> 用 value 覆写 key 所存储的字符串值,从起始位置开始

    incr 操作的原子性

    • 所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)
      • 在单线程中, 能够在单条指令中完成的操作都可以认为是" 原子操作",因为中断只能发生于指令之间。
      • 在多线程中,不能被其它进程(线程)打断的操作就叫原子操作。
    • Redis 单命令的原子性主要得益于 Redis 的单线程
    • Java 中的 i++ 是否是原子操作?不是

    list

    简述

    • 单键多值
    • Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
    • 底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差

    常用操作

    • lpush/rpush <key> <value1> <value2> ... 从左/右边插入 1 个或多个值
    • lpop/rpop <key> 从左/右边吐出一个值(值在键在,值光键亡)
    • rpoplpush <key1> <key2> 从 key1 列表右边吐出一个值插到 key2 列表左边
    • lrange <key> <start> <stop> 按照索引下标获得元素(从左到右)
    • lindex <key> <index> 按照索引下标获得元素(从左到右)
    • llen <key> 获得列表长度
    • linsert <key> before|after <value> <newValue> 在 value 的前|后面插入 newValue
    • ltrim <key> [索引1] [索引2] 截取 [索引1, 索引2] 范围的列表,重新赋值给 key
    • lrem <key> <n> <value> 删除 n 个 value
      • n > 0 从左往右删 n 个
      • n < 0 从右往左删 n 个
      • n = 0 删除全部

    set

    简述

    • Redis set 对外提供的功能与 list 类似是一个列表的功能,特殊之处在于 set 是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择,并且 set 提供了判断某个成员是否在一个 set 集合内的重要接口,这个也是 list 所不能提供的。
    • Redis set 是 string 类型的无序集合。它的底层其实是一个 value 为 null 的 hash 表,所以添加 / 删除 / 查找的复杂度都是 O(1)。

    常用操作

    • sadd <key> <value1> [<value2> ...] 将 1 个或多个 value 加入到集合 key 当中,已经存在于集合的 value 元素将被忽略
    • smembers <key> 取出该集合的所有值
    • sismember <key> <value> 判断集合 key 中是否含有指定 value 值;有则返回 1,没有返回 0
    • scard <key> 返回集合 key 的元素个数
    • srem <key> <value1> [<value2> ...] 删除集合 key 中指定的 value
    • spop <key> 随机从该集合中吐出一个值
    • srandmember <key> <n> 随机从该集合中取出 n 个值,不会从集合中删除
    • sinter <key1> <key> 返回两个集合的交集元素
    • sunion <key1> <key> 返回两个集合的并集元素
    • sdiff <key1> <key> 返回两个集合的差集元素

    hash

    简述

    • Redis hash 是一个键值对集合。K-V 模式不变,但 value 是一个键值对集合,类比 Map<String, String>
    • string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象

    存储 JavaBean

    1. 用户 ID 为 key,value 为 JavaBean 序列化后的字符串

    缺点:每次修改用户的某个属性需要,先反序列化改好后再序列化回去。开销较大


    2. {用户ID + 属性名} 作为 key,属性值作为 value

    缺点:用户 ID 数据冗余


    3. 通过 key(用户ID) + field(属性标签) 就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题

    常用操作

    • hset <key> <field> <value> 给集合 key 中的键 field 赋值 value
    • hsetnx <key> <field> <value> 将集合 key 的 field 值设为 value,当且仅当 field 不存在
    • hmset <key> <field1> <value1> [<field2> <value2> ...] 批量设置集合 key 的键值对
    • hget <key> <field> 从集合 key 中取出键 field 对应的 value
    • hexists <key> <field> 查看集合 key 中,给定 field 是否存在
    • hkeys <key> 列出集合 key 的所有 field
    • hvals <key> 列出集合 key 的所有 value
    • hincrby <key> <field> <increment> 为集合 key 中给定 field 的 value 加上增量

    zset(sorted set)

    简述

    • Redis 有序集合 zset 与普通集合 set 非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分(score) ,这个评分(score) 被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。// 以 value 为键,score 为值的 map
    • 因为元素是有序的,所以你也可以很快的根据评分(score) 或者次序(position) 来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。

    常用操作

    • zadd <key> <score1> <value1> [<score2> <value2> ...] 将 1 个或多个 value 及其 score 值加入到有序集 key 中
    • zrange <key> <start> <stop> [withscores]
      • 返回有序集 key 中,下标在 <start><stop> 之间的元素
      • withscores 的,可以让 score 和 value 一起返回到结果集
    • zrangebyscore key [(]min [(]max [withscores] [limit offset count]
      • 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max)的 value
      • 有序集 value 按 score 递增次序排列
      • ( 表示开区间
    • zrevrangebyscore key [(]max [(]min [withscores] [limit offset count] 同上,改为降序排列
    • zincrby <key> <increment> <value> 为 value 的 score 加上指定增量
    • zrem <key> <value> 删除该集合下,指定值的元素
    • zcount <key> <min> <max> 统计该集合中指定分数区间内的元素个数
    • zrank <key> <value> 返回 value 在集合中的排名,从 0 开始

    文章访问量的排行榜

    如何利用 zset 实现一个文章访问量的排行榜?

  • 相关阅读:
    【XXE学习】XML外部实体注入
    记一次解密wireshark抓取的冰蝎通信流量
    weblogicSSRF漏洞复现
    解决docker删除加载失败的镜像报错
    【vulapps】Sturcts2 S2-037RCE漏洞复现
    【XSS-labs】level 16-20
    解决docker-compose下载过慢
    【XSS-labs】Level 11-15
    【XSS-labs】level 6-10
    [PHP]用PHP自己写一个基于zoomeye的api(偷懒必备quq)
  • 原文地址:https://www.cnblogs.com/liujiaqi1101/p/13613185.html
Copyright © 2011-2022 走看看