- Published on
Redis basis
This is my first English article.
相关文档
应用场景
Redis 最广泛的应用场景就是 Cache
数据类型
redis 类型 | 简介 | 特性 | 场景 |
---|---|---|---|
String (字符串) | 二进制安全 | 可以包含任何数据,比如 jpg 图片或者序列化的对象,一个键最大能存储 512M | |
Hash (哈希) | 键值对集合,即编程语言中的 Map 类型 | 适合存储对象,并且可以像数据库中 update 一个属性一样只修改某一项属性值(Memcached 中需要取出整个字符串反序列化成对象修改完再序列化存回去) | 存储、读取、修改用户属性 |
List (列表) | 链表(双向链表) | 增删快,提供了操作某一段元素的 API | 1.最新消息排行等功能(比如朋友圈的时间线) 2.消息队列 |
Set (集合) | 哈希表实现,元素不重复 | 1、添加、删除,查找的复杂度都是 O(1) 2、为集合提供了求交集、并集、差集等操作 | 1.共同好友 2.利用唯一性,统计访问网站的所有独立 ip 3.好友推荐时,根据 tag 求交集,大于某个阈值就可以推荐 |
Sorted set (有序集合) | 将 Set 中的元素增加一个权重参数 score,元素按 score 有序排列 | 数据插入集合时,已经进行天然排序 | 1、排行榜 2、带权重的消息队列 |
String
默认情况下,单个 Redis 字符串最大为 512 MB。
大多数字符串操作的复杂度为 O(1)
SUBSTR
、GETRANGE
和 SETRANGE
命令,它们的复杂度可能为 O(n)
命令...
SET
存储一个字符串值。SETNX
仅当键不存在时才存储字符串值。用于实现锁。GET
检索字符串值。MGET
在单个操作中检索多个字符串值。
List
访问其头部或尾部的列表操作的为 O(1)
操作列表中元素的命令复杂度通常是 O(n)
。包括 LINDEX
、LINSERT
和 LSET
等
命令...
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 类型的底层数据结构;