文章目录
摘要
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中有数百万个元素,在头部或尾部添加一个元素的操作,其时间复杂度也是常数级别的。当然,它也继承了链表的缺点,那就是查找速度相对数组逊色。
![](/qrcode.jpg)
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
关于这两个的内容,后面补充。