string(字符串)
内部结构
动态字符串,可以修改的字符串。采用预分配冗余空间的方式。
扩容方式:
- 当字符串长度小于
1MB
时,扩容时加倍现有空间 - 当字符串长度超过
1MB
时,扩容只会扩1MB
的空间 - 字符串最大长度为
512MB
命令
键值对
set name codehole
get name
exists name
del name
get name
批量键值对
set name1 codehole
set name2 holycoder
mget name1 name2 name3
mset name1 boy name2 girl name3 unknown
mget name1 name2 name3
过期和set命令扩展
set name codehole
get name
expire name 5
get name
setex name 5 codehole # 5秒后过期,等价于set + expire
get name
setnx name codehole # 如果name 不存在就执行set创建
get name
setnx name holycoder
计数
如果value值是一个整数,可以对它进行自增操作。自增的范围在signed long的最大值和最小值之间,超出会报错
set age 30
incr age
incrby age 5
incrby age -5
list(列表)
内部结构
使用双向链表,插入和删除操作非常快,时间复杂度为O(1),索引定位很慢,时间为O(n)
适合做异步队列使用,将需要处理的任务结构体序列化成字符串,塞进列表,另个线程轮询数据处理
- 在列表元素较小的情况下,会使用一块连续的内存存储,这个结构是
ziplist
,即压缩列表。它将所有元素彼此紧挨着一起存储,分配的是一块连续的内存。当数据量比较多的时候才会改成quicklist
。因为普通的链表需要的附加指针空间太大,会浪费空间,还会加重内存的碎片化
命令
右边进左边出(队列)
队列是先进先出的数据结构,常用于消息排队和异步逻辑处理,确保元素的访问顺序性
rpush books python java golang
llen books
lpop books
lpop books
lpop books
右边进右边出(栈)
栈是先进后出的数据结构,跟队列正好相反
rpush books python java golang
rpop books
rpop books
慢操作
lindex
需要对链表进行遍历,性能随着index增大而变差
ltrim
的两个参数start_index 和 end_index 定义一个区间,在这个区间内的值保留,通过 ltrim
来实现一个定长的链表
index 可以为负数,index = -1 表示倒数第一个元素,同理index = -2 表示倒数第二个元素
rpush books python java golang
lindex books 1
lrange books 0 -1
ltrim books 0 -1
ltrim books 1 0
llen books
hash(字典)
内部结构
无序字典 “数组 + 链表”。第一维数组位置碰撞,就会将碰撞的元素使用链表串接起来。
redis
的字典的值只能是字符串,采用渐进式rehash策略。
渐进式rehash会在rehash的同时,保留新旧两个hash结构。查询时会同时查询两个hash结构,然后在后续的定时任务以及hash操作指令中,循序渐进地将旧hash内容一点点迁移到新的hash结构中。当搬迁完成了,就会使用新的hash结构取而代之。
命令
hset books java "think in java"
hset books golang "concurrency in go"
hset books python "python cookbook"
hgetall books
hlen books
hget books java
hset books golang "learning go programming"
hget books golang
hmset books java "effective java" python "learning python" golang "modern golang"
若为数字类型,也可以进行计数
hset user-laoqian age 29
hincrby user-laoqian age 1
set(集合)
Redis
的集合内部键值对是无序的、唯一的。内部实现了一个特殊的字典,字典中value是一个NULL。
当集合中最后一个元素被移除后,数据结构被自动删除,内存被回收
sadd books python
sadd books java golang
smembers books # 和插入的并不一致,因为set是无序的
sismember books java # 查询某个value是否存在
scard books # 获取长度
spop books
zset
(有序集合)
zset
是redis
提供的最有特色的数据结构,
一方面是一个set,保证内部value的唯一性,另一方面给每个value赋予一个score,代表这个value的排序权重。
内部实现用的是一种叫做"跳跃列表"的数据结构
zset
中最后一个value被移除后,数据结构被自动删除,内存被回收
zadd books 9.0 "think in java"
zadd books 8.9 "java concurrency"
zadd books 8.6 "java cookbook"
zrange books 0 -1 # 按score排序列出,参数区间为排名范围
zrevrange books 0 -1 # 按score逆序列出,参数区间为排名范围
zcard books # 相当于count()
zscore books "java concurrency" # 获取指定value的score
zrank books "java concurrency" # 排名
zrangebyscore books 0 8.91 # 根据分值区间遍历zset
zrangebyscore books -inf 8.91 withscores # 根据分值区间,遍历zset,同时返回分值
zrem books "java concurrency" # 删除value
zrange books 0 -1
容器型数据结构的通用规则
list 、set、hash、zset
这四种数据结构是容器型数据结构
- create if not exists: 如果容器不存在,那就创建一个,再进行操作
- drop if no elements:如果容器里的元素没有了,那么立即删除容器,释放内存。
lpop
操作到最后一个元素,列表就消失了
过期时间
redis
所有数据结构都可以设置过期时间,过期时间为对象。
如果一个字符串已经设置了过期时间,然后你调用set方法修改它,它的过期时间会消失