首页 > 其他 > 详细

[19-3] Redis 数据类型

时间:2020-09-04 15:09:28      阅读:54      评论:0      收藏:0      [点我收藏+]

技术分享图片

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

常用操作

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

技术分享图片

技术分享图片

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
  • 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 是一个键值对集合
  • Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象
  • 类似 Java 里面的 Map<String, String>

存储 JavaBean

1. 用户 ID 为 key,value 为 JavaBean 序列化后的字符串
技术分享图片

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


2. {用户ID + 属性名} 作为 key,属性值作为 value
技术分享图片

缺点:用户 ID 数据冗余


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

技术分享图片

常用操作

  • hset <key> <field> <value> 给集合 key 中的键 field 赋值 value
  • 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 加上增量
  • hsetnx <key> <field> <value> 将集合 key 的 field 值设为 value,当且仅当 field 不存在

技术分享图片

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 实现一个文章访问量的排行榜?

技术分享图片

[19-3] Redis 数据类型

原文:https://www.cnblogs.com/liujiaqi1101/p/13613185.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!