• 【Redis入门笔记 02】基础知识与常见数据类型


    redis

    ☕基础知识 & 八卦

    redis 创始人🧔叫萨尔瓦多·桑菲利波普 Salvatore Sanfilippo(Antirez),意大利人,比起各种名校 buff 加身的互联网大佬,redis 之父只进入了一所普通大学,甚至到了大三辍学去做了系统管理员,可能作者本人也没有想到他会对今天的互联网产生如此大的影响。

    redis 默认端口号是 63796379 在手机按键上是 “MERZ” 对应的号码,而 “MERZ” 取自意大利广告女郎 AlessiaMerz 的名字,据说创始人当时也没有多想,给 redis 选择端口号的时候直接就把 “MERZ” 对应的 6379 拿来用了。

    作为非关系型数据库(NoSQL),redis 存储方式非常简单,只支持 key-value 模式存储,有点像很多语言库函数里自带的 Map,不过 redis 在性能和功能上比 Map 强大的多。

    redis 究竟能干点啥呢?

    redis 主要是用来充当缓存用的,在需要高频访问数据的场景,redis 可以帮助传统的数据库减少 IO 操作,常见的场景比如:

    • 排行榜
    • 秒杀
    • 手机验证码
    • 发布订阅消息系统…

    总之就是数据不是很复杂,用不上关系型数据库,但又对速度有很高的要求,这个时候就该 redis 上场了。


    💻Redis 数据库基础命令

    redis 中默认有 16 个数据库(db[0] ~ db[15]),默认使用第一个数据库(db[0]),数据库的数量在配置文件中可以修改。

    进入数据库客户端 redis-cli 可以对数据库进行操作,这个是安装 redis 时自带的。

    1

    (redis 的命令不区分大小写,按下 Tab 键可以自动补全)

    1. 切换数据库:select 数字

      从默认数据库切换到数据库 3,再从数据库 3 切换回默认数据库。

      2

    2. 存储内容:set key value,redis 是 key-value 型数据库,数据库中的每一个数据都有一个 key 与其对应。

      向数据库中添加两个数据。
      3

      使用 get key 可以获取到 key 所对应的数据。

    3. 查看数据库中所有的 key:keys *

      目前数据库中有 “name” 与 “age” 两个 key。
      4

    4. 查看数据库的大小:DBSIZE
      5

    5. 清除当前数据库:flushdb

      清除数据库以后再次查看数据库大小和 key,会发现它们都为空。
      6

    6. 清除全部数据库:FLUSHALL

      分别向数据库 0 与数据库 3 添加两个数据,执行 FLUSHALL 会发现这两个数据库都被清空了。
      7

    这里再额外补充一些命令:

    命令描述
    exists key判断某个 key 是否存在
    type key查看数据类型
    del key删除指定的数据
    expire key 100为给定的 key 设置过期时间(0 表示永久)
    ttl key查看 key 是否过期,-1 表示永不过期,-2 表示已过期

    还有一个 shutdown 命令,用来关闭 redis 服务。如果仅仅是退出客户端 redis-cli,可以按下 CTRL + C


    🍬Redis 中的数据类型

    redis 中有五大常用的数据类型:字符串(String)、列表(List)、集合(Set)、哈希(Hash)、有序集合(Zset),这些在很多高级语言里面都见怪不怪了,然而 redis 还给我们准备了三个针对特定场景的特殊类型:地理位置(Geospatial)、基数统计(Hyperloglog)、位图(Bitmap)。

    其中最常用的类型是 String,redis 中的 String 非常强大,不仅能存文本信息,还能存数字,甚至是图片,音频。

    🎈字符串 String

    字符串的使用和 Java 中的类似,获取字符串长度,追加字符等等操作都是支持的~

    在 redis 中,字符串可以存储不同种类的信息,比如图片,音频等,这是由于数据的二进制信息放入 string 中是什么样,取出来就是什么样,redis 不会关心我们存储的具体内容,只会严格按照二进制信息存取,不会妄图以某种特殊格式解析数据,我们将这种特点称为“二进制安全”。

    redis 中的字符串可以加双引号 " ",也可以省略。

    8

    常用命令参考:

    命令描述
    set 添加键值对
    get 查看键对应的值
    append 将给定的 value 添加至原字符串末尾
    strlen 获取 key 对应的字符串长度
    setnx 仅当 key 不存在时 设置 key 的值
    incr decr 将 key 中存储的数字值加 1 或者减 1
    incrby <数字> decrby <数字>将 key 中存储的数字值增加或减少指定的数值
    mset < value2>同时设置多个 key-value
    mget 同时获取多个 value
    msetnx < value2>同时设置多个 key-value,仅当所有给定的 key 都不存在
    getrange <起始位置> <结束位置>获取指定范围内的子字符串
    setrange <起始位置> 复写 key 所存储的字符串,从<起始位置>开始
    setex <过期时间> 设置键值同时指定一个过期时间(单位秒)
    getset 设置新的键值同时获得旧值

    要注意的是 getrange 中的区间范围是左闭右闭的,比如:

    9

    🎈列表 List

    redis 中的 List 既可以当成列表,也可以当作队列、栈和阻塞队列来用。

    list

    list 的底层是一个双向链表,可以添加一个元素到列表的头部(左边)或尾部(右边)。操作列表中间结点的性能会比两端的稍差一些。

    常用命令:

    • lpush/rpush ...:从左边/右边插入一个或多个值。

    • lpop/rpop :从左边/右边弹出一个值。当列表中没有元素时,键(key)会跟着销毁。(值在键在,值光键亡)
      12

    • rpoplpush :从 列表右边弹出一个值,插入到 列表左边。

    • lrange :获得指定范围内的元素。(从左到右)
      lrange mylist 0 -1 表示获取列表中的所有元素。(-1 表示右边第一个)
      我们在列表中用 lpush 插入四个姓名,取出范围 1 - 3 内的元素:
      13
      可以发现插入操作是每个元素都往最左边放,同时取元素时指定的范围是闭区间。

    • lindex :获取指定索引下标的元素。

    • llen :获得列表长度。

    • linsert before :在 的前面插入 值。
      14

    • lrem :从左边删除 n 个 指定的元素。

    • lset :将列表 key 下标为 index 的值替换成 value。

    🎈集合 Set

    set 对外提供的功能与 list 类似,特殊之处在于 set 是可以自动去重,当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择,并且 set 提供了判断某个成员是否在一个 set 集合内的重要接口,这个也是 list 所不能提供的。

    比如我们尝试在集合中重复添加字符串 “apple”,set 会只保留一个数据元素:

    15

    常用命令:

    命令描述
    sadd ...将一个或多个 member 元素加入到集合 key 中,已经存在的 member 元素将被忽略
    smembers 取出该集合的所有值
    sismember 判断集合 key 是否为含有该 value 值,有1,没有0
    scard 返回该集合的元素个数
    srem ...删除集合中的指定元素
    spop 随机从该集合中弹出一个值
    srandmember 随机从该集合中取出 n 个值,不会从集合中删除
    smove 把集合中一个值从一个集合移动到另一个集合
    sinter 返回两个集合的交集元素
    sunion 返回两个集合的并集元素
    sdiff 返回两个集合的差集元素(key1中的,不包含key2中的)

    🎈哈希 Hash

    hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。类似Java里面的Map

    比如要存储用户信息,可以用 ID 作为 key,将个人信息以 field - value 的形式保存在 hash 中:

    hash

    有点 Map 里嵌套了一个 Map 的感觉~

    常用命令:

    命令描述
    hset 给 key 集合中的 field 键赋值 value
    hget 从 key 集合 field 取出 value
    hmset ...批量设置 hash 的值
    hexists 查看哈希表 key 中,给定域 field 是否存在
    hkeys 列出该 hash 集合的所有 field
    hvals 列出该hash集合的所有 value
    hincrby 为哈希表 key 中的域 field 的值加上增量(可以是负数)
    hsetnx 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在

    一个 hash 的简单示例:

    16

    🎈有序集合 Zset

    有序集合 zset 与普通集合 set 非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分 score,这个评分被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复的 。

    因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围内的元素。

    常用命令:

    命令描述
    zadd 将一个或多个 member 元素及其 score 值加入到有序集 key 当中
    zrange 返回有序集 key 中,下标在 start 与 stop 之间的元素
    zrangebyscore 返回有序集 key 中,所有 score 值介于 min 和 max 之间的成员,按 score 值递增排序
    zrevrangebyscore 同上,改为从大到小排列
    zrem 删除该集合下,指定值的元素
    zcount 统计该集合,分数区间内的元素个数
    zrank 返回该值在集合中的排名,从0 开始

    zrange 命令最后可以带一个可选项 WITHSCORES,可以让分数一起和值返回到结果集:zrange [WITHSCORES]

    zrangebyscore 命令也可以带可选项:zrangebyscore key minmax [withscores] [limit offset count],其中可选项 [limit offset count] 用来进行分页处理,表示从第 offset 起,共取得 count 个数据。例如 limit 10 20 表示从第 10 条数据开始,取 20 条数据。

    利用 zset 实现一个分数排行榜:

    17


    🚀redis 系列专栏:Redis 快速入门
    ❤整理不易❤ 还请各位读者老爷们三连支持一下╰( ̄ω ̄o)

    footer

  • 相关阅读:
    看着别人月入过万,30岁想转入做软件测试,有什么难度?
    “共码未来”——2022Google开发者大会
    权限提升:Mysql 数据库 .(UDF || 启动项 || 反弹)
    2022年前端面试题整理,持续更新中
    一文理清JVM结构
    Linux中swap几乎耗尽,但物理内存还有空余的现象
    Python函数与Bug
    Oracle查询表全部唯一约束(唯一键)
    Struts2+Maven+表单标签向MySql表插入数据实现简单注册
    UE5中置人利用iphone驱动虚拟人面部
  • 原文地址:https://blog.csdn.net/m0_51338272/article/details/127593429