Redis 数据结构

Redis 支持多种数据结构,每种数据结构都有其独特的特点和适用场景。下面为你详细介绍 Redis 的全部数据结构以及常用数据结构。

全部数据结构

1. 字符串(String)

  • 介绍:Redis 中最基础的数据结构,一个键对应一个值,值可以是字符串、整数或浮点数。
  • 应用场景:缓存数据、计数器、分布式锁等。
  • 常用命令SET(设置键值对)、GET(获取键对应的值)、INCR(对键对应的值进行自增操作)等。

2. 哈希(Hash)

  • 介绍:是一个键值对的集合,类似于 Java 中的 HashMap 或 Python 中的 dict。每个哈希可以存储多个字段和值,适用于存储对象。
  • 应用场景:存储用户信息、商品信息等对象数据。
  • 常用命令HSET(设置哈希字段的值)、HGET(获取哈希字段的值)、HGETALL(获取哈希的所有字段和值)等。

3. 列表(List)

  • 介绍:是一个有序的字符串列表,按照插入顺序排序,可以在列表的两端进行元素的插入和删除操作。
  • 应用场景:消息队列、任务队列、最新消息列表等。
  • 常用命令LPUSH(从列表左侧插入元素)、RPUSH(从列表右侧插入元素)、LPOP(从列表左侧弹出元素)、RPOP(从列表右侧弹出元素)等。

4. 集合(Set)

  • 介绍:是一个无序且唯一的字符串集合,不允许有重复的元素。支持集合的交集、并集、差集等操作。
  • 应用场景:去重、共同好友、点赞列表等。
  • 常用命令SADD(向集合中添加元素)、SMEMBERS(获取集合中的所有元素)、SINTER(获取多个集合的交集)等。

5. 有序集合(Sorted Set)

  • 介绍:与集合类似,也是一个唯一的字符串集合,但每个元素都关联一个分数(score),根据分数对元素进行排序。
  • 应用场景:排行榜、热门列表等。
  • 常用命令ZADD(向有序集合中添加元素和分数)、ZRANGE(根据分数范围获取有序集合中的元素)、ZRANK(获取元素在有序集合中的排名)等。

6. 位图(Bitmaps)

  • 介绍:不是一种独立的数据结构,而是基于字符串类型实现的一种位操作。可以将字符串看作是一个由二进制位组成的数组,每个位可以存储 0 或 1。
  • 应用场景:统计用户的登录状态、签到情况等。
  • 常用命令SETBIT(设置指定位置的位值)、GETBIT(获取指定位置的位值)、BITCOUNT(统计位值为 1 的位数)等。

7. HyperLogLog

  • 介绍:是一种用于进行基数统计的概率性数据结构。它可以在很小的内存空间内对大量数据的基数(不重复元素的个数)进行近似统计。
  • 应用场景:统计网站的 UV(独立访客数)、统计搜索关键词的数量等。
  • 常用命令PFADD(向 HyperLogLog 中添加元素)、PFCOUNT(获取 HyperLogLog 的基数估计值)等。

8. 地理空间(Geospatial)

  • 介绍:用于存储地理位置信息,并支持对地理位置进行查询和计算。它基于有序集合实现,将地理位置的经纬度信息编码为有序集合的分数。
  • 应用场景:附近的人、附近的店铺等功能。
  • 常用命令GEOADD(添加地理位置信息)、GEODIST(计算两个地理位置之间的距离)、GEORADIUS(根据指定的位置和半径查询附近的地理位置)等。

常用数据结构

在实际应用中,字符串、哈希、列表、集合和有序集合是最常用的 Redis 数据结构,因为它们能够满足大多数业务场景的需求,并且使用起来相对简单。以下是这些常用数据结构的简单示例:

# 字符串
redis-cli SET name "John"
redis-cli GET name

# 哈希
redis-cli HSET user:1 name "John" age 30
redis-cli HGET user:1 name

# 列表
redis-cli LPUSH tasks "task1"
redis-cli LPUSH tasks "task2"
redis-cli LRANGE tasks 0 -1

# 集合
redis-cli SADD fruits "apple"
redis-cli SADD fruits "banana"
redis-cli SMEMBERS fruits

# 有序集合
redis-cli ZADD scores 100 "Alice" 90 "Bob"
redis-cli ZRANGE scores 0 -1 WITHSCORES    

通过上述示例,你可以看到如何使用 Redis 命令操作这些常用的数据结构。不同的数据结构适用于不同的业务场景,合理选择数据结构可以提高系统的性能和效率。

#我的2024牛客高光时刻#
全部评论

相关推荐

全程50+min1.自我介绍2.先做题lc56.合并区间,最开心的一集3.在本地ide上用的AI代码助手是哪家的,你还用过哪些相关产品,相比之下有什么优点(我用的是通义灵码,狠狠地舔了一波)4.先拷打一下项目(我做的是尚硅谷的乐尚代驾),问的问题没有那么深入    a)司机抢单分布式锁的实现?    b)如果司机取消抢到的订单,整体业务会有什么变化?    c)怎么使用drools编写规则的,为什么要用(大致是这个意思)?    d)分布式事务不用Seata的@GlobalTransactional注解的话,你会如何实现?5.Java基础   a)反射为什么要比普通调用速度慢?(没答出来)    b)枚举类是可继承的吗?为什么?(忘记了,我跟面试官说我猜是用final修饰的)    c)创建对象的方法有哪些?    d)ConcurrentHashMap是线程安全的吗,原理是什么    e)介绍线程池的corePoolSize, maximumPoolSize, workQueue以及他们之间如何相互作用的?    f)两个线程同时执行++i操作,为什么会发生问题?    g)两个线程同时对一个volatile修饰的变量进行修改,会发生这种问题吗    h)Synchronized和Reentrantlock的区别?    i)ThreadLocal原理?    j)讲一下强引用和弱引用?    k)用过哪些多线程编程的相关类?(没想起来,只答了CompletableFuture还有相关使用)6.Redis    a)关于磁盘IO(我说了持久化机制,应该……可以吧)    b)Hash数据结构的rehash,主要细问了渐进式hash。    c)Redis是单线程吗?为什么会有这么高的性能?7.Mysql    a)Mysql使用的存储引擎中什么是支持事务的?    b)InnoDB用的什么数据结构?B+树相比B树的优点是什么?    c)可重复读和读已提交是如何实现的?    d)Undolog链什么时候会删除?(没有关注过这个,没答出来)    e)索引相关,学生表查询name和score,你会如何设计索引?8.Spring    a)Spring AOP原理?    b)Transactional注解的原理是什么?    c)关于Bean的作用域相关的问题,使用什么注解来设置作用域?(真忘了)    d)Spring是如何解决循环依赖的?大致就记得这么多……目前面试表现最好的一次,也是八股问的最多的一次
阿里巴巴一面409人在聊 查看30道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务