Redis核心数据结构

目录

五种基础数据结构

string

hash

list

set

zset

用zset实现微博热搜

scan遍历

高频问题


五种基础数据结构

string

单个赋值set

Redis核心数据结构_第1张图片

批量赋值/取值

  • mset
  • mget

Redis核心数据结构_第2张图片Redis核心数据结构_第3张图片

设置不存在字符串setnx, 如果不存在, 则设置成功返回1, 如果存在返回0, 可以当做分布式锁

Redis核心数据结构_第4张图片

删除值

设置过期时间/查看过期时间

  • expire key time
  • ttl key

Redis核心数据结构_第5张图片

数字自增

Redis核心数据结构_第6张图片

设置分布式锁

setnx order:1 true        // 返回1代表获取锁成功

// 执行业务

del order:1

set order:1 true ex 15 nx        // 加上过期时间, 防止死不释放

Redis核心数据结构_第7张图片

hash

设置hash的key field value

Redis核心数据结构_第8张图片

批量设置hash field

Redis核心数据结构_第9张图片

获取hash所有属性

Redis核心数据结构_第10张图片

删除hash某个属性

hash和string(非json)存储对象对比

优点:

  • hash能规整同类数据, 便于管理
  • hash更节省空间(key少)
  • hash对部分属性的更新性能更好

缺点:

  • 过期时间只能在key上, 不能在属性上
  • 在集群架构不适合大规模使用
  • 不适用field过多, 避免big key

list

lpush key val1 val2 从左边放入元素

rpush key val1 val2 从右边放入元素

lpop key len 从左边拿len个元素

rpop key len 从右边拿len个元素

实现栈结构-FILO

Redis核心数据结构_第11张图片

实现队列结构-FIFO

Redis核心数据结构_第12张图片

blpop key len timeout 从左边拿len个元素,没有元素就阻塞timeout秒, 如果timeout=0就一直阻塞

lpush+brpop=阻塞队列

lrange key start end 批量获取队列元素(不会移除,元素还在)

Redis核心数据结构_第13张图片

set

sadd key val1 val2 val3 批量往集合添加元素

scard key 获取集合个数

srem key val1 移除集合元素

sismembers key 获取集合所有元素

sismember key val1 判断集合是否存在该元素

Redis核心数据结构_第14张图片Redis核心数据结构_第15张图片

srandmember key 3 从集合选出3个元素, 不删除

spop key 3        从集合选出3个元素, 并且从集合中删除

Redis核心数据结构_第16张图片Redis核心数据结构_第17张图片

sinter key1 key2        取交集

sinterstore des1 key1 key2        取交集并存入新的集合des1

Redis核心数据结构_第18张图片Redis核心数据结构_第19张图片

sunion key1 key2        取并集

sunion des2 key1 key2        取并集存入新的集合des2

Redis核心数据结构_第20张图片Redis核心数据结构_第21张图片

sdiff key1 key2 key3        取差集

sdiffstore des2 key1 key2 key3        取差集并存入新的集合

应用

  1. 用srandmember/spop实现抽奖功能
  2. 用sinter/sunion/sdiff实现关注模型(可能认识的人)

zset

zadd key score val        往集合添加key和分数和值

zscore key val        获取集合元素分值

zrange key start end        按分值升序

zrevrange key start end        按分值降序

Redis核心数据结构_第22张图片

zunion numkeys key1 key2        并集计算

zinter numkeys key1 key2        交集计算

zdiff numkeys key1 key2        差集计算

Redis核心数据结构_第23张图片

用zset实现微博热搜

1. 点击一条消息

zincrby key incr val

Redis核心数据结构_第24张图片

2. 展示当日前五

zrevrange hotnew:231126 0 5 withscores

Redis核心数据结构_第25张图片

3. 七日搜索榜单

zunionstore hotnew:231119-231126 7 hotnew:231119 hotnew:231120 ... hotnew:231123

4. 七日搜索榜单

zrevrange hotnew:231119-231126 0 5 withscores

scan遍历

SCAN cursor [MATCH pattern] [COUNT count]

cursor(hash桶的索引值):游标, 从0开始遍历, 每次用返回的值替换下一次检索的游标, 结束时返回0

pattern:正则表达式

count: 返回结果个数近似值

Redis核心数据结构_第26张图片

注意:scan并非完美无瑕, 如果在scan的过程中如果有键的变化(增加、 删除、 修改) ,可能会碰到下面问题: 新增的键可能没有遍历到, 重复遍历键等, 也就是说scan并不能保证完整的遍历出来所有的键

高频问题

1. redis是单线程吗?

只有键值读写是单线程, 其他的持久化,过期删除,集群同步都是额外线程执行.

2. redis为什么高性能?

  • 所有数据都存内存中, 都是内存级别运算
  • IO多路复用,redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放到文件事件分派器,事件分派器将事件分发给事件处理器
  • 单线程执行,没有上下文切换

你可能感兴趣的:(redis)