Redis原理 -基础数据结构

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Redis原理 -基础数据结构

Redis 基础数据结构


String

动态字符串,类似arraylist,当字符串长度消息1M时,扩容是加倍现有空间,超过1M,扩容时会多扩1M空间,字符串长度最大为512M


640.gif

redis-cli -h 172.31.1.135 -c -p 7000

使用set,get命令进行操作


640.png


判断key是否存在

exists key

640.png

删除key

del name

640.png


设置key的有效时间


set name codehole

expire name 5  # 5s 后过期

640.png

setex name 5 codehole  # 5s 后过期,等价于 set+expire
wait for  5 seconds
get name

640.png


setnx name codehole  # 如果 name 不存在就执行 set 创建

有返回值,返回值为1 表示创建成功 为0 创建失败


640.png


再次setnx命令,返回 0

setnx name java  

640.png


使用redis进行计数

set age 30

incr age

640.png

还可以使用incrby 进行+/-计算


640.png

但是redis自增是有一定的范围的 signed long

set codehole 9223372036854775807

640.png


批量set get

mset name1 boy name2 girl name3 unknown

mget name1 name2 name3

640.png


如果不在一个slot上会报错的

640.png


列表

相当于java里面的linkedlist,链表的插入和删除非常快,复杂度O(1), 索引定位慢,时间复杂度为O(n)


640.gif


使用场景

Redis 的列表结构常用来做异步队列使用。将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另一个线程从这个列表中轮询数据进行处理

右边进左边出:队列

rpush books python java golang

llen  books #列表长度

lpop books #弹出列表第一个


640.png


右边进右边出:栈

rpush books python java golang

rpop books


640.png


Hash字典

相当于java中的hashmap,无序的,同样采用 数组+链表的二维结构,但是redis,扩容方式不一样, redis采用了渐进性rehash策略,新旧hash结构,循环渐进性的一点点迁移,当迁移完后,旧hash删除,内存回收

640.jpg


Redis和hashmap的扩容不有的地方是采用了渐进式hash,渐进性的一点点迁移


640.jpg

hash 移除了最后一个元素,数据结构会被删除


640.gif

hash 结构的存储消耗要高于单个字符串

hset mapneme key value

hgetall mapname

hget  mapname key

640.png


也有批量set

hmset books java "effective java" python "learning python" golang "modern golang programming"


set集合

相当于Java中的hashset,内部键值对是无序的唯一的,内部实现相当于一个特殊的字典,字典中所有value都是一个值NULL


640.gif


sadd books python

sadd books java golang

smembers books

640.png


zset集合

java中sortedSet和HashMap的结合体,一方面是一个set,保证value的唯一性,另外一方面,可以给每个value赋值一个score,代码这个value的排序权重,内部实现是一个类似,跳跃列表的 数据结构

zset 可以用来存粉丝列表,value 值是粉丝的用户 ID,score 是关注时间。我们可以对粉丝列表按关注时间进行排序。

640.gif

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 逆序列出,参数区间为排名范围



640.png


跳跃列表其实采用的是一个二分查找的一个方式

640.jpg

我们需要这个链表按照 score 值进行排序。这意味着当有新元素需要插入时,要定位到特定位置的插入点,这样才可以继续保证链表是有序的。通常我们会通过二分查找来找到插入点,但是二分查找的对象必须是数组,只有数组才可以支持快速位置定位,链表做不到,那该怎么办? 想想一个创业公司,刚开始只有几个人,团队成员之间人人平等,都是联合创始人。随着公司的成长,人数渐渐变多,团队沟通成本随之增加。这时候就会引入组长制,对团队进行划分。每个团队会有一个组长。开会的时候分团队进行,多个组长之间还会有自己的会议安排。公司规模进一步扩展,需要再增加一个层级 —— 部门,每个部门会从组长列表中推选出一个代表来作为部长。部长们之间还会有自己的高层会议安排。

640.jpg


过期时间

ttl 可以查看key的过期时间

640.png

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
20天前
|
存储 消息中间件 缓存
Redis 5 种基础数据结构?
Redis的五种基础数据结构——字符串、哈希、列表、集合和有序集合——提供了丰富的功能来满足各种应用需求。理解并灵活运用这些数据结构,可以极大地提高应用程序的性能和可扩展性。
26 2
|
1月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
40 5
|
1月前
|
存储 消息中间件 NoSQL
Redis数据结构:List类型全面解析
Redis数据结构——List类型全面解析:存储多个有序的字符串,列表中每个字符串成为元素 Eelement,最多可以存储 2^32-1 个元素。可对列表两端插入(push)和弹出(pop)、获取指定范围的元素列表等,常见命令。 底层数据结构:3.2版本之前,底层采用**压缩链表ZipList**和**双向链表LinkedList**;3.2版本之后,底层数据结构为**快速链表QuickList** 列表是一种比较灵活的数据结构,可以充当栈、队列、阻塞队列,在实际开发中有很多应用场景。
|
2月前
|
存储 消息中间件 NoSQL
Redis 数据结构与对象
【10月更文挑战第15天】在实际应用中,需要根据具体的业务需求和数据特点来选择合适的数据结构,并合理地设计数据模型,以充分发挥 Redis 的优势。
59 8
|
2月前
|
存储 NoSQL Java
介绍下Redis 的基础数据结构
本文介绍了Redis的基础数据结构,包括动态字符串(SDS)、链表和字典。SDS是Redis自实现的动态字符串,避免了C语言字符串的不足;链表实现了双向链表,提供了高效的操作;字典则类似于Java的HashMap,采用数组加链表的方式存储数据,并支持渐进式rehash,确保高并发下的性能。
介绍下Redis 的基础数据结构
|
2月前
|
消息中间件 存储 缓存
redis支持的数据结构
redis支持的数据结构
35 2
|
2月前
|
设计模式 NoSQL 网络协议
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
大数据-48 Redis 通信协议原理RESP 事件处理机制原理 文件事件 时间事件 Reactor多路复用
44 2
|
1月前
|
存储 NoSQL 关系型数据库
Redis的ZSet底层数据结构,ZSet类型全面解析
Redis的ZSet底层数据结构,ZSet类型全面解析;应用场景、底层结构、常用命令;压缩列表ZipList、跳表SkipList;B+树与跳表对比,MySQL为什么使用B+树;ZSet为什么用跳表,而不是B+树、红黑树、二叉树
|
1月前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
2月前
|
Java C++
【数据结构】探索红黑树的奥秘:自平衡原理图解及与二叉查找树的比较
本文深入解析红黑树的自平衡原理,介绍其五大原则,并通过图解和代码示例展示其内部机制。同时,对比红黑树与二叉查找树的性能差异,帮助读者更好地理解这两种数据结构的特点和应用场景。
39 0