目录
Redis六种数据结构
通过 object encoding key可以查看key的数据结构
127.0.0.1:6379> object encoding test
"quicklist"
SDS
Redis中创建了一种名为简单动态字符串(Simple Dynamic String,SDS) 作为字符串的默认数据结构。
SDS特点
- 获取字符串长度的时间复杂度为O(1)
- 杜绝缓冲区溢出
- 减少因修改字符串长度时所需的内存分配次数
- 二进制安全
quicklist
链表特点
链表被广泛用于实现Redis各种功能,比如发布与订阅等;他的主要特点有:
- 每个链表节点有一个ListNode结构表示,每个节点都有一个指向前置节点和后置节点的指针,所以Redis的链表是双端链表
- 每个链表使用一个list结构表示,这个结构有表头指针、表尾指针以及长度信息等
- 链表头节点的前置节点为null链表的尾节点的后置节点都指向NULL,所有Redis链表是无环链表
intset
hasttable
ziplist
skiplist
Redis五种数据类型
Redis是一种高级的key-value非关系内存数据库,支持五种数据类型:
类型 | 简介 | 特性 | 场景 |
---|---|---|---|
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
String是Redis常用的数据类型,典型使用场景有 缓存对象、常规计数以及分布式锁
常见命令
命令 | 作用 | 示例 |
set | 用于给指定的key 设置指定值 | 127.0.0.1:6379> set message "hello word" ex 1000 OK |
get | 获取指定key的值 | 127.0.0.1:6379> get message "hello word" |
incr | 自增 | 127.0.0.1:6379> incr number (integer) 2 |
incrby | 按照指定步长进行自增 | 127.0.0.1:6379> incrby number 3 (integer) 5 |
decr | 自减 | 127.0.0.1:6379> decr number (integer) 4 |
decrby | 按照指定步长自减 | 127.0.0.1:6379> decrby number 3 (integer) 1 |
strlen | 获取指定key的值的长度 | 127.0.0.1:6379> strlen message (integer) 10 |
append | 向指定key的值追加数据 | 127.0.0.1:6379> append message " redis" (integer) 16 127.0.0.1:6379> get message "hello word redis" 127.0.0.1:6379> |
getrange | 按照指定范围从指定key中获取数据 | 127.0.0.1:6379> GETRANGE message 0 5 "hello " |
setrange | 将字符串特定索引上的值设置为指定的数据 | 127.0.0.1:6379> set message "hello word" OK 127.0.0.1:6379> setrange message 6 "redis" (integer) 11 127.0.0.1:6379> get message "hello redis" |
List
列表在Redis中实现上不是使用数据而是使用链表。典型使用场景是消息队列
常见命令
命令 | 含义 | 示例 |
lpush | 将一个或多个值插入到列表头 | 127.0.0.1:6379> lpush mylist "hello" (integer) 3 |
rpush | 将一个或多个值插入到列表尾部 | 127.0.0.1:6379> rpush mylist "hello" "word" "hello" "redis" (integer) 4 |
lpop | 移除并返回列表的第一个元素 | 127.0.0.1:6379> lpop mylist "hello" |
rpop | 移除并返回列表最后一个元素 | 127.0 |