Redis原理 -基础数据结构

本文涉及的产品
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

相关文章
|
存储 缓存 NoSQL
Redis 服务器全方位介绍:从入门到核心原理
Redis是一款高性能内存键值数据库,支持字符串、哈希、列表等多种数据结构,广泛用于缓存、会话存储、排行榜及消息队列。其单线程事件循环架构保障高并发与低延迟,结合RDB和AOF持久化机制兼顾性能与数据安全。通过主从复制、哨兵及集群模式实现高可用与横向扩展,适用于现代应用的多样化场景。合理配置与优化可显著提升系统性能与稳定性。
248 0
|
3月前
|
存储 缓存 NoSQL
【📕分布式锁通关指南 12】源码剖析redisson如何利用Redis数据结构实现Semaphore和CountDownLatch
本文解析 Redisson 如何通过 Redis 实现分布式信号量(RSemaphore)与倒数闩(RCountDownLatch),利用 Lua 脚本与原子操作保障分布式环境下的同步控制,帮助开发者更好地理解其原理与应用。
248 6
|
2月前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
269 86
|
4月前
|
存储 缓存 NoSQL
Redis核心数据结构与分布式锁实现详解
Redis 是高性能键值数据库,支持多种数据结构,如字符串、列表、集合、哈希、有序集合等,广泛用于缓存、消息队列和实时数据处理。本文详解其核心数据结构及分布式锁实现,帮助开发者提升系统性能与并发控制能力。
|
2月前
|
存储 消息中间件 NoSQL
Redis数据结构:别小看这5把“瑞士军刀”,用好了性能飙升!
Redis提供5种基础数据结构及多种高级结构,如String、Hash、List、Set、ZSet,底层通过SDS、跳表等实现高效操作。灵活运用可解决缓存、计数、消息队列、排行榜等问题,结合Bitmap、HyperLogLog、GEO更可应对签到、UV统计、地理位置等场景,是高性能应用的核心利器。
|
2月前
|
存储 缓存 NoSQL
Redis基础命令与数据结构概览
Redis是一个功能强大的键值存储系统,提供了丰富的数据结构以及相应的操作命令来满足现代应用程序对于高速读写和灵活数据处理的需求。通过掌握这些基础命令,开发者能够高效地对Redis进行操作,实现数据存储和管理的高性能方案。
114 12
|
2月前
|
存储 消息中间件 NoSQL
【Redis】常用数据结构之List篇:从常用命令到典型使用场景
本文将系统探讨 Redis List 的核心特性、完整命令体系、底层存储实现以及典型实践场景,为读者构建从理论到应用的完整认知框架,助力开发者在实际业务中高效运用这一数据结构解决问题。
|
2月前
|
存储 缓存 NoSQL
【Redis】 常用数据结构之String篇:从SET/GET到INCR的超全教程
无论是需要快速缓存用户信息,还是实现高并发场景下的精准计数,深入理解String的特性与最佳实践,都是提升Redis使用效率的关键。接下来,让我们从基础命令开始,逐步揭开String数据结构的神秘面纱。
|
2月前
|
存储 缓存 监控
Redis分区的核心原理与应用实践
Redis分区通过将数据分散存储于多个节点,提升系统处理高并发与大规模数据的能力。本文详解分区原理、策略及应用实践,涵盖哈希、范围、一致性哈希等分片方式,分析其适用场景与性能优势,并探讨电商秒杀、物联网等典型用例,为构建高性能、可扩展的Redis集群提供参考。
162 0