redis支持的数据结构

栏目: 数据库 · 发布时间: 7年前

内容简介:key可以包含任意得字符,比如将一张JPEG文件内容作为key。空字符串也是一个有效的key。redis的key使用时,有一些建议:EXPIRE 命令用来设置过期使用 PERSIST 可以去掉过期时间,永久保留 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: 对单个字段进行递增操作
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中唯一值的个数(集合论中的基数)
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的排序位置
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)的位置

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Game Engine Architecture, Second Edition

Game Engine Architecture, Second Edition

Jason Gregory / A K Peters/CRC Press / 2014-8-15 / USD 69.95

A 2010 CHOICE outstanding academic title, this updated book covers the theory and practice of game engine software development. It explains practical concepts and techniques used by real game studios,......一起来看看 《Game Engine Architecture, Second Edition》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具