Published on

Redis basis

This is my first English article.

相关文档

中文文档 英文文档 源码

应用场景

Redis 最广泛的应用场景就是 Cache

数据类型

redis 类型简介特性场景
String (字符串)二进制安全可以包含任何数据,比如 jpg 图片或者序列化的对象,一个键最大能存储 512M
Hash (哈希)键值对集合,即编程语言中的 Map 类型适合存储对象,并且可以像数据库中 update 一个属性一样只修改某一项属性值(Memcached 中需要取出整个字符串反序列化成对象修改完再序列化存回去)存储、读取、修改用户属性
List (列表)链表(双向链表)增删快,提供了操作某一段元素的 API1.最新消息排行等功能(比如朋友圈的时间线) 2.消息队列
Set (集合)哈希表实现,元素不重复1、添加、删除,查找的复杂度都是 O(1) 2、为集合提供了求交集、并集、差集等操作1.共同好友 2.利用唯一性,统计访问网站的所有独立 ip 3.好友推荐时,根据 tag 求交集,大于某个阈值就可以推荐
Sorted set (有序集合)将 Set 中的元素增加一个权重参数 score,元素按 score 有序排列数据插入集合时,已经进行天然排序1、排行榜 2、带权重的消息队列

String

默认情况下,单个 Redis 字符串最大为 512 MB。

大多数字符串操作的复杂度为 O(1) SUBSTRGETRANGESETRANGE 命令,它们的复杂度可能为 O(n)

命令...

  • SET 存储一个字符串值。
  • SETNX 仅当键不存在时才存储字符串值。用于实现锁。
  • GET 检索字符串值。
  • MGET 在单个操作中检索多个字符串值。

List

访问其头部或尾部的列表操作的为 O(1) 操作列表中元素的命令复杂度通常是 O(n)。包括 LINDEXLINSERTLSET

命令...

  • LPUSH 添加一个新元素到列表的头部;RPUSH 添加到尾巴。
  • LPOP 从列表的头部移除并返回一个元素;RPOP 做同样的事情,但从列表的尾部开始。
  • LLEN 返回列表的长度。
  • LMOVE 原子地将元素从一个列表移动到另一个列表。
  • LTRIM 将列表减少到指定的元素范围。

Set

  • List 可以存储重复元素,Set 只能存储非重复元素;
  • List 是按照元素的先后顺序存储元素的,而 Set 则是无序方式存储元素的。 Set 类型的底层数据结构是由哈希表或整数集合实现的:

如果集合中的元素都是整数且元素个数小于  512 (默认值,set-maxintset-entries 配置)个,Redis 会使用整数集合作为 Set 类型的底层数据结构; 如果集合中的元素不满足上面条件,则 Redis 使用哈希表作为 Set 类型的底层数据结构。

Hash

in String:

- user:age => 18
- user:name => "mmc"

in Hash
user => {
age: 18,
name: "mmc"
}

Hash 类型的底层数据结构是由压缩列表或哈希表实现的:

如果哈希类型元素个数小于  512  个(默认值,可由  hash-max-ziplist-entries  配置),所有值小于  64  字节(默认值,可由  hash-max-ziplist-value  配置)的话,Redis 会使用压缩列表作为 Hash 类型的底层数据结构; 如果哈希类型元素不满足上面条件,Redis 会使用哈希表作为 Hash 类型的底层数据结构。

在最新 Redis 版本中,压缩列表数据结构已经废弃了,交由 listpack 数据结构来实现了。

Sorted Sets

set 类型(有序集合类型)相比于 Set 类型多了一个排序属性 score(分值),对于有序集合 ZSet 来说,每个存储元素相当于有两个值组成的,一个是有序结合的元素值,一个是排序值。

Zset 类型的底层数据结构是由压缩列表或跳表实现的:

如果有序集合的元素个数小于  128  个,并且每个元素的值小于  64  字节时,Redis 会使用压缩列表作为 Zset 类型的底层数据结构; 如果有序集合的元素不满足上面的条件,Redis 会使用跳表作为 Zset 类型的底层数据结构;