数据结构
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 是关注时间,我们可以对粉丝列表按关注时间进行排序