前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >redis支持的数据结构

redis支持的数据结构

作者头像
爬蜥
发布2019-07-09 19:23:25
5580
发布2019-07-09 19:23:25
举报
  • Binary-safe string:字符串,Binary-safe的意思是它本身不会应为某些特殊字符而导致字符串结束了,他可以包含任何字符。比如在C中,字符串的结尾是'\0',意味着这个字符之后的不能被当做当前字符的
  • Lists:存储string的链表,存储顺序即插入顺序 (不是通过数组实现)
  • Sets:每个字符串唯一的存储集合
  • Sorted Sets:存储的每一个字符串都是唯一的,同时每个字符串会具备一个score的属性
  • Hashes:存储key和value的映射关系,key和value都是string
  • Bit Array:像bit数组一样处理String值,每一个bit都可以set和clear,计算1的数量等等
  • HyperLogLogs:用来估计set中唯一值的个数

redis的key

key可以包含任意得字符,比如将一张JPEG文件内容作为key。空字符串也是一个有效的key。redis的key使用时,有一些建议:

  • key最好不要太长。超过1024bytes的key一个是占用内存,再者每次去找key做匹配也是需要一些时间的 可用通过hash来解决,比如使用SHA1
  • key太短也不好。比如"user:1000:followers"显然比"u1000flw"拥有更好的可读性,key本身的这点增长所需要的空间比起key对象和object对象来说可以忽略 自己掌握好这里头的平衡
  • 尝试遵循一定的模式。比如以"object-type:id"这种方式来作为key的规则
  • key最大512M

设置key过期

EXPIRE 命令用来设置过期

  • 过期的精度可以是秒或者毫秒
  • 过期时间的分辨率一直是毫秒
  • 过期时间本身会被持久化,即使redis本身停止服务了,停服期间过期的时间还是同样计算

使用 PERSIST 可以去掉过期时间,永久保留 key

String

SET 命令来设置 string类型值,它会替代已经存储在redis中的key的值,即使原来存储的值类型不是string

  • value大小不能超过512M

  • 如果SET值时,发现已经存储,则不覆盖原值,可以通过 set mykey myValue nx ,即后面跟 nx 来实现这种语义;另外如果仅想在key存在的时候覆盖,可以通过 set mykey myValue xx 即后面跟 xx 来实现这种语义

  • 批量获取使用MSET,对应GET为MGET

  • set key value ex 10 设置10秒后过期

INCR 命令会把 string 类型值当做integer,实现自增1,如果key不存在,它会被置为0,然后再自增1。如果 string 不能当做 integer 会抛出异常

  • 自增的上限是64 bit的integer。

  • 类似的命令有 INCRBY ,可自定义增长的大小。其余还有DECR DECRBY

  • INCR命令是原子操作。

EXISTS 判断key是否存在

DEL 删除key

TYPE 判断key的类型

TTL 获取key的存活时间

LIST

  1. LPUSH 命令向list头添加元素只需要常量时间,可一次添加多个
  2. RPUSH 命令向list尾部添加元素只需要常量时间,可一次添加多个
  3. LRANGE 提取list中一定范围内的元素,比如 lrange mylist 0 -1 ,范围是两个索引,都可以是负数,-1表示最后一个,-2表示倒数第2个,依此类推
  4. RPOP 返回list中的最后一个元素,并从list中移除它,如果没有元素了就返回 NULL
  5. LTRIM 保留给定索引范围之内的数据,list中的其余值都删掉
  6. BRPOP 从list中返会并删除最后一个元素,如果列表没有值,就阻塞,根据阻塞的时间,如果是0,就一直阻塞直到有值存在,大于0则阻塞相应的时间长度
  7. BLPOP 对应BRPOP操作第一个元素

使用brpop/blpop 需要注意:

  • 客户端的请求处理是按照顺序来的,第一个阻塞的当有其它客户端插入数据会第一个处理
  • 它的返回会有两个值
  • 超时返回NULL

自动创建和移除keys

当往redis中没有对应key存在的集合中push元素或者删除一个空的集合,redis需要主动的去创建空的集合或者是删除没有值的key。对应的操作有三条规则:

  • 当往集合中添加元素,如果目标的key不存在,在添加之前redis会首先创建一个空的集合
  • 当从集合中移除一个元素,如果value移除后是空的,key就会被删掉
  • 使用形如 LLEN 的只读命令,或者是使用移除元素的命令,来操作一个不存在的key,redis的表象就像key本身的value是一个空集合一样

Hash

使用hash能够用来代表一个对象,放到hash里面的字段数量理论上是没有限制的

  1. hmset: 往hash中塞多个字段
  2. hget:获取当个的字段
  3. hmget:以数组形式返回值
  4. hincrby: 对单个字段进行递增操作
代码语言:javascript
复制
hmset user:1000 name paxi verified 1 a 10 //塞入user的多个字段
hget user:1000 name  //获取name字段值
hmget user:1000 name verified //以数组形式返回值,key不存在返回null
hincrby user:1000 a 10 //将字段a增加10
复制代码

Set

set在redis中用来存储string的无序集合。

  1. sadd:往set中添加新的元素,可以单个或者批量的添加
  2. smembers:获取set中的所有元素
  3. sismember:校验某个元素是不是属于给定结合
  4. sinter:获取多个set的交集
  5. spop:从set中随机删除一个元素,并返回它的值
  6. sunionstore:取多个set中的并集
  7. scard:计算set中唯一值的个数(集合论中的基数)
代码语言:javascript
复制
 sismember myset 1 //判断 1 是不是在集合 myset中
sunionstore myset1 myset2 //假如 myset1不存在,就相当于把 myset2 中的元素拷贝到了 myset1
复制代码

Sorted sets

用来存储唯一的string,它每一个值都包含一个score属性,它会根据如下规则排序

  • 如果A和B两个元素有有不同的score,且 A.score > B.score,那么 A>B
  • 如果A和B有着一样的score,如果从字面排序上A比B要排在前面,那么 A>B

它内部实现是 dual-ported数据结构 ,内部同时包含了 skip list和 hash table,每次添加元素的时间是O(lgN),但是获取的时间是常量的

  1. zadd:往 sorter sets中添加元素,可以同时添加多个,添加同样的key则会更新元素本身的score
  2. zrange:按顺序获取集合中一段索引范围之内的元素
  3. zrevrange:按逆序获取集合中一段索引范围之内的元素
  4. zrangebyscore:取score范围内的元素
  5. zremrangebyscore:移除score范围内的元素
  6. zrank:获取特定key的排序位置
代码语言:javascript
复制
zadd hackers 1940 “Alan Kay” //往 hackers中添加 “Alan key” 它的score是1940
zrange hackers 0 -1 withscores //按照顺序获取hackers中的所有元素,0表示第一个,-1表示最后一个,同时返回对应元素的分数
zrevrange hackers 0 -1 //按照逆序
复制代码

Bitmaps

它并非一种数据结构,而是在string类型上定义的一种面向bit的操作。它最大的优势是能节省空间

  1. setbit :设置key的特定位置的bit值为0或者1,当key的长度不够会自动扩充
  2. getbit:返回特定索引位置的bit值,范围外的bit返回0
  3. bitop:提供bit级别的操作,包括 AND OR XOR NOT
  4. bitcount:计算bit值是1的个数
  5. bitpos:找到第一个指定的值(指定0或者1)的位置

HyperLogLogs

它是一种概率数据结构,用来统计唯一的值。一般统计唯一的值的时候,需要记录所有已经访问过的元素,这会消耗大量的内存,但是使用HyperLogLogs只需要使用常量的内存,最差的情况下爱只需要12k,此时的精度不会差于1%。

  1. pfadd: 往 其中添加元素
  2. pfcount:计算元素的个数

HyperLogLogs实际只存储了一个状态,并不包含真实的元素的值

redis 官网介绍

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年10月07日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • redis的key
  • 设置key过期
  • String
  • LIST
  • 自动创建和移除keys
  • Hash
  • Set
  • Sorted sets
  • Bitmaps
  • HyperLogLogs
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档