【redis深度历险】基础篇

本文深入解析Redis中的数据结构,包括String、List、Hash、Set、ZSet的特点与应用场景,如缓存用户信息、异步队列、用户活动记录等。探讨了数据结构的内部实现,如QuickList、跳跃链表,以及rehash策略。

操作:
set k v
get k return v
mset k1 v1 k2 v2
mget k1 k2 k3 return list

数据结构:
string list(链表) hash set zset

string
K-V形式代表
常见用途:缓存用户信息,json序列化为字符串,缓存到redis;取信息反序列化
新建的string的capacity一般是高于len的;小于一M时扩容加倍,超过1M 扩容+1M,最大长度为512M

设置过期时间:
setex k time v
expire k time 设置过期时间
setnx k v k不存在则创建/存在返回0

计数:(自增)
incr k 增加1
incrby k num 增加num
自增有范围:signed long 的最大最小值
字符串由字节构成,一个字节由8个bit组成,字符串可以堪称很多bit的组合(bitmap 位图 数据结构

list
链表
插入 删除 时间复杂度O(1),索引定位很慢,复杂的为O(n)。list弹出最后一个元素后,数据结构自动被删除,内存被回收。
redis list常用来做异步列队使用,将需要延后处理的任务结构体序列化为字符串塞进redis的列表,另一个线程从该列表中轮询数据进行处理
rpush key v1 v2 v3 从右边进
llen key 查看list长度
lpop key 从左边出
rpop key 从右边出

lindex key num寻找某个index对应的元素 O(N)
lrange key start end O(N)获取范围内元素
ltrim key start end O(N)保留范围内元素

事实上内部时 quicklist。
在内部元素较少情况下使用一块连续的内存存储 结构时 ziplist 压缩列表。所有元素紧挨存储,连续内存
元素较多时改为quicklist,将多个ziplist和链表结合起来,多个连续内存空间间用 prev next 连接起来(如果单个数据都使用prev next串联 会产生巨量额外空间,以及碎片化内存)

hash
字典,hashmap,无序字典。数组加链表的二维结构,一维的hash数组位置碰撞时将碰撞的元素使用链表串联起来
redis字典的value只能是字符串
rehash策略:当hash表负载过大时 导致碰撞概率增加,通过resize增大表的index值,增大以后按照新的规则,需要将旧的表按照新的策略重新迁移到新的位置。
HashMap.Size >= Capacity * LoadFactor
java中是一次性rehash,redis中是渐进式rehash,保障高性能,保留新旧两个hash结构,查询会同时查询两个hash结构;直到迁移任务完成,旧内容迁移到新结构中

hash移除了最后一个元素后,数据结构自动删除,内存回收
hash存储用户信息时,可以对用户结构中每个字段单独存储。减少了网络流量,但是增加了存储消耗

hset k v[k] v[v] 设置k值以及val的kv值(同时可以更新)
hmset 批量操作
hlen
hincrby K V[k] 增加K对应的k对应的v

set
hashset 集合,内部键值无序且唯一,内部为一个特殊字典,value均为null
最后一个元素溢出后,自动删除,内存回收
可以用来存储活动中奖的用户ID避免重复
sadd K V[k] K集合中添加一个键值,没有val
smembers K 查看K集合中所有的键值元素
sismember K V[k] 查看K集合中是否存在某个键值元素
scard K 查看集合的大小
spop K 从集合K中弹出一个元素

zset:
内部key唯一性 + val复制权重;回收方式一样
一般用于存储 粉丝列表 v值为粉丝的ID,权重score是关注时间,可以按照关注时间进行排序(类似于排序字典)
zadd K num V添加
zrem 删除
zrange K 0 -1 增序打印V
zrevrange K 0 -1 降序打印V
zcard K 计数
zscore K V 显示V的权重
zrank K V 显示V的增序排名
zrangebyscore K a b 从ab范围内寻找值 withscores 显示分值

跳跃链表
内部排序是根据跳跃链表实现的
0~31层,0层为公共串链表,所有数据直连;然后新数据跳跃到n层的概率为(0.5)^n,极少数据才能到达顶层,元素越多,深入的层次就越深。

容器型数据结构通用规则
list set hash zset都是容器型的数据结构
create if not exists
drop if no elements

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值