Redis_DataType

Redis_DataType.html

Redis-DataType

Redis是一个键值对型的数据库,但是支持多种数据结构。具体如下:

  • Binary-safe strings 意义为在进行对二进制的解码和编码时,不具有特殊字符,如转义字符,char数组中的\0,结尾加null等都不是二进制安全的。关键在于读写无格式。
  • Lists 基于链表机制的列表,按照插入的顺序排列。
  • Sets 内部元素唯一,无序的集合。
  • Sorted sets 和Set类似,不过每一个String都关联着一个浮点数,为分数。这也是排序的依据。同时该数据结构和Sets不同,支持范围取元素。
  • Hashes 图结构,键值都是String类型。
  • Bit arrays 通过特殊的命令,可以将String转化为bit array的形式,可以单独地操作某一位。
  • HyperLogLogs 是一种概率结构模型,用来估计集合的基数。(注:基数就是指在一个集合中不同元素的个数)

Strings

主要命令:
Set: 设置键值对的值,最后加可选参数nx是如果不存在,则定义,存在则不覆盖。xx是当存在再设定。ex后面跟int表明key存在的时间,类似于EXPIRE。

Get: 返回键值对的值

INCR: 当value值为整数时,会自增,注意这里的自增是线程安全的。如果不是该种类型就报错。

INCRBY: 后面跟key + int数值,增加多少,同样是线程安全的。(同样由DECR,DECRBY是减少。)

GETSET: 设置键值对的新值,但是返回的是老值,未改变之前的值。

MGET,MSET: 同GET,SET不过是一次针对多个键值对的,类似于对list的赋值。

EXISTS: 存在返回1,不存在返回0

DEL: 删除键值对,记得同样是删除成功返回1,不成功返回0

TYPE: 返回输入的value的类型。对于空的键值对返回none。

EXPIRES: 设置一个键值对的过期时间,在过期之后会自动DEL,和用户操作的效果一致。
(设置可以使用seconds和milliseconds,但是分辨率是milliseconds。并且Redis记录了准确的销毁时间,所以即使在key销毁前server已经shutdown,仍然可以在server重新运行时得到正确的处理。)
EXPIRE可以重入。

PERSIST: 直接持久化,在EXPIRE时期可以打断计时,将键值对持久化。

TTL: 可以查询key还能存活的时间,

PEXPIRE、PTTL:分别是EXPIRE和TTL的milliseconds版本。


Lists

Redis中的Lists是以链表为基础设置的。所以在头尾增减元素十分快,但是在链表中间寻找特定元素会比较慢,如果需要则应该选用Sorted Sets。特别地:Redis中的Lists是左边是头,右边是尾,因此对头操作是LXXX,对尾操作是RXXX。
两种适用场景为:

  1. 更新数据
  2. 在进程间通讯,简单的生产-消费者模式。

主要命令:
LPUSH、RPUSH: 分别在头尾添加新元素,可以一次添加多个。

LRANGE: 查找范围内的Lists元素,LRANGE mylists 0 -1 这里的参数中第一个参数是寻找范围的起始地址,后面的是终止地址。而终止元素支持负数,末尾是-1,倒数第二是-2,依次类推。(特别地:不支持逆向寻址,即始终保持从头开始的顺序性,如 LRANGE mylists -1 -2 是error,但是LRANGE mylists -2 -1 就可以得到正确的结果。怀疑是单向链表的实现缘故。

LPOP、RPOP: 弹出元素,并且在元素list中删除元素。同样左右。对一个空的Lists进行POP得到nil,而每个空List都有一个null元素占位。

LTRIM: 产生有上限的Lists(Capped Lists),只存在最新的N个元素,对一个已经存在的Lists使用,则会对Lists产生截断效果。LTRIM nylists 0 2会保留0到2的元素,其余元素丢弃。

BRPOP、BLPOP: 是BPOP和LPOP的Blocked版本,当取不到元素时会Block,后面跟时间是等待时间 BRPOP mylists 6在6秒内如果还是拿不到元素就返回nil。但是等待时间设置为0,则会无限等待。(特别地:BRPOP支持多个Lists同时操作,所以针对多个Lists时有):

1. Clients会以进入的次序响应:如,第一个client在取元素时被Block,而在第二个client的push操作后,第一个client会首先得到元素,而不是后面的第三,第四。
2. BRPOP、BLPOP的返回值和LPOP、RPOP不同(由于支持多个Lists同时操作),BLOCK版本的返回一个有两个元素的Array,第一个元素代表了取出元素的Lists名。
3. 阻塞时间到则返回nil。

(B)RPOPLPUSH: 将source的List中的尾部元素,放到destination的List的头部,线程安全的,不会出现多个client的冲突。可以实现Block Operation的安全操作。如果source和destination都是同一Lists则是对Lists的旋转,形成Circle Lists。


Hashes

Redis中的Hashes和普通数据结构中的hashmap一样,

主要命令:

HSET、HGET: 单个定义hashmap中元素的一个属性,一次一个。

HMSET、HMSET: 批量定义hashmap中元素的不同属性,一次多个。

HGETALL: 仅给出元素名,得到元素的全部属性。

HINCRBY: 对于元素域中的属性中的数字自增一个int。


Sets

Redis中的Sets是一个无序的String集合,不允许重复。适用于数据间结构关系的表现,比如一个元素可以有多个tags,可以在该元素上有个set,表示同那几个tag相关。也可以每个tag维护一个set,表示都有哪些元素属于这个tag。

主要命令:

SADD: 向一个Set集合中加入元素。

SMEMNERS: 返回当前Set中所有的元素。

SISMENBER: 在Set中返回1,否则返回0。

SINTER: 返回多个Set中相同的部分(交集)。

SPOP: 将集合中的元素弹出。

SUNION、SUNIONSTORE: SUNION返回多个几个的并,而SUNIONSTORE将后面参数中的集合做交集并存储在另一个set中。

SCARD: 返回当前Set中的基数

SRANDMEMBER: 从Redis2.6开始,当附加参数为负数则返回有重复的随机元素,个数是附加参数的绝对值,而当附加参数是正数时,则返回不重复的元素,如果正数大于Sets的size则返回所有的元素。


Sorted Sets

Sorted Sets类似Sets和Hashes的混合,Sorted Sets中的所有元素都是唯一的String Elements,但是每一个元素都维护一个浮点数Score,正是排序的标准。

排序的标准:

  1. 如果A,B两个元素拥有不同的score,则依据score来判断A > B。
  2. 如果A,B两个元素的score相同,则依据A,B两个元素的字典顺序判断A > B。

每当新添加一个元素,Sorted Sets都会更新,所以适合于大量更新的排行榜等应用。

主要命令:
ZADD: 同SADD,不过在增加的元素前有一个score值需要添加。

ZRANGE: 同LRANGE,其中0代表第一个元素,-1代表遍历整个集合。加上withscores会同时显示出score。

ZREVRANGE: 同ZRANGE反向的排序结果。

ZRANGEBYSCORE: 可以对排序进行操作,如 ZRANGEBYSCORE hackers -inf 1950 得到score从负的无穷到1950的全部元素。

ZREMRANGEBYSCORE: 可以移除在一个区间内的元素。返回移除的元素的数目。

Z(REV)RANK: 给出制定元素的排序值。正向\反向

Z(REV)RANGEBYLEX: 得到按照字典顺序排序的结果。可以有参数,根据首字母等排序,具体可以查看命令的文档。

ZREMRANGEBYLEX: 按照字典顺序移除元素。


Bitmap

Bitmaps不是一种数据结构,本质上是一系列针对String的Bits操作。最大容量2^32bits。

主要命令:

SETBIT: 对一个String的key中的某一个元素位置位,第一个参数是被置位在该key中的位置,第二位是1或者0,对于超出该key范围的置位,会自动延伸该String。

GETBIT: 参数同SETBIT,得到某一key上的某一位的bit值,默认是0,且超出key的查询同样会自动延长key。

BITOP: 提供AND,OR,XOR,NOT四种位操作的模式,具体的应用规则看文档。长度不一的String就会补零到同等长度。

BITCOUNT: 返回String中设置为1的位的个数。


HYPERLOGLOGS

只知道是估算Sets中的基数的,具体不懂。这里先省略,具体需要使用时再去参考文档。

generated by haroopad

你可能感兴趣的:(redis)