Redis对外数据结构的内部编码Redis内存与数据存储优化内存设置

type命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合),但这些只是Redis对外的数据结构。

实际上每种数据结构都有自己底层的内部编码实现,而且是多种实现,这样Redis会在合适的场景选择合适的内部编码。可以看到每种数据结构都有两种以上的内部编码实现,例如string数据结构就包含了raw、int和embstr三种内部编码。同时,有些内部编码可以作为多种外部数据结构的内部实现,例如ziplist就是hash、list和zset共有的内部编码。

图片来源:https://image-static.segmentfault.com/186/825/1868251457-5ac3a4d996c3e

本文转自:https://www.cnblogs.com/yangmingxianshen/p/8054094.html
新加评论 评论标题:

文章评论

    Redis基本操作

        2019-05-24    
    修改 删除
    1、String

    可以是字符串,整数或者浮点数,对整个字符串或者字符串中的一部分执行操作,对整个整数或者浮点执行自增(increment)或者自减(decrement)操作。字符串命令:
    ①get、获取存储在指定键中的值
    ②set、设置存储在指定键中的值
    ③del、删除存储在指定键中的值(这个命令可以用于所有的类型)

    2、list

    一个链表,链表上的每个节点都包含了一个字符串,从链表的两端推入或者弹出元素,根据偏移量对链表进行修剪(trim),读取单个或者多个元素,根据值查找或者移除元素。列表命令:
    ①rpush、将给定值推入列表的右端
    ②lrange、获取列表在指定范围上的所有值
    ③lindex、获取列表在指定范围上的单个元素
    ④lpop、从列表的左端弹出一个值,并返回被弹出的值
    ⑤lrem、从左到右或从右到左最多删除count个value. lrem key count value

    3、set

    包含字符串的无序收集器(unordered collection)、并且被包含的每个字符串都是独一无二的。添加,获取,移除单个元素,检查一个元素是否存在于集合中,计算交集,并集,差集,从集合里面随机获取元素。集合命令:
    ①sadd、将给定元素添加到集合
    ②smembers、返回集合包含的所有元素
    ③sismember、检查指定元素是否存在于集合中
    ④srem、检查指定元素是否存在于集合中,那么移除这个元素

    4、hash

    包含键值对无序散列表,添加,获取,移除当键值对,获取所有键值对。散列命令:
    ①hset、在散列里面关联起指定的键值对
    ②hget、获取指定散列键的值
    ③hgetall、获取散列包含的所有键值对
    ④hdel、如果给定键存在于散列里面,那么移除这个键

    5、zset

    字符串成员(member)与浮点数分值(score)之间的有序映射,元素的排列顺序由分值的大小决定。添加,获取,删除单个元素,根据分值范围(range)或者成员来获取元素。有序集合命令:
    ①zadd、将一个带有给定分值的成员添加到有序集合里面
    ②zrange、根据元素在有序排列中所处的位置,从有序集合里面获取多个元素
    ③zrangebyscore、获取有序集合在给定分值范围内的所有元素
    ④zrem、如果指定成员存在于有序集合中,那么移除这个成员

    应用

        2019-05-24    
    修改 删除

    存储用户信息:

    原生字符串:需要多个键,set user:1:name tom

    序列化字符串:set user:1 serialize(userinfo) 序列化对象,在取数据后需要反序列化

    使用哈希:hmset user:1 name tom age 22    需要注意哈希元素的个数和值的长度会影响哈希的内部编码方式

    列表的使用:

    模拟栈和队列:lpush+lpop=stack, lpush+rpop=queue

    消息队列:lpush+brpop=message queue

    有限集合:lpush+ltrim=capped collection

    集合:

    不重复、无序的,可以做交、并、差

    标签(tag)使用

    有序集合:

    不重复、按评分排序。用户中每个元素包含一个评分。

    排行榜使用

    附加功能

        2019-05-24    
    修改 删除

    慢查询分析

    redis shell

    pipeline:节约RTT 组装多条命令(解决网络瓶颈)

    事务与Lua:事务放在multi和exec命令之间

    Bitmaps:位(二进制)

    Hyperloglog:一种基数运算,内容会用少量损失

    发布订阅:多客户端和redis频道

    GEO:地理位置定位

    内存消耗、内存管理、内存优化

        2019-06-01    
    修改 删除

    redis的五种数据结构原理分析

        2020-09-21    
    修改 删除

    https://blog.csdn.net/xpsallwell/article/details/84030285

    redis是一个开源的使用C语言编写的一个kv存储系统,是一个速度非常快的非关系远程内存数据库。它支持包括String、List、Set、Zset、hash五种数据结构。除此之外,通过复制、持久化和客户端分片等特性,用户可以很方便地将redis扩展成一个能够包含数百GB数据和每秒处理上百万次的请求的系统。目前支持多种语言的api,方便用户使用。

    redis同时也内置了事务、LUA脚本、复制等功能,提供两种持久化选项,一种是每隔一段时间将数据导入到磁盘(快照模式),另一种是追加命令到日志中(AOF模式)。如果只是作为高效的内存数据库使用也可以关闭持久化功能。通过哨兵(sentinel)和自动分区(Cuuster)的方式可以提高redis服务器的高可用性。

    与关系型数据库相比,redis的命令请求不需要经过查询分析器或查询优化器进行处理,也避免了更新数据时引起的随机读\写,这些慢操作。它直接读写内存中的数据,并且数据是按照一定的数据结构存储的。所以它的速度非常快。


    五种类型的应用场景:
    String,redis对于KV的操作效率很高,可以直接用作计数器。例如,统计在线人数等等,另外string类型是二进制存储安全的,所以也可以使用它来存储图片,甚至是视频等。
    hash,存放键值对,一般可以用来存某个对象的基本属性信息,例如,用户信息,商品信息等,另外,由于hash的大小在小于配置的大小的时候使用的是ziplist结构,比较节约内存,所以针对大量的数据存储可以考虑使用hash来分段存储来达到压缩数据量,节约内存的目的,例如,对于大批量的商品对应的图片地址名称。比如:商品编码固定是10位,可以选取前7位做为hash的key,后三位作为field,图片地址作为value。这样每个hash表都不超过999个,只要把redis.conf中的hash-max-ziplist-entries改为1024,即可。
    list,列表类型,可以用于实现消息队列,也可以使用它提供的range命令,做分页查询功能。
    set,集合,整数的有序列表可以直接使用set。可以用作某些去重功能,例如用户名不能重复等,另外,还可以对集合进行交集,并集操作,来查找某些元素的共同点。
    zset,有序集合,可以使用范围查找,排行榜功能或者topN功能。

评论列表
Redis基本操作
应用
附加功能
内存消耗、内存管理、内存优化
redis的五种数据结构原理分析