这是我参与「第五届青训营 」伴学笔记创作活动的第2天
这是Redis-大厂程序员是怎么用的这节课的课堂笔记。
Redis简介
redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。目前,VMware在资助其开发与维护。
Redis的各个数据结构
Redis是一种高级的key:value存储系统,其中value支持五种数据类型:字符串,字符串列表,字符串集合,有序字符串集合,哈希。
另外,关于key也有一些注意点:key既不能太长也不能太短,太长的话,会消耗内存和降低查找的效率,太短的话,也会降低key的可读性,在一个项目中,最好是使用统一的命名格式(user:10000:pwd)
数据结构——strings
有人说,如果只使用redis中的字符串类型,且不使用redis的持久化功能,那么,redis就和memcache非常非常的像了。这说明strings类型是一个很基础的数据类型,也是任何存储系统都必备的数据类型。用法如下:
set mystr "hello world!"
get mystr
set mynum "2"
incr mynum
在遇到数值操作时,redis会将字符串类型转换成数值。由于INCR等指令本身就具有原子操作的特性,所以我们完全可以利用redis的INCR、INCRBY、DECR、DECRBY等指令来实现原子计数的效果。不少网站都利用redis的这个特性来实现业务上的统计计数需求。
数据结构——lists
首先要明确一点,redis中的lists在底层实现上并不是数组,而是链表,也就是说对于一个具有上百万个元素的lists来说,在头部和尾部插入一个新元素,其时间复杂度是常数级别的,比如用LPUSH在10个元素的lists头部插入新元素,和在上千万元素的lists头部插入新元素的速度应该是相同的。
lists的常用操作包括LPUSH、RPUSH、LRANGE等。我们可以用LPUSH在lists的左侧插入一个新元素,用RPUSH在lists的右侧插入一个新元素,用LRANGE命令从lists中指定一个范围来提取元素。用法如下:
lpush mylist "1"
rpush mylist "2"
lrange mylist 0 1
lists的应用相当广泛,随便举几个例子:我们可以利用lists来实现一个消息队列,而且可以确保先后顺序,不必像MySQL那样还需要通过ORDER BY来进行排序。利用LRANGE还可以很方便的实现分页的功能。在博客系统中,每篇博文的评论也可以存入一个单独的list中。
数据结构——集合
redis的集合,是一种无序的集合,集合中的元素没有先后顺序。集合相关的操作也很丰富,如添加新元素、删除已有元素、取交集、取并集、取差集等。用法如下:
sadd myset "one"
smembers myset
sismember myset "one"
sunion myset yourset
常见的使用场景有QQ有一个社交功能叫做“好友标签”,大家可以给你的好友贴标签,比如“大美女”、“土豪”、“欧巴”等等,这时就可以使用redis的集合来实现,把每一个用户的标签都存储在一个集合之中。
数据结构——有序集合
redis不但提供了集合,还很体贴的提供了有序集合。有序集合中的每个元素都关联一个序号(score),这便是排序的依据。很多时候,我们都将redis中的有序集合叫做zsets,这是因为在redis中,有序集合相关的操作指令都是以z开头的,比如zrange、zadd、zrevrange、zrangebyscore等等。用法如下:
zadd myzset 1 baidu.com
zadd myzset 2 google.com
zrange myzset 0 -1 with scores
zrange myzset 0 -1
数据结构——哈希
hashes存的是字符串和字符串值之间的映射,比如一个用户要存储其全名、姓氏、年龄等等,就很适合使用哈希。用法如下:
HMSET user:001 username antirez password P1pp0 age 34
HGETALL user:001
HSET user:001 password 12345
这篇文章主要记录了Redis的主要的数据结构。