Redis数据类型和应用场景(六)

编程

  1. Redis的数据类型丰富,不仅仅支持K/V类型的数据,同时还提供了list,set,zset,hash等数据结构存储;
  2. Redis支持数据的备份,即Master-slaves模型的数据备份;
  3. Redis支持数据的持久化,可以将内存中的数据保存至磁盘,充气时候,可以再次加载进行;

Redis内部内存管理中是如何描述这些不同数据类型的:

 

Redis内部使用一个RedisObject对象来标识所有的key和value,RedisObject最主要的信息如图所示:type代表一个value对象具体是何种数据类型,encoding是不用的数据类型在redis内部的存储方式,例如:type=String代表value存储的是一个普通的字符串,那么对应的encoding可以是raw或者是int,如果是int,则代表实际redis内部是按数值类型存储和标识这个字符串的,前提当然是这个字符串本身可以是用数值表示,例如:“12344”。

vm字段,只有打开redis的虚拟内存功能,此字段才会真正的分配内存,该功能默认是关闭状态的。通过上图我们可以发现redis使用redisObject来表示所有的K/V数据是比较浪费内存的,当然这些内存管理成本的付出主要也是为了给Redis不同数据类型提供一个统一的管理接口。

Redis支持五种类型数据:String(字符串),hash(哈希),list(列表),set(集合)及zset(有序集合)。

  1. String是redis的基本类型,String类型是二进制安全的,意思是String可以包含任何数据,比如JPG图片,或者序列化的对象。最大存储位512MB.

    • 常用命令:get,set,incr,decr,mget等。
    • 应用场景:常规的K/V缓存应用,常规计数:点击数,浏览数
  2. hash是一个K/V对的集合。是一个String类型的field和value的映射表,hash特别适合用于存储对象。

    • 常用命令:hget,hset,hgetall等;
    • 应用场景:存储用户信息对象数据,用户ID,姓名,年龄,生日等信息。
    • 注意:当hash成员比较少时,redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不是采用真正的hashmap结构,对应的value redisobject的encoding为zipmap,当成员数量增大时会自动转成真正的hashmap,此时encoding为ht.每个hash可以存储2的32次-1个键值对(40多亿)。
  3. list:列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表头部或者尾部。

    • 常用命令:lpush,rpush,lpop,rpop,lrange等。
    • 应用场景:list的应用场景比较多,也是redis最重要的数据结构之一,比如关注列表,粉丝列表等都可以使用list结构来实现。最多可存储 40多亿数据。
  4. set,是String 类型的无序结合。集合是通过hashtable实现的,set中的元素是没有顺序的,所以添加、删除、查找的复杂度都是O(1).

    • 常用命令:sadd,spop,smembers,sunion等。
    • 应用场景:set对外提供的功能类似于list列表功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据时,又不希望出现重复数据时,set是个很好的选择,并且提供了判断某个成员是否在set集合内的重要接口,这个是list不能提供的。例如:微博中,可以通过将关注的人,与被关注的人分别放到不通的set中,通过其求交集,并集,差集等操作,实现共同关注,共同喜好,二度好友等。
    • 实现方式:内部实现 是一个value永远为null的hashmap,实际是通过hash的方式来快速排重的。
  5. zset,是元素集合,且不允许重复成员,而且是有序的。

    • 常用命令:zadd,zrange,zrem,zcard等
    • 使用场景:与set类型,但是区别是zset能自动排序。其额外提供了一个优先级(Score)的参数来为成员排序。当需要一个有序的且不能重复的集合,可以选择zset数据结构。例如:微博发布时间来作为排序的存储至zset,其会自动排序。

 

以上是 Redis数据类型和应用场景(六) 的全部内容, 来源链接: utcz.com/z/516171.html

回到顶部