一、前置知识
为什么会出现Redis
二、安装Redis
三、Redis的基本使用
1、Redis支持的数据类型
Redis中有许多数据类型,常见的有String(字符串)、Hashes(散列)、lists(列表)、sets(集合)、sorted sets(有序集合)、bitmap(位图)、 hyperloglogs 和 geospatial(地理空间)
在使用Redis之前,我们需要知道Redis的key是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如”foo”的简单字符串到一个JPEG文件的内容都可以。因为key本身就是byte数组没有任何编码。同时对于key的使用也有一些小建议
- 太长的键值不是个好主意,例如1024字节的键值就不是个好主意,不仅因为消耗内存,而且在数据中查找这类键值的计算成本很高。
- 太短的键值通常也不是好主意,如果你要用”u:1000:pwd”来代替”user:1000:password”,这没有什么问题,但后者更易阅读,并且由此增加的空间消耗相对于key object和value object本身来说很小。
- 最好坚持一种模式。例如:”object-type🆔field”就是个不错的注意,像这样”user:1000:password”。我喜欢对多单词的字段名中加上一个点,就像这样:”comment🔢reply.to”。
翻译自官网
1.1、String
(1)首先先学习一下最常见的类型String,String作为最基本的类型同时也是使用较多的类型。Redis中的String底层是基于byte[] (字节数组)。下面我们整理一下Redis中的String类型包含有哪些命令
(完整:http://redis.cn/commands.html#string)
这里需要注意的是INCR:执行原子+1操作,在我们常规认识中字符串类型是不能做加1,例如“1”+1 应该是“11”,但是在Redis中会变成2。所以我们猜测Redis是将我们存入的“18”改了“数据类型”从字符串转成了整数类型。那么事实是否这样呢?
在Redis中有这么两个命令type 和OBJECT encoding用于获取value的类型已经编码。例如我们现在重新创建一个key money,value = 100
所以这里给出一个结论,在Redis中key和value是如下图的形式存储的。
(2)应用场景
String类型的应用场景还是非常多的,对于简单系统来说甚至可以只使用String类型来充当缓存。(毕竟可以将对象转成JSON字符串)。当然除了get/set之外,INCR和DECR也是们经常使用的。
DECR(减少1)有一个很经典的使用场景:预减库存。例如在电商业务的秒杀场景,我们就可以利用Redis的DECR来做预减库存来减少数据库的压力,即优先减少Redis中的数量,当Redis中的数量为0时表示秒杀完毕之后再多的请求都拒绝,从而能够大幅度的减少数据库层面的压力。
1.2、Lists
1、Redis中的List底层是Linked List(链表),所以在Redis的List在头尾部插入的效率是非常高的,时间复杂度为O(1)。常用的命令如下
注意点:redis中的list的最大长度为 2^32 - 1 (4,294,967,295)
2、使用场景
Redis中的List可以用于构建一些类似栈(先入后出)、队列等功能,同时也List也提供了阻塞的功能
Lists support several blocking commands. For example:
- BLPOP removes and returns an element from the head of a list. If the list is empty, the command blocks until an element becomes available or until the specified timeout is reached.
- BLMOVE atomically moves elements from a source list to a target list. If the source list is empty, the command will block until a new element becomes available.
列表支持多个阻塞命令。例如:
BLPOP从列表的头部删除并返回一个元素。如果列表为空,则命令会阻塞,直到元素变为可用或到达指定的超时。
BLMOVE将元素从源列表原子地移动到目标列表。如果源列表为空,该命令将阻塞,直到有新元素可用。
1.3、Sets
1、Redis中的Set是无序集合,同时带有去重功能。常用的命令如下
注意点:Redis集合的最大大小是2^32 - 1(4,294,967,295),大多数集合操作,包括添加、删除和检查项是否为集合成员,都是O(1)。但是,对于具有数十万元素或更多元素的大型集合,在运行members命令时应该谨慎。这个命令是O(n),在一个响应中返回整个集合。作为一种替代方案,可以考虑SSCAN。