redis 数据结构

Redis 数据库是一款依赖 BSD 开源协议的高性能 Key-Value 数据存储系统,通常又被称为结构服务器,因为它远程支持了几种常用的数据结构,给程序设计带来相当大的便利和性能提升,目前 3.05 版本支持七种类型的数据结构,分别为,string、hashes、lists、sets、sorted sets、bitmaps 和 hyperloglogs 七种数据结构。

Key 操作

redis 数据库都是以 键值对 的形式存储数据的,数据值可以有不同数据类型和数据结构,对于键来说都是字符串,可以通过操作相应的建来操作对应的数据值。同时,redis 数据库也提供了丰富的键操作接口命令,这里首先在 redis 数据库中添加以下数据,接着时用想应的数据库操作命令得到对应结果。

设置的键:

1
2
3
SET newKey "hello"
SET timeKey "time"
SET testKey "10"
  • KEYS(KEYS pattern) :查找符合 pattern 模式的 key:Keys t.*:返回 testKey 和 timeKey
  • EXISTS(EXISTS key):查询一个 key 是否存在:EXISTS testKey:返回1,表示存在
  • TYPE(TYPE key):获取 key 存储元素的类型:TYPE testKey:返回 string,表示字符串类型
  • EXPIRE(EXPIRE key secconds):设置 key 的生存时间,单位为秒:EXPIRE timeKey 10 :返回1,表示设置成功,返回 0 表示设置失败
  • TTL(TTL key):获取 key 的剩余时间,单位我秒:TTL timeKey :返回8,即有效时间为8秒
  • RENAME(RENAME key newkey):将一个key 重命名为 newkey:RENAME testKey otherKey:返回 ok,可以通过 GET 获取 otherKey 的值
  • DEL(DEL key [key]):移处一个或多个指定的 key :DEL ohterKey :返回 1,表示返回删除成功

字符串 (String) 数据结构

对于字符串数据结构来说,每个键对应一个字符串的值,如果是数值可以进行普通加减,也可以进行相应的位操作。下面介绍几个常用的字符串操作命令。

  • SET(SET key value):设置一个 key 的 valse 值:SET testKey “hello”:通过 SET testKey 获取 “hello” 值
  • GET(GET key):获取 key 的值:GET testKey:返回 “hello”
  • INCR(INCR key):将 key 键对应存储的数字加 1:SET numKey “10”, INCR numKey:返回 11
  • DECR(DECR key):同上相反
  • MSET(MSET key value [key value]):同时设置一个或多个键值对:MSET tKey1 “hello” tKey2 “world”:返回 ok 状态,表示设置成功
  • SETBIT(SETBIT key index value):设置字符串一个 bit 位的值:SETBIT bitKey 5 1:返回 0 ,即之前第 5 位的值为 0,现在已经设置为 1
  • GETBIT(GETBIT key index):返回相对应 bit 位上的值:GETBIT bitKey 5:返回 1
  • BITCOUNT(BITCOUNT key):统计字符串中设置 1 的 bit 位总数:BITCOUNT bitKey :返回 1,表示只有一个 bit 位被设置为 1

哈希(Hash)数据结构

对于哈希数据结构来说,相应键上对应的值为一个哈希结构,相当于散列表,只是该散列表中对应的值只能是字符串或数据值类型,不能是对象。

  • HSET(HSET key field value):设置哈希 key 里面的一个字段 field 的值为 value:HSET userHash name “lily”:返回 1,表示设置了 userHash 新的字段
  • HGET(HGET key field):获取哈希 key 字段 field 的值:HGET userHash name:返回 “lily”
  • HMSET(HMSET key field value [field value]):同时设置哈希 key 的一个或多个字段值:HMSET uerHash2 name “lily” age 18:返回 “ok” 状态码,表示设置成功
  • HMGET(HMGET key field [field …]):获取哈希 key 的一个或多个字段值:HMGET userHash2 name age:返回 “lily” 和 “18”
  • HGETALL(HGETALL):获取哈希 key 的所有字段和值:HGETALL uerHash2:返回 “name”、”lily”、”age”、和 “18”
  • HVALS(HVALS key):获取哈希 key 的所有值:HVALS userHash2:返回 “lily” 和 “18”
  • HDEL(HDEL key field [field …]):删除一个或多个哈希 key 的字段 field:HDEL userHash2 name age|返回 2,表示成功删除两个字段

列表(List) 数据结构

利用列表数据结构,可以实现诸如队列、等一些高级的特性,如消息队列就可以使用列表来实现。列表分为列表头和列表尾,列表的左端或前端称为列表头,列表的有端后端称为列表尾。

  • LPUSH(LPUSH key value [value …]):将一个或多个值差入到列表头:LPUSH testList “hello”:返回 1,表示列表长度为 1
  • RPUSH(RPUSH key value [value …]):将一个或多个值插入到列表尾:RPUSH testList “world”:返回2,表示列表长度目前为 2
  • LLEN(LLEN key) :返回列表的长度:LLEN testList:返回 2,表示列表 testList 长度为 2
  • LRANGE(LRANGE key start stop):获取指定列表的指定区间的值:LRANGE testList 0 -1:返回 “hello” 和 “world”
  • LINSERT(LINSERT key BEFORE|AFTER privot value):将插入到列表中并位于值 pivot 之前或之后:LINSERT testList BEFORE “world”,”the”:返回 3,将在 “world” 值之前插入 “the”
  • LINDEX(LINDEX key index):获取列表下标为 index 的值:LINDEX test 0:返回 “hello”,返回列表的第一值
  • LSET(LSET key index value):将列表下标为 index 的值设置为 value:LSET testList 1 “all”:将列表中第个元素值 “the” 修改为 “all”
  • LPOP(LPOP key) :弹出列表左边/头元素:LPOP testLIST:返回 “hello”,移除列表中最一个元素 “hello”
  • RPOP(RPOP key):弹出列表右边/尾元素:RPOP testList:返回 “world”,移除列表最后一个元素 “sorld”

集合(Set) 数据结构

集合数据结构要求集合内的值不能重复,同时集合内的元素没有顺序之分,集合之间可以实现交、差、并等关系运算。下面介绍几种常用集合操作命令。

  • SMEMBERS(SMEMBERS key):返回集合中的所有元素:SMEMBERS testSet:返回 testSet 集合的全部元素,即 “a”、”b”、”c”
  • SISMEMBER(SISMEMBER key mem):判断元素 mem 是否在集合内:SISMEMBER testSet “a”:返回 1,表示元素 “a” 在集合 testSet 中
  • SCARD(SCARD key):返回集合的基数:SCARD testSet:返回 3,表示集合 testSet 中有三个元素
  • SMOVE(SMOVE src des mem):将元素 mem 从 src 集合中移动到 des 集合中:SMOVE tesSet otherset ‘b’:返回 1,表示 “b” 元素成功从 tesSet 集合中移除,添加进 otherSet 集合中
  • SRANDMEMBER(SRANDMEMBER key):返回集合中一个随机元素:SRANDMEMBER testSet:返回 “c”,返回一个随机元素,集合不变
  • SUNION(SUNION key [key …]):返回一个或多个集合的并集:SUNION testSet otherSet:返回 ‘a’、’c’、’b’ 即集合 testSet(‘a’,’c’) 和 otherSet(‘b’)的并集
  • SUNIONSTORE(SUNIONSTORE des key [key …]):将返回的集合并集保存到 des 集合中:SUNIONSTORE threeSet testSet otherSet:返回 3,将 testSet 和 otherSet 集合并集保存到 threeSet 中,threeSet 中的元素 为 “a”、”c”、”b”
  • SDIFF(SDIFF key [key …]):返回所有集合差集的所有元素:SDIFF threeSet testSet:返回 ‘b’,即两个集合的差集
  • SINTER(SINTER key [key …]):返回所有集合的交集:SINTER testSet threeSet:返回 ‘a’、’c’,即两个集合的交集

前面主要讨论了 redis 数据库的键的操作,并对四种数据结构(字符串、哈希、列表和集合)的模型和操作进行了简单的介绍。下面对其他三种结构模型进行简单介绍。

  • 有序集合(Sorted set)实际上是在集合的基础上为每个元素添加的权重,使得集合元素具有了顺序,权重小的在前/左,权重大的在后/右。
  • 位图(bitmap)可以看做是大型的字符串,可变字符串由于在长度增加时需要重新开辟一块空间,所以将原来的字符串复制到当前位置时要增大一定的空间,但大的字符串的复制很占内存,如果复制频率过高则严重影响性能,特别是大数据处理这种情况,而使用 bitmap 可以一次分配很大连续空间,最大为 512MB,这样可以存储很大的数据而不存在大数据的复制问题。
  • hypurloglogs 是专门为大数据存储设计的一中数据结构,相当于对数据进行压缩存储,普通的数据通过hyperloglogs 存储后占用的空间相当于原来占用空间的百分之一左右,对与大数据的存储和处理有很重要的意义。这就是 redis 数据库关于数据结构的基本内容,发布、订阅等功能在 Laravel 框架的 redis 应用中再进行介绍。