字符串(string)类型Redis使用了三种不同的编码方式来存储字符串对象,并会根据每个字符串值自动决定所使用的编码方式:int:用于能够使用64位有符号整数表示的字符串;embstr:用于长度小于等于44字节(在Redis...
字符串(string)类型
Redis使用了三种不同的编码方式来存储字符串对象,并会根据每个字符串值自动决定所使用的编码方式:
- int:用于能够使用64位有符号整数表示的字符串;
- embstr:用于长度小于等于44字节(在Redis3.x版本中是39字节)的字符串;
- raw:用于长度大于44字节的字符串。
可以采用OBJECT ENCODING来查看编码。
列表(list)类型
Redis中的列表与双向链表类似
LPUSH左端插入,RPUSH右端插入,LINSERT某键之前或之后插入。
向一个不存在的键中插入元素,Redis会先创建一个空列表并将其与键关联;
也不需要删除值为空列表的键,Redis会自动回收这种键。
LINDEX获取指定索引处的元素,LRANGE获取一个范围内的元素。
列表的索引从左到右指定为0~N-1;从右到左指定为-1~-N。
因此,获取整个列表就是0~~1(例:LRANGE key 0 -1 就是获取键为key的整个列表)。
LSET设置列表中指定索引位置处元素的值。
LPOP从列表左端移除第一个元素,RPOP从列表右端移除第一个元素。对不存在的键使用此命令时,返回nil
对应的阻塞版本为:BLPOP和BRPOP。当列表为空时,会将客户端阻塞。
可以设置一个以秒为单位的超时时间,超时时间为0时,表示永久等待。(此特性在任务调度中非常有用)
Redis在内部使用quicklist存储列表对象,下列配置选项可以调整列表对象的存储逻辑:
- list-max-ziplist-size:一个列表条目中一个内部节点的最大大小。
- list-compress-depth:列表压缩策略(列表两端不被压缩的节点个数,当列表很长且最可能被访问的元素在两端,用此参数精确地进行调优可以实现在压缩比和其它因素之间的平衡)。
哈希(hash)类型
哈希表示字段和值之间的映射关系,与某些语言中字典类型类似。
与列表(list)类型类似,添加字段前无需先初始化一个空的哈希,变为空时Redis会自动将其删除。
HDEL从哈希中删除字段。
HGETALL获取一个哈希中的所有字段和值,不建议对数量巨大的哈希使用此命令。(一个哈希最多能够容纳-1字段,如果一个哈希字段非常多,执行HGETALL时很可能会阻塞Redis服务器,这种情况下通常使用HSCAN来增量地获取所有字段和值)
Redis内部使用两种编码来存储哈希对象:
- ziplist:对于那些长度小于配置中hash-max-ziplist-entries选项配置的值(默认为512),且所有元素大小都小于配置中hash-max-ziplist-value选项配置的值(默认为64字节)的哈希,采用此编码。(ziplist对于较小的哈希而言可以节省占用空间)
- hashtable:当ziplist不适用时采用的默认编码。
集合(set)类型
由唯一、无序对象组成的集合(collection)。
它经常用于测试某个成员是否在集合中、重复项删除和集合运算(求并、交、差集)。
SISMEMBER测试一个元素是否位于集合中,SREM中集合中删除元素,SCARD获取集合中成员的数量。
一个集合中最多可以容纳-1个成员。
SMEMBERS获取集合中所有元素,成员很多情况下使用可能会阻塞服务器,此时应该使用SSCAN。
Redis内部两种编码方式来存储集合对象:
- intset:对于那些元素都是整数且元素个数小于配置中set-max-intset-entries选项设置的值(默认12)的集合,对于较小的集合可以节省占用空间。
- hashtable:intset不适用时的默认编码。
有序集合(sorted set)类型
集合中每个元素都有一个可以用于排序的权重,并且可以按照顺序从集合中获取元素。
唯一计数(HyperLogLog)类型
采用集合来进行唯一计数时,当数据量达到上千万就需要考虑内存消耗和性能下降的问题了。
如果不需要获取数据集的内容,而只是想得到不同值的个数,这时候就使用HyperLogLog类型最好了。
PFCOUNT获取数量
优势在于能够使用固定数量的内存(每个键只需占用12KB就可以计算最多2^64个不同元素的基数)和时间复杂度(每个键O(1))进行唯一计数。不过由于HLL算法返回的基数可能不准确(标准差小于1%),因此在决定是否使用HLL时需要进行权衡。
地理位置(Geo)类型
GEORADIUS获取指定坐标指定距离内的地点成员;
GEODIST获取两点之间的距离;
GEORADIUSBYMEMBER获取指定成员指定距离内的其他成员
Geo集合实际上被存储为一个有序集合,因此有序集合支持的命令都可以用于Geo数据类型。
本文标题为:Redis数据类型 随笔
基础教程推荐
- Python常见库matplotlib学习笔记之多个子图绘图 2023-07-27
- Redis4.0.10配置文件----中文翻译全解析 2023-09-13
- SQL Server附加数据库时出现错误的处理方法 2023-07-28
- 命令行清除Redis缓存的实现 2023-07-13
- 【推荐】.NETCore 简单且高级的库 csredis v3.0.0 2023-09-12
- Redis(三):Redis数据类型 2023-09-12
- Oracle如何获取数据库系统的当前时间 2023-07-23
- MySQL select count(*)计数很慢优化方案 2022-09-01
- 我是如何用2个Unix命令给MariaDB SQL提速的 2023-07-24
- MySQL级联复制下如何进行大表的字段扩容 2023-07-26