目录
string
1.编码方式
2.应用场景
3.常用命令
hash
1.编码方式
2.应用场景
3.常用命令
list
1.编码方式
2.应用场景
3.常用命令
set
1.编码方式
2.应用场景
3.常用命令
zset
1.编码方式
2.应用场景
3.常用命令
如何理解Redis的编码方式
embstr
raw
ziplist
quicklist
inset
skiplist
1.int
当value的值为数字时,系统会识别并自动设置编码方式为int。
注意:当存储的是小数时,存的是字符串类型,所以在计算过程中需要先转为小数,计算完成后再转为字符串存储。效率比较低下。
2.embstr
当value是长度小于等于44字节的字符串时采用
3.raw
当value是长度大于44字节的字符串时采用
1.缓存:可以将计算得到的结果或数据库查询结果存储在 Redis 中,以避免重复计算或查询。
2.计数器:因为value常常会使用到数字,所以可以当作计数器使用,通过 INCR、DECR 等命令,可以方便地对存储的数字进行递增或递减操作。
3.会话管理:用于存储用户会话信息,比如用户登录状态、用户配置信息等。通过将用户信息存储在string中,可以方便地进行读写操作。
set、get、keys、getrange、incr、decr、incrby、append、strlen、exists、del、mget、mset、incrbyfloat、expire、ttl。
1.ziplist
当键值对数量比较少,且键和值的大小都适中时,Redis 使用压缩列表进行编码。
2.hashtable
当键值对数量较多,或者键或值的大小较大时,Redis 使用哈希表进行编码。
3.ziplist 和 hashtable 的混合编码
键值对数量较多,但其中一部分键值对较小且可以使用压缩列表编码时,Redis 会使用混合编码。
1.用户信息存储
用于存储用户信息,每个用户对应一个hash,其中的键值对可以包括用户名、密码、电子邮件地址等信息。
2.缓存对象:
用于缓存一些结构化的对象,例如网页内容、API 响应等。每个缓存对象对应一个hash,方便按需获取和更新对象的属性。
3.存储表单数据
用于存储表单提交的数据,例如用户填写的表单信息。每个表单对应一个hash,而hash中的键值对表示表单字段和对应的值。
hset、hget、hexists、hdel、hkeys、hvals、hgetall、hmget、hscan、hlen、hincrby、hincrfloat
1.ziplist
当list中的元素数量较少,且每个元素的大小适中时,Redis 会使用压缩列表进行编码。
2.linkedlist
当list中的元素数量较多,或者每个元素的大小较大时,Redis 会使用双向链表进行编码。
1.消息队列
可以用作简单的消息队列。生产者通过 LPUSH 命令将消息推送到列表的左侧,而消费者则通过 RPOP 或 BRPOP 命令从右侧弹出消息。这样可以实现轻量级的消息队列。
2.存储有序数据集
当需要按照顺序存储一系列数据时,也可以作为有序数据集的一种存储方式。
3.任务调度
用于实现简单的任务调度系统。通过 LPUSH 将任务添加到列表的左侧,并使用消费者从右侧获取并执行任务。
lpush、rpush、lpop、rpop、lrange、lindex、linsert、lrem、llen、brpop、blpop
1.intset
当元素都是整数,并且元素数量较少时,Redis 使用整数集合进行编码。
2.hashtable
当元素不是全部为整数,或者元素数量较多时,Redis 使用哈希表进行编码。
1.标签系统
用于存储标签信息,例如文章的标签、商品的标签等。每个元素代表一个标签,set中的元素都是唯一的。
2.在线用户列表
用于存储当前在线的用户列表。当用户登录或退出时,可以通过set中的元素添加或移除用户,实现实时在线用户管理。
3.无序集合操作
用于对集合进行交集、并集、差集等操作。Redis 提供了丰富的集合操作命令,例如 SINTER、SUNION、SDIFF 等,便于处理集合之间的关系。
4.衡量用户量和用户规模
当同一个用户访问多次服务器,根据set进行去重,后台只显示该用户的一次访问记录
sadd、smembers、sismember、spop、smove、srem、sinter、sunion、sinterstore、sunionstore、sdiff、sdiffstore
1.ziplist
当有序集合中的元素数量较少且分数都可以用较小的空间表示时,Redis 使用压缩列表进行编码。
2.skiplist
当有序集合中的元素数量较多或者分数较大,无法有效利用压缩列表的优势时,Redis 使用跳跃表进行编码。
1.排行榜
适用于实现排行榜功能,每个元素代表一个用户,分数表示用户的得分。通过有序集合可以方便地获取用户的排名、得分等信息。
2.最高分统计
适用于存储用户的游戏得分,通过有序集合可以按照得分排序,方便获取最高分的用户信息。
3.带权重的投票系统
用于存储投票信息,每个元素表示一个投票选项,分数表示投票数量。通过有序集合可以按照投票数量进行排序,方便获取得票最多的选项。
zadd、zrem、zrange、zcard、zscore、zincrby、zinterstore、zunionstore、zrank、zpopmax、zpopmin、zrangebyscore
Redis设计多种编码方式是为了更好地适应不同的数据特征和使用场景,以优化性能和内存占用。不同的数据结构和数据特点可能适合不同的编码方式,因此提供多种选择可以更好地满足各种使用需求。以下是一些设计多种编码方式的原因:
灵活性和通用性:
提供多种编码方式使得Redis能够适应广泛的应用场景。每种编码方式都有其优势,可以根据数据的特征和使用场景选择最合适的方式。性能优化:
不同的编码方式在不同的场景下可能有不同的性能表现。通过选择合适的编码方式,Redis可以在特定情况下提供更高效的操作。内存占用:
不同的编码方式对于相同数据集的内存占用可能有差异。一些编码方式能够更紧凑地存储数据,节省内存。通过选择适当的编码方式,Redis可以更好地管理内存。数据结构的不同需求:
不同的数据结构有不同的特性和需求,因此选择适当的编码方式可以更好地满足这些需求。例如,有序集合和集合可能选择不同的编码方式以优化排序和无序性。节省存储空间:
一些编码方式针对特定类型的数据集合能够提供更紧凑的存储形式,从而减少存储空间的占用。易于扩展:
多种编码方式使得Redis在未来的版本中能够更容易地引入新的编码方式,以适应新的需求和技术。
1.
使用定长表示形式,它将字符串的内容直接存储在字符串对象的结构中,而不需要额外的分配空间。2.主要设计用于节省内存,特别是在字符串较短的情况下。通过避免额外的内存分配,可以降低内存消耗。
3.由于直接存储字符串内容,而不需要进行额外的内存访问,因此在访问字符串内容时具有更快的速度。
1.对于raw编码的字符串,Redis 会使用动态内存分配来存储字符串内容,以适应不同长度的字符串。
2.适用于存储二进制数据,因为它不对字符串内容进行修改或假设字符编码。这使得它可以存储任意字节的数据。
3.字符串内容通过指针动态访问,相对于embstr编码可能稍慢。
1.主要设计用于节省内存。它采用紧凑的存储形式,通过使用变长的节点(entry)来存储元素,以便在内存占用上更加高效。
1.每个quicklist节点中是一个ziplist,用于存储一部分列表元素。
2.支持双向遍历,使得在列表两端进行快速的遍历操作成为可能。
1.采用有序数组的形式存储元素,这使得在整数集合中进行快速的二分查找成为可能,提高了查找效率。
2.设计目标是紧凑存储整数元素,以减少内存占用。它采用了特定的编码方式,使得每个元素的存储空间尽可能小。
1.它的多层结构使得在搜索和插入操作中可以进行跳跃式的操作,而不必每次都从头遍历整个链表。这提高了搜索和插入的效率。
2.由于元素是有序的,因此支持范围查询非常高效。通过在多层链表中跳跃,可以快速定位到指定范围的元素