数据结构
Redis
所有的数据结构都是以唯一的 key
字符串作为名称,然后通过这个唯一 key
值来获取相应的 value
数据。不同类型的数据结构的差异就在于 value
的结构不一样。
string
(字符串)
list
(列表)
hash
(哈希)
set
(集合)
zset
(有序集合)
1. string(字符串)
1.1. 使用
Redis
的字符串是动态字符串,内部结构实现上类似于 Java
的 ArrayList
,采用预分配冗余空间的方式来减少内存的频繁分配,最大长度为 512M
- 常用来做缓存
- 常用操作:批量操作,过期设置,自增操作
1.2. 函数
1.2.1. SET <key> <value> [EX seconds] [PX milliseconds] [NX|XX]
- 如果
key
已经持有其他值, SET
就覆写旧值, 无视类型
- 当
SET
命令对一个带有生存时间(TTL
)的键进行设置之后, 该键原有的 TTL
将被清除
- 当
Redis
>=2.6.12 后,
EX seconds
: 将键的过期时间设置为 seconds
秒,等于SETEX <key> <seconds> <value>
PX milliseconds
: 将键的过期时间设置为 milliseconds
毫秒,等于PSETEX <key> <milliseconds> <value>
NX
: 只在键不存在时, 才对键进行设置操作,等于SETNX <key> <value>
XX
: 只在键已经存在时, 才对键进行设置操作
1.2.2. GET <key>
- 如果键
key
不存在, 那么返回特殊值nil
,否则,返回键key
的值
- 只用于字符串,如果键
key
的值并非字符串类型, 那么返回一个错误
1.2.3. GETSET <key> <value>
- 将键
key
的值设为value
, 并返回键key
在被设置之前的旧值,如果key
的旧值不存在,命令返回nil
- 当键
key
存在但不是字符串类型时, 命令返回一个错误
1.2.4. 其他
函数 |
返回 |
备注 |
STRLEN <key> |
key 储存的字符串值的长度 |
没有值则返回0,不是字符串则报错 |
APPEND <key> <value> |
追加到键key 现有值的value 之后,键key 的值的长度 |
没有值则等于SET <key> <value> |
SETRANGE <key> <offset> <value> |
从偏移量offset 开始,用value 参数覆写键key 储存的字符串值之后,字符串值的长度 |
如果键key 原来储存的字符串长度比偏移量小,那么原字符和偏移量之间的空白将用零字节(zerobytes,\x00 )进行填充 |
GETRANGE <key> <start> <end> |
返回键key 储存的字符串值的指定部分,字符串的截取范围由start 和end (包含)两个偏移量决定 |
值域超出,忽略超长部分,负数偏移量表示从字符串的末尾开始计数, -1 表示最后一个字符, -2 表示倒数第二个字符 |
INCR <key> |
返回键key 在执行+1 操作之后的值 |
如果键key 不存在,那么它的值会先被初始化为 0,再执行;如果键key 储存的值不能被解释为数字,则报错 |
INCRBY <key> <increment> |
加上增量increment 之后,键key 当前的值 |
类同INCR |
INCRBYFLOAT <key> <increment> |
加上浮点数增量increment 之后,键key 当前的值 |
同INCR ,可以使用指数增量,如2.0e7、3e5、 90e-2 ;键key 的值不是字符串类型或键key 的值或给定增量后不能被解释为双精度浮点数 |
DECR <key> |
键key 在执行-1 操作之后的值 |
类同INCR |
DECRBY <key> <increment> |
减去decrement 之后,键key 当前的值 |
类同INCRBY |
MSET [key value …] |
总是返回 OK |
同时为多个键赋值;其是一个原子操作, 所有给定键都会在同一时间内被设置 |
2. list(列表)
2.1. 使用
- 相当于
Java
语言里面的 LinkedList
,是链表而不是数组,即插入和删除操作非常快,但是索引定位很慢
- 常用来做异步队列使用,将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另一个线程从这个列表中轮询数据进行处理
- 常用操作:队列(右进边出),栈(右进右出)
- 底层是快速链表
quicklist
2.2. 函数
2.2.1. PUSH
函数 |
返回 |
备注 |
LPUSH <key> <value> [value …] |
将一个或多个值value 插入到列表key 表头后列表的长度 |
按从左到右的顺序原子性地插入,如果key 不存在、会创建,当key 存在但不是列表类型时,返回一个错误 |
RPUSH <key> [value …] |
将一个或多个值value 插入到列表key 表尾后列表的长度 |
类同LPUSH |
LPUSHX <key> [value …] |
插入表头后表的长度 |
当key 不存在时,不操作,其余类同LPUSH |
RPUSHX <key> [value …] |
插入表尾后表的长度 |
类同LPUSHX |
2.2.2. POP
函数 |
返回 |
备注 |
LPOP <key> |
移除并返回列表key 的头元素 |
当key 不存在时,返回nil |
RPOP <key> |
移除并返回列表key 的尾元素 |
类同LPOP |
2.2.3. 其他
函数 |
返回 |
备注 |
RPOPLPUSH <sour> <dest> |
将列表sour 中的尾元素弹出并展示,之后再将之作为头元素插入到dest |
如果sour 不存在,值nil 被返回,并且不执行其他动作 |
LLEN <key> |
返回列表key 的长度 |
如果key 不存在,返回0,如果不是列表,返回错误 |
LREM <list> <count> <value> |
根据参数count 的值,移除列表中与参数value 相等的元素,当key 不存在时,返回0 |
count = 0 指移除所有与value 相等的值,大于0从头开始,小于0从尾开始 |
LINDEX <list> <index> |
列表中下标为index 的元素,如果不在范围区间,返回nil |
大于零表示从头开始,小于零表示从尾开始,非列表返回错误 |
3. hash(哈希)
3.1. 使用
- 相当于
Java
语言里面的 HashMap
,它是无序字典
- 可来做缓存存储
- 可自增
4. set(集合)
4.1. 使用
- 相当于
Java
语言里面的 HashSet
,它内部的键值对是无序的唯一的。它的内部实现相当于一个特殊的字典,字典中所有的 value
都是一个值NULL
- 可以用来存储活动中奖的用户 ID,因为有去重功能,可以保证同一个用户不会中奖两次
5. zset(有序集合)
5.1. 使用
- 类似于
Java
的 SortedSet
和 HashMap
的结合体,它既是 set
,保证 value
唯一性,又可给每个 value
赋予一个 score
,代表这个 value
的排序权重
- 内部实现是一种叫做“跳跃列表”的数据结构
- 可以用来存粉丝列表,
value
值是粉丝的用户ID,score
是关注时间,我们可以对粉丝列表按关注时间进行排序