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

    科技2022-08-06  176

    目录 🍋

    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.009, SQL: 10