Redis常用五种数据类型

Redis 属于称为键值存储的数据库家族。

键值存储的本质是能够在键内存储一些称为值的数据。只有当我们知道用于存储它的确切密钥时,才能稍后检索这些数据。

Redis 通常将它称为数据结构服务器,因为它具有外部键值外壳,但是每个值都可以包含复杂的数据结构,例如字符串、列表、散列或称为排序集以及概率的有序数据结构像 hyperloglog 这样的数据结构。

一、字符串

作为第一个示例,我们可以使用命令SET将值“fido”存储在键“server:name”处:

	SET server:name "fido"

Redis 将永久存储我们的数据,因此我们稍后可以问“key server:name 中存储的值是什么?” Redis 会回复“fido”:

	GET server:name => "fido"

有一个命令可以测试给定密钥是否存在:

	EXISTS server:name => 1
	EXISTS server:blabla => 0

Redis 提供的其他基本操作是DEL删除给定的键和关联的值, INCR以原子方式递增存储在给定键上的数字:

    SET connections 10
    INCR connections => 11
    INCR connections => 12
    DEL connections
    INCR connections => 1

还可以将键中包含的数字增加特定数量:

    INCRBY connections 100 => 101

并且有类似的命令可以减少键的值。

    DECR connections => 100
    DECRBY connections 10 => 90

当您使用递增和递减命令操作 Redis 字符串时,您正在实现counters。计数器是 Redis 非常流行的应用程序。
INCR有一些特别之处。如果我们自己用一点代码就可以完成,为什么要提供这样的操作呢?毕竟它很简单:

	x = GET count
	x = x + 1
	SET count x

问题是,以这种方式进行增量只会在只有一个客户端使用密钥时才有效。看看如果两个客户端同时访问这个密钥会发生什么:

  • 1.客户端 A 读取计数为 10。
  • 2.客户端 B 读取计数为 10。
  • 3.客户端 A 增加 10 并将计数设置为 11。
  • 4.客户端 B 增加 10 并将计数设置为 11。

我们希望值是 12,但它是 11!这是因为以这种方式增加值不是原子操作。在 Redis 中调用 INCR命令将防止这种情况发生,因为它是一个原子操作。

单个命令实现的所有Redis操作都是原子的,包括对更复杂数据结构的操作。因此,当您使用修改某些值的 Redis 命令时,您不必考虑并发访问。

Redis 可以设置一个键的过期时间。通过与EXPIRE和TTL命令,并且由类似PEXPIRE和PTTL进行操作的使用时间以毫秒为单位的而不是秒的命令。

    SET resource:lock "Redis Demo"
    EXPIRE resource:lock 120

这会导致在 120 秒内删除关键资源:锁。您可以使用TTL命令测试密钥将存在多长时间。它返回将被删除之前的秒数。

    TTL resource:lock => 113
    // after 113s
    TTL resource:lock => -2

密钥的TTL的-2表示密钥不存在(不再存在)。一个-1的TTL表示它永远都不会过期的。请注意,如果您设置一个键,它的TTL将被重置。

    SET resource:lock "Redis Demo 1"
    EXPIRE resource:lock 120
    TTL resource:lock => 119
    SET resource:lock "Redis Demo 2"
    TTL resource:lock => -1

该SET命令能够接受进一步的参数,直接设置生存时间(TTL)到一个键,这样你就可以改变一个键的值,并在单个原子操作,同时设置其TTL:

    SET resource:lock "Redis Demo 3" EX 5
    TTL resource:lock => 5

也可以取消密钥的生存时间,删除过期并再次使密钥永久。

    SET resource:lock "Redis Demo 3" EX 5
    PERSIST resource:lock
    TTL resource:lock => -1

二、列表

Redis 还支持几种更复杂的数据结构。我们要看的第一个是一个列表。列表是一系列有序值。一些与列表交互的重要的命令是RPUSH,LPUSH,LLEN,LRANGE,LPOP和RPOP。您可以立即开始使用作为列表的键,只要它尚未作为其他类型存在。

这个概念通常适用于每个 Redis 数据结构:您不必先创建一个键,然后再向其添加内容,但您可以直接使用该命令来添加新元素。作为副作用,如果密钥不存在,则将创建该密钥。类似地,在执行某些命令后将导致空的键将自动从键空间中删除。

RPUSH将新元素放在列表的末尾。

    RPUSH friends "Alice"
    RPUSH friends "Bob"

LPUSH将新元素放在列表的开头。

    LPUSH friends "Sam"

LRANGE给出了列表的一个子集。它将您要检索的第一个元素的索引作为其第一个参数,并将您要检索的最后一个元素的索引作为其第二个参数。第二个参数的值 -1 表示检索元素直到列表末尾,-2 表示包括倒数第二个,依此类推。

    LRANGE friends 0 -1 => 1) "Sam", 2) "Alice", 3) "Bob"
    LRANGE friends 0 1 => 1) "Sam", 2) "Alice"
    LRANGE friends 1 2 => 1) "Alice", 2) "Bob"

到目前为止,我们探索了让您向列表添加元素的命令,以及让您检查列表范围的LRANGE。Redis 列表的一个基本功能是能够删除列表的头部或尾部元素,并同时将其返回给客户端。

LPOP从列表中删除第一个元素并返回它。

    LPOP friends => "Sam"

RPOP从列表中删除最后一个元素并返回它。

    RPOP friends => "Bob"

请注意,列表现在只有一个元素:

    LLEN friends => 1
    LRANGE friends 0 -1 => 1) "Alice"

既RPUSH和LPUSH命令是可变参数,以便可以指定在相同的命令执行多个元件。

    RPUSH friends 1 2 3 => 4

提示:RPUSH 和 LPUSH 返回操作后列表的总长度。

您还可以使用LLEN获取列表的当前长度。

    LLEN friends => 4

三、Set

我们将研究的下一个数据结构是集合。集合类似于列表,但它没有特定的顺序,每个元素只能出现一次。这两种数据结构都非常有用,因为虽然在列表中可以快速访问顶部或底部附近的元素,并且元素的顺序被保留,但在集合中测试成员资格非常快,即立即知道是否添加了给定元素。此外,在一个集合中,一个给定的元素只能存在于一个副本中。

使用集合的一些重要命令是SADD、SREM、SISMEMBER、SMEMBERS和SUNION。

SADD将给定的成员添加到集合中,同样这个命令也是可变参数。

    SADD 超能力"飞行"
    SADD 超能力 "X 射线视觉" "反射"

SREM从集合中删除给定成员,返回 1 或 0 以表示该成员是否实际存在。

	SREM 超能力 "反射" => 1
    SREM 超能力 "制作披萨" => 0

SISMEMBER测试给定的值是否在集合中。如果值存在则返回1,否则返回0。

    SISMEMBER 超能力 "飞行" => 1
    SISMEMBER 超能力 "反射" => 0

SMEMBERS返回该集合的所有成员的列表。

    SMEMBERS 超能力=> 1"飞行"2"X 射线视觉"

SUNION组合两个或多个集合并返回所有元素的列表。

    SADD 鸟力 "啄食" 
    SADD 鸟力 "飞行" 
    SUNION 超能力鸟力=> 1)"啄食"2)"X 射线视觉"3)"飞行"

命令的返回值SADD是作为一个重要的SREM。如果我们尝试添加的元素已经在里面,则返回 0,否则 SADD返回 1:

    SADD 超能力 "飞行" => 0
    SADD 超能力 "隐形" => 1

集合也有一个与LPOP和RPOP非常相似的命令 ,以便从集合中提取元素并将它们在单个操作中返回给客户端。然而,由于集合不是有序的数据结构,因此在这种情况下返回(和删除)的元素是完全随意的。

    SADD 字母 a b c d e f => 6
    SPOP 字母 2 => 1) "c" 2) "a"

键名后的SPOP参数是我们希望它返回并从集合中删除的元素数。
现在该集合将只有剩余的元素:

    SMEMBERS 字母=> 1) "b" 2) "d" 3) "e" 4) "f"

还有一个命令可以返回随机元素而不从集合中删除这些元素,它被称为SRANDMEMBER。您可以自己尝试,参数类似于SPOP,但如果您指定负数而不是正数,它也可能返回重复元素。

四、ZSet


集合是一种非常方便的数据类型,但由于它们是未排序的,因此它们不能很好地解决许多问题。这就是 Redis 1.2 引入 Sorted Sets 的原因。

排序集类似于常规集,但现在每个值都有一个关联的分数。该分数用于对集合中的元素进行排序。

    ZADD hackers 1940 "Alan Kay"
    ZADD hackers 1906 "Grace Hopper"
    ZADD hackers 1953 "Richard Stallman"
    ZADD hackers 1965 "Yukihiro Matsumoto"
    ZADD hackers 1916 "Claude Shannon"
    ZADD hackers 1969 "Linus Torvalds"
    ZADD hackers 1957 "Sophie Wilson"
    ZADD hackers 1912 "Alan Turing"

在这些例子中,分数是出生年份,值是著名黑客的名字。

    ZRANGE hackers 2 4 => 1) "Claude Shannon", 2) "Alan Kay", 3) "Richard Stallman"

返回有序集 hackers 中,下标在 2 和 4 之间的元素

五、哈希


简单的字符串、集合和排序集合已经完成了很多工作,但 Redis 还可以处理另一种数据类型:哈希。

哈希是字符串字段和字符串值之间的映射,因此它们是表示对象的完美数据类型(例如:具有姓名、姓氏、年龄等多个字段的用户):

    HSET user:1000 name "John Smith"
    HSET user:1000 email "john.smith@example.com"
    HSET user:1000 password "s3cret"

要取回保存的数据,请使用HGETALL:

   HGETALL user:1000

您还可以一次设置多个字段:

     HMSET user:1001 name "Mary Jones" password "hidden" email "mjones@example.com"

如果您只需要一个可能的字段值:

    HGET user:1001 name => "Mary Jones"

散列字段中的数值的处理方式与简单字符串中的完全相同,并且有一些操作可以以原子方式增加该值。

    HSET user:1000 visits 10
    HINCRBY user:1000 visits 1 => 11
    HINCRBY user:1000 visits 10 => 21
    HDEL user:1000 visits
    HINCRBY user:1000 visits 1 => 1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值