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

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

9

🎈列表 List

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

list

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

常用命令:

  • lpush/rpush <key> <value1> <value2>...:从左边/右边插入一个或多个值。

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

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

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

  • lindex <key> <index>:获取指定索引下标的元素。

  • llen <key>:获得列表长度。

  • linsert <key> before <value> <newvalue>:在 <value> 的前面插入 <newvalue> 值。
    14

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

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

🎈集合 Set

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

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

15

常用命令:

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

🎈哈希 Hash

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

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

hash

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

常用命令:

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

一个 hash 的简单示例:

16

🎈有序集合 Zset

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

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

常用命令:

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

zrange 命令最后可以带一个可选项 WITHSCORES,可以让分数一起和值返回到结果集:zrange <key><start><stop> [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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mymel_晗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值