Redis 数据类型及常用命令介绍使用

    科技2022-08-06  119

    目录 🍋

    1. 前言2. String(字符串)2.1 常用命令2.2 使用场景 3. Hash(哈希)3.1 常用命令3.2 使用场景 4. List(列表)4.1 常用命令4.2 使用场景 5. Set(集合)5.1 常用命令5.2 使用场景 6. Zset(sorted set 有序集合)6.1 常用命令6.2 使用场景

    1. 前言

       Redis 共支持五种数据类型,string、hash、list、set、zset , Redis reference resources —> go 🍑

    2. String(字符串)

       String 类型是 redis 最基本的类型,string 类型是二进制安全的。意思是 redis 的 string 的 value 可以包含任何数据。比如jpg图片或者序列化的对象

       value 也可以是数字。String在redis内部存储默认就是一个字符串,被redisObject 所引用,当遇到 incr, decr 等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。

       可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过 512MB

    2.1 常用命令

    set/get 设置和获取对应key的valuemget 批量获取多个key值incr && incrby incr对key加值操作并返回新值,incrby加值setnx 设置key对应的value,如果key已经存在则返回0setex 设置key对应的值为String类型的value,并设定有效期getrange 获取key对应value的子字符串mset 批量设置多个key值,成功所有值都被设置,否则返回 0 全部失败msetnx 通 mset 批量设置不存在则设置,存在返回0getset 设置值并返回旧值append 给指定key的value追加字符串,并返回新字符串的长度

    2.2 使用场景

       String 是最常用的一种数据类型,普通的key/value存储都可以归为此类,这里就不所做解释了。

    3. Hash(哈希)

       Redis Hash 对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为 zipmap , 当成员数量增大时会自动转成真正的HashMap,此时encoding为 ht。

       hash特别适用于 存储对象,将一个对象存储在hash类型中会 占用更少的内存,并且可以方便的存取整个对象。

    3.1 常用命令

    hset/hget 设置/获取 、key对应的HashMap中的field的valuehgetall 获取key对应的HashMap中的所有field的valuehlen 返回key对应的HashMap中的field的数量

    3.2 使用场景

       假设有多个用户及对应的用户信息,可以用来存储以用户ID为key,将用户信息序列化为比如json格式做为value进行保存。

    4. List(列表)

       Redis列表是 简单的字符串列表 , 简单的说就是一个链表或者说是一个队列。可以从头部或尾部向Redis列表添加元素。列表的最大长度为 2^32 - 1,也即每个列表支持超过 40亿 个元素。

       Redis list 的实现为一个双向链表,即可以 支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。

    4.1 常用命令

    lpush 在key对应的list的头部添加一个元素lrange 获取key对应的list的指定下标范围的元素,-1表示获取所有元素lpop 从key对应的list的头部删除一个元素,并返回该元素rpush 在key对应的list的尾部添加一个元素rpop 从key对应的list的尾部删除一个元素,并返回该元素

    4.2 使用场景

       Redis list 的应用场景非常多,也是Redis最重要的数据结构之一,比如 twitter 的关注列表、粉丝列表等都可以用Redis的list结构来实现,再比如有的应用使用Redis的list类型实现一个简单的轻量级消息队列,生产者 lpush,消费者 lpop/brpop。

    5. Set(集合)

       Redis 的 Set 是 string 类型的。和列表一样,在执行插入和删除和判断是否存在某元素时,效率是很高的。集合最大的优势在于可以进行 交集、并集、差集 操作。

       set 的内部实现 是一个value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。

        Set 用来保存多个的字符串元素,但和列表 list 类型不一样的是,集合中不允许有重复元素 (不可重复) ,并且集合中的元素是无序的 (无序集合) ,不能通过索引下标获取元素 (没有下标)

    5.1 常用命令

    sadd 在key对应的set中添加一个元素smembers 获取key对应的set的所有元素spop 随机返回并删除key对应的set中的一个元素suion 求给定key对应的set并集sinter 求给定key对应的set交集

    5.2 使用场景

       Redis set 对外提供的功能与 list 类似是一个列表的功能,特殊之处在于 set 是可以 自动排重 的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

       又或者在微博应用中,每个用户关注的人存在一个集合中,就很容易实现求两个人的共同好友功能 👬 。

    6. Zset(sorted set 有序集合)

       Redis zset 和 set 一样也是 string 类型元素的集合,不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。zset插入 是有序的 redis正是通过score (分数) 来为集合中的成员进行从小到大的排序。

       Redis sorted Set 是通过hashmap存储,key对应set的元素,value是空对象 sortset 是怎么存储并实现排序的呢,hashmap 存储,还加了一层跳跃表 (SkipList)

        HashMap 里放的是成员的 score 映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的 score ,使用跳跃表的结构可以获得比较高的查找效率

       Redis有序集合添加、删除和测试的时间复杂度均为O(1)(固定时间,无论里面包含的元素集合的数量)。列表的最大长度为 2^32- 1 元素(4294967295,超过40亿每个元素的集合)。

    6.1 常用命令

    zadd 在key对应的zset中添加一个元素zrange 获取key对应的zset中指定范围的元素,-1表示获取所有元素zrem 删除key对应的zset中的一个元素zrangebyscore 返回有序集key中,指定分数范围的元素列表,排行榜中运用zrank 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。

    6.2 使用场景

        Redis sorted set 的使用场景与set类似,区别是 set 不是自动有序的,而 Sorted Set 可以给用户额外提供一个优先级( score )的参数来为成员排序,并且是插入有序的,即自动排序。

        当你需要一个有序的并且不重复的集合列表,那么可以选择 sorted set 数据结构,比如 twitter public timeline 可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。

       又比如用户的积分排行榜需求就可以通过 有序集合 实现。还有上面介绍的使用 List 实现轻量级的消息队列,其实也可以通过 Sorted Set 实现有优先级或按权重的队列。

    Processed: 0.013, SQL: 8