本文介绍: Redis 基础,数据结构篇,带你快速过完 Redis 5 种基础数据结构

一. String 字符串

常见用途缓存用户信息,将用户信息结构使用 JSON 序列化字符串然后序列化后的字符串给 Redis缓存

Redis 字符串动态字符串,是可以修改字符串 —— 实现类似 ArrayList ???

操作

单个操作
setgetexistsdel、setexsetnx(不存在创建)、incrincrby
批量操作
msetmget

二、list 链表

相当于 Java 语言中的 LinkedList插入删除速度非常快,但是定位索引非常慢

在这里插入图片描述

底层使用 quicklist 快速链表结构,当数据量小时,分配一块连续内存ziplist),数据量大时,才改成 quicklist。从而使得满足快速插入删除性能的同时,又不会出现太大的空间冗余

当成异步队列使用,将任务序列化字符串存入 list 中,再另开一个线程列表轮询数据进行处理

操作:
rpush , lpoprpop,llen,lindex(得到某个位置元素,可为负数,表示倒序拿,非常慢,慎用),ltrim保留某个范围元素

三、hash (字典)

相当于 Java 语言中的 HashMap ,其是无序字典。与 Java 语言 rehash 方法不同,使用渐进式 rehash 策略 (在 rehash 的同时,保留新旧两个 hash 结构查询时会同时查询两个hash 结构然后在后续的定时任务中以及 hash 的子指令中,循序渐进地将旧 hash内容一点点迁移到新的 hash 结构中)。

hash可以用来存储用户信息,这样在获取时,可以做到部分获取,这种部分获取可以减少网络流量浪费,但是 hash 结构存储的消耗更高,到底选择如何需要根据情况而定。

操作:
hset 、hgetall 、hlen、hgethmset、hincrby、incr

四、set(集合)

相当于 Java 语言中的 HashSet,因为其具有去重功能,适合存储活动中奖的用户 ID。

操作:
sadd , smembers , sismember , scard(获取长度) , spop

五、zset (有序列表)

Java 中 SortedSet 和 HashMap结合体,一方面可以保证 value唯一性,一方面为每个 value 赋予一个 score代表这个 value排序权重,可以进行排序。其内部使用 跳跃列表数据结构实现

在这里插入图片描述

zset 适合用来存储粉丝列表,这样可以对粉丝按照关注时间进行排序

操作:
zadd、zrange(按照score得到某个范围数据)、zrevrange(按照score得到某个范围数据逆序输出)、zcard(含几个元素) 、zrank某个元素排第几位) 、 zrangebyscore(按照排序输出范围)、zrem删除某个元素)、 zscore(得到某个元素score

容器数据结构遵循的原则

  1. create if not exists
    加入元素时,容器存在创建
  2. drop if no elements
    器中没有元素了,就立刻删除容器

扩展存储用户对象时,使用 hash 还是 string

  1. 存储整个对象,其中JSON序列化过的字符串作为key

可以认为是“最佳实践”,因为每个对象都是全特性key,JSON解析特别块,尤其是一次查询多个字段时候。但是如果只查询一个字段速度就显得比较慢了

  1. 在hash中存储每个对象的属性

也可以认为是最佳实践每个对象都是一个全特性的key,不需要解析JSON字符串。但是如果要查询对象的全部字段比较慢并且嵌套类型的对象无法轻易存储

  1. 将对象转化为JSON字符串,用hash结构存储

HMSET users {id} ‘{“name”:“Fred”,“age”:25}’

这个方案可以仅用两个key,不需要很多key。但是没法对每个用户对象设置TTL(Time to Live,剩余生存时间),因为对象仅仅是hash中的一个字段,而不是全特性的key

这种方式对主key的命名空间污染更少,如果要存储很多对象,那么内存使用和方案1相当。当只需要查询一个字段时,会比方案2速度慢

  1. 存储对象的每个属性作为单独的key

除非对象的属性需要专门设置TTL或者别的设置,否则不推荐

原文地址:https://blog.csdn.net/liuwanqing233333/article/details/129131373

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_46052.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注