初识Redis数据类型

摘要

Redis 数据类型

下列这些数据类型都可作为值类型:

  • String
  • List
  • Set
  • Sorted Set
  • Hash
  • Bit array
  • HyperLogLog

Redis keys

可以用任何二进制序列作为key值,从形如”foo”的简单字符串到一个JPEG文件的内容都可以。空字符串也是有效key值。

关于key的几条规则:

  • 太长的键值不好。例如1024字节的键值,不仅消耗内存,而且在数据中查找这类键值的计算成本很高。
  • **太短的键值也不好。**如果你要用”u:1000:pwd”来代替”user:1000:password”,这没有什么问题,但后者更易阅读,并且由此增加的空间消耗相对很小。当然,没人阻止您用更短的键值节省一丁点儿空间。
  • 最好保持一种模式。例如:”object-type:id:field”就不错,像这样”user:1000:password”,就像这样:”comment:1234:reply.to”。

Redis String

String是最简单Redis值类型。如果你只用这种类型,Redis就像一个可以持久化的memcached服务器。

关键命令集

命令 描述
SET key value 设置指定 key 的值
GET key 获取指定 key 的值
INCR key 将 key 中储存的数字值加一
DECR key 将 key 中储存的数字值减一
DEL key 删除指定 key 的值
MSET key value [key value …] 同时设置一个或多个 key-value 对
MGET key1 [key2…] 获取所有(一个或多个)给定 key 的值
SETEX key seconds value 将值 value 关联到 key ,
并将 key 的过期时间设为 seconds (以秒为单位)
> set counter 100
OK
> incr counter
(integer) 101
> incr counter
(integer) 102
> incrby counter 50
(integer) 152

mset a 10 b 20 c 30
OK
> mget a b c
1) "10"
2) "20"
3) "30"

> set key 100 ex 10
OK

应用场景

  • 存储值

    用户的session,token,系统状态值等等;

  • 常规计数

    文章浏览数,关注数,收藏数等等的加减操作;

Redis List

Redis List是string类型的列表,按照插入顺序排序。Redis List基于Linked List实现。这意味着即使在一个List中有数百万个元素,在头部或尾部添加一个元素的操作,其时间复杂度也是常数级别的。当然,它也继承了链表的缺点,那就是查找速度相对数组逊色。

扫描二维码关注公众号,回复: 10585762 查看本文章

Redis List用Linked List实现的原因是:因为对于数据库系统来说,能够以非常快的方式将元素添加到非常长的列表中是至关重要的。

关键命令集

命令 描述
LPUSH key value 向指定的左边(头部)添加一个新元素
RPUSH key value 向指定的右边(尾部)添加一个新元素
LRANGE key start stop 获取列表指定范围内的元素
RPOP key 移除列表的最后一个元素,返回值为移除的元素。
LPOP key 移出并获取列表的第一个元素
BLPOP key1 [key2 ] timeout 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
BRPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
> rpush mylist A
(integer) 1
> rpush mylist B
(integer) 2
> lpush mylist first
(integer) 3
> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"

> rpush mylist a b c
(integer) 3
> rpop mylist
"c"
> rpop mylist
"b"
> rpop mylist
"a"

应用场景

  • 数据列表

在博客系统中,你可为每篇博客设置一个List,往List中插入评论内容。用LRANGE可对结果分页。由于内存容量的限制,一般的做法是缓存第一页或者前几页评论内容,当点击查看更多时去查询数据库,这样既能节省内存,有能给用户更好的体验。

  • 消息队列

在队列的众多实现中,链表实现就是其中一种,所以,基于链表实现的Redis List能够作为队列使用就不足为奇了。而且还是一个双端队列,并且支持阻塞。

  • 生产者—消费者模型

redis提供了阻塞式访问 BRPOP 和 BLPOP 命令,来实现生产者和消费者模型。

Redis Hash

Redis hash 是一个 string 类型的 field 和 value 的映射表。hash 特别适合用于存储对象。

关键命令集

命令 描述
HSET key field value 将哈希表 key 中的字段 field 的值设为 value 。
HGET key field 获取存储在哈希表中指定字段的值。
HMSET key field1 value1 [field2 value2 ] 同时将多个 field-value (域-值)对设置到哈希表 key 中。
HMGET key field1 [field2] 获取所有给定字段的值
> hmset user:1000 username antirez birthyear 1977 verified 1
OK
> hget user:1000 username
"antirez"
> hget user:1000 birthyear
"1977"
> hgetall user:1000
1) "username"
2) "antirez"
3) "birthyear"
4) "1977"
5) "verified"
6) "1"

应用场景

  • 存储对象

    例如可以用来存储用户信息,商品信息等。

Redis Set

**Redis Set 是 String 类型的无序集合。**保持集合互异性,这就意味着集合中不能出现重复的数据。Redis Set是通过哈希表实现的

关键命令集

命令 描述
SADD key member1 [member2] 向集合添加一个或多个成员
SISMEMBER key member 判断 member 元素是否是集合 key 的成员
SREM key member1 [member2] 移除集合中一个或多个成员
SUNION key1 [key2] 返回所有给定集合的并集
SDIFF key1 [key2] 返回给定所有集合的差集
SINTER key1 [key2] 返回给定所有集合的交集
> sadd myset 1 2 3
(integer) 3
> sismember myset 3
(integer) 1

应用场景

  • 表示对象间的关系

    例如某宝店铺的关注用户,宝贝的收藏用户等等。

下面表示用户1,2, 5, 77四个用户关注了店铺1000:

> sadd shop:1000:user 1 2 5 77
(integer) 4

有时候我们可能还需要他们的逆关系:用户关注的所有店铺:

> sadd user:1:shop 1000
(integer) 1
> sadd user:2:shop 1000
(integer) 1
> sadd user:5:shop 1000
(integer) 1
> sadd user:77:shop 1000
(integer) 1

当然,我们可能还需要用户1,2, 5, 77关注了的所有店铺:

> sinter user:1:shop user:2:shop user:5:shop user:77:shop
... results here ...

Redis Sorted Set

**Redis Sorted set 和 Set 一样也是string类型元素的集合,且不允许重复的成员。**不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。Redis Sorted Set是通过哈希表实现的。

排序规则:

  • 如果 A.score > B.score,则 A > B。
  • 如果 A.score = B.score,那么则按照字典序对A、B进行排序。

关键命令集

命令 描述
ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合指定区间内的成员
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员
ZREM key member [member …] 移除有序集合中的一个或多个成员
ZRANK key member 返回有序集合中指定成员的索引
> zadd hackers 1940 "Alan Kay"
(integer) 1
> zadd hackers 1957 "Sophie Wilson"
(integer) 1
> zadd hackers 1953 "Richard Stallman"
(integer) 1

> zrange hackers 0 -1
1) "Alan Turing"
2) "Richard Stallman"
3) "Sophie Wilson"

应用场景

  • 排行榜

    Sorted Set十分适合做排行榜,特别是小规模的数据,比如top5,top10等等。

通用命令集

命令 描述 示例
SET key value 设置指定 key 的值 > set mykey hello
OK
EXISTS key 指定key是否存在 > exists mykey
(integer) 1
DEL key 删除指定 key 的值 > del mykey
(integer) 1
TTL key 查看key对应的值剩余存活时间 > ttl key
(integer) 9

总结

  • Bit array

  • HyperLogLog

    关于这两个的内容,后面补充。

参考

[1] An introduction to Redis data types and abstractions.

发布了16 篇原创文章 · 获赞 56 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_36011946/article/details/105378057