Redis超详细教程
1 Redis教程
1.1 Redis简介
1.1.1 Redis 简介
Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
1.1.2 Redis 优势
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
1.1.3 Redis与其他key-value存储有什么不同?
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
1.2 Redis安装
1.3 Redis配置
1.4 Redis数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
1.4.1 String(字符串)
string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。
实例:
[root@localhost src]# ./redis-cli --raw
127.0.0.1:6379> AUTH root
OK
127.0.0.1:6379> SET name "张三"
OK
127.0.0.1:6379> GET name
张三
127.0.0.1:6379>
在以上实例中我们使用了 Redis 的 SET 和 GET 命令。键为 name,对应的值为 张三。
注意:一个键最大能存储 512MB。
1.4.2 Hash(哈希)
Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
实例:
DEL name 用于删除前面测试用过的 key,不然会报错:(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> DEL name
1
127.0.0.1:6379> HMSET name field1 "Hello" field2 "World"
OK
127.0.0.1:6379> HGET name field1
Hello
127.0.0.1:6379> HGET name field2
World
127.0.0.1:6379>
实例中我们使用了 Redis HMSET, HGET 命令,HMSET 设置了两个 field=>value 对, HGET 获取对应 field 对应的 value。
每个 hash 可以存储 232 -1 键值对(40多亿)。
1.4.3 List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
实例:
127.0.0.1:6379> LPUSH list redis
1
127.0.0.1:6379> LPUSH list mongodb
2
127.0.0.1:6379> LPUSH list rabbitmq
3
127.0.0.1:6379> LRANGE list 0 10
rabbitmq
mongodb
redis
127.0.0.1:6379>
List列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。
1.4.4 Set(集合)
Redis 的 Set 是 string 类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
sadd 命令
添加一个 string 元素到 key 对应的 set 集合中,成功返回 1,如果元素已经在集合中返回 0。
sadd key member
实例:
127.0.0.1:6379> SADD sets redis
1
127.0.0.1:6379> SADD sets mongodb
1
127.0.0.1:6379> SADD sets rabbitmq
1
127.0.0.1:6379> SADD sets rabbitmq
0
127.0.0.1:6379> SMEMBERS sets
mongodb
redis
rabbitmq
127.0.0.1:6379>
注意:以上实例中 rabbitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。
集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。
1.4.5 zset(sorted set:有序集合)
Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
zadd 命令:
添加元素到集合,元素在集合中存在则更新对应score
ZADD key score member
实例:
127.0.0.1:6379> ZADD zset 0 redis
1
127.0.0.1:6379> ZADD zset 0 mongodb
1
127.0.0.1:6379> ZADD zset 0 rabbitmq
1
127.0.0.1:6379> ZADD zset 0 rabbitmq
0
127.0.0.1:6379> ZRANGEBYSCORE zset 0 100
mongodb
rabbitmq
redis
127.0.0.1:6379>
各个数据类型应用场景:
类型 | 简介 | 特性 | 场景 |
---|---|---|---|
String(字符串) | 二进制安全 | 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M | — |
Hash(字典) | 键值对集合,即编程语言中的Map类型 | 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) | 存储、读取、修改用户属性 |
List(列表) | 链表(双向链表) | 增删快,提供了操作某一段元素的API | 1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列 |
Set(集合) | 哈希表实现,元素不重复 | 1、添加、删除,查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作 | 1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐 |
Sorted Set(有序集合) | 将Set中的元素增加一个权重参数score,元素按score有序排列 | 数据插入集合时,已经进行天然排序 | 1、排行榜 2、带权重的消息队列 |
2 Redis 命令
2.1 Redis 命令
Redis 命令用于在 redis 服务上执行操作。
要在 redis 服务上执行命令需要一个 redis 客户端。Redis 客户端在我们之前下载的的 redis 的安装包中。
语法
Redis 客户端的基本语法为:
redis-cli
实例:
以下实例讲解了如何启动 redis 客户端:
启动 redis 服务器,打开终端并输入命令 redis-cli,该命令会连接本地的 redis 服务。
注意: 要在 redis-cli 后面加上 --raw ,否则会中文乱码
[root@localhost ~]# cd /usr/local/redis/src
[root@localhost src]# ./redis-server ../redis.conf
[root@localhost src]# ./redis-cli --raw
127.0.0.1:6379> AUTH root
OK
127.0.0.1:6379> PING
PONG
127.0.0.1:6379>
在以上实例中我们连接到本地的 redis 服务并执行 PING 命令,该命令用于检测 redis 服务是否启动。
在远程服务上执行命令
如果需要在远程 redis 服务上执行命令,同样我们使用的也是 redis-cli --raw 命令
语法:
redis-cli --raw -h host -p port -a password
实例
以下实例演示了如何连接到主机为 127.0.0.1,端口为 6379 ,密码为 root 的 redis 服务上。
[root@localhost src]# ./redis-cli --raw -h 127.0.0.1 -p 6379 -a "root"
127.0.0.1:6379> PING
PONG
127.0.0.1:6379>
2.2 Redis 键(key)
2.2.1 Redis 键(key)
Redis 键命令用于管理 redis 的键。
Redis 键命令的基本语法如下:
redis 127.0.0.1:6379> COMMAND KEY_NAME
实例:
127.0.0.1:6379> SET name "张三"
OK
127.0.0.1:6379> GET name
张三
127.0.0.1:6379> DEL name
1
127.0.0.1:6379>
在以上实例中 DEL 是一个命令, runoobkey 是一个键。 如果键被删除成功,命令执行后输出 (integer) 1,否则将输出 (integer) 0
2.2.2 Redis keys 命令
序号 | 命令 | 描述 |
---|---|---|
1 | DEL key | 该命令用于在 key 存在时删除 key。 |
2 | DUMP key | 序列化给定 key ,并返回被序列化的值。 |
3 | EXISTS key | 检查给定 key 是否存在。 |
4 | EXPIRE key seconds | 为给定 key 设置过期时间,以秒计。 |
5 | EXPIREAT key timestamp | EXPIREAT 的作用和 EXPIRE 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。 |
6 | PEXPIRE key milliseconds | 设置 key 的过期时间以毫秒计。 |
7 | PEXPIREAT key milliseconds-timestamp | 设置 key 过期时间的时间戳(unix timestamp) 以毫秒计。 |
8 | KEYS pattern | 查找所有符合给定模式( pattern)的 key 。 |
9 | MOVE key db | 将当前数据库的 key 移动到给定的数据库 db 当中。 |
10 | PERSIST key | 移除 key 的过期时间,key 将持久保持。 |
11 | PTTL key | 以毫秒为单位返回 key 的剩余的过期时间。 |
12 | TTL key | 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。 |
13 | RANDOMKEY | 从当前数据库中随机返回一个 key 。 |
14 | RENAME key newkey | 修改 key 的名称 |
15 | RENAMENX key newkey | 仅当 newkey 不存在时,将 key 改名为 newkey 。 |
16 | SCAN cursor [MATCH pattern] [COUNT count] | 迭代数据库中的数据库键。 |
17 | TYPE key | 返回 key 所储存的值的类型。 |