# 1.Redis 简介

前言

Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key-value 数据库。

# 2.Redis 优势

  • 性能极高-Redis 能读的速度是 110000 次/s,写的速度是 81000 次/s。
  • 丰富的数据类型 -Redis 支持二进制的字符串、列表、哈希值、集合和有序集合等数据类型操作。
  • 原子性-Redis 的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。
  • 单个操作使原子性的。多个操作也支持事务,即原子性,通过 MULTI 和 EXEC 指令包起来。
  • 丰富的特性-Redis 还支持 发布/订阅,通知,key 过期等等特性。

# 3.安装

# 3.1 Window 下安装

redis-server.exe redis.windows.conf
redis-cli.exe -h 127.0.0.1 -p 6379
1
2

# 3.2 Mac 下安装

brew install redis
brew services start redis
redis-server /usr/local/etc/redis.conf
1
2
3

# 3.3 配置

CONFIG GET CONFIG_SETTING_NAME
CONFIG GET port
1
2

# 4.数据类型

  • 字符串
  • 哈希值
  • 链表
  • 集合
  • 有序列表

# 4.1 字符串

字符串是最基本的类型,一个 key 对应一个 value

# 4.1.1 SET 设置值

SET name zfpx
1

# 4.1.2 获取值

GET name
1

# 4.1.3 GETRANGE 获取子串

GETRANGE [key][start end]

getrange name 1 2 #"fp"
1

# 4.1.4 INCR INCRBY 递增

SET age 1
INCR age
INCRBY age 6
DECR age
DECRBY age 9
1
2
3
4
5

# 4.1.5 键

删除 key

DEL [key]

DEL user
1

判断一个 key 是否存在

EXISTS key

EXISTS user
1

设置过期时间

EXPIRE [key][seconds]

EXPIRE user 10
1

以秒为单位返回给定 key 的剩余生存时间

TTL [key]

TTL user
1

返回 key 所储存的值的类型

TYPE [key]

TYPE user
1

# 4.2 哈希值

哈希值是一个字符串类型的 key 和值的映射表,特别适合用于存储对象。

# 4.2.1 HSET HMSET 设置值

HSET person name //设置单个值
HMSET user name 'zfpx' age 9//设置多个值
1
2

# 4.2.2 HGET HGETALL 获取值

HGET user name //获取单个值
HMGET user name age//获取多个值
HGETALL user //获取所有值
1
2
3

# 4.2.3 HDEL key field 删除键

HDEL user name //删除单个值
HEDLALL user//删除所有值
1
2

# 4.2.4 HKEYS 获取所有的 KEYS

HKEYS user
1

# 4.3 列表

列表是简单的字符串列表,安装插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

# 4.3.1 LPUSH RPUSH 添加元素

返回列表的长度

LPUSH ids 2
LPUSH ids 1
RPUSH ids 3
RPUSH ids 4
RPUSH ids 5 6
1
2
3
4
5

# 4.3.2 LRANGE 查看元素

LRANGE ids 0 -2
LRANGE ids 0 -1
1
2

# 4.3.3 LPOP RPOP 弹出元素

查看并删除

LPOP ids
RPOP ids
1
2

# 4.3.4 LINDEX ids 1

通过索引获取列表中的元素

LINDEX ids 0
1

# 4.3.5 LLEN key

获取列表长度

LLEN ids
1

# 4.3.6 LREM key count value

移除列表元素

  • count >0:表示开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT.
  • count<0:从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
  • count=0:移除表中所有与 VALUE 相等的值。
LERM ids count value
lpush my 1
lpush my 2
lpush my 3
lpush my 3
lrange my 0 -1
lrem my  2 2
lrange my 0 -1
1
2
3
4
5
6
7
8

# 4.4 集合

集合是字符串类型的无序集合

# 4.4.1 SADD 添加

如果集合中已经存在指定的元素则返归 0;如果不存在则添加成功返回 1

SADD tags 1
SADD tags 2
SADD tags 3
SADD tags 4 5 6
SMEMBERS tags
1
2
3
4
5

# 4.4.2 SMEMBERS 查看集合

SMEMBERS tags
1

# 4.4.3 SCARD 获取集合元素个数

SCARD tags
1

# 4.4.4SREM 删除元素

SREM tags member
SREM tags 4
SMEMBERS tags
1
2
3

# 4.4.5 集合运算

SREM tags member
SREM tags 4
SMEMBERS tags
1
2
3

# 4.4.5 集合运算

SADD A 1 2 3
SADD B 2 3 4
SINTER A B //交集
SDIFF A B //差集
SUNION A B //并集
1
2
3
4
5

# 4.5 有序集合

有序集合和集合一样也是字符串的集合,而且不能重复 不同之处是每个集合都会关联一个 double 类型的分类,redis 可以通过这个分类来为集合中的元素进行从小到大排序,元素不能重复,但分数可以重复。

# 4.5.1 ZADD 添加元素

ZADD key score1 member1 [score2 member2]

ZADD levels 1 one
ZADD levels 2 two
ZADD levels 3 three
ZADD levels 4 four
1
2
3
4

# 4.5.2ZCARD 获取有序集合的成员数

ZCARD key
ZCARD levels
1
2

# 4.5.3 ZRANGE 查看有序集合

ZRANGE levels 0 -1 //按范围查看
ZRANGE levels 0 2 WITHSCORES //按范围查看,并显示分数
1
2

# 4.5.4ZREM 移除有序集合中的一个或多个成员

ZREM key member [member ...]

ZADD levels 1 one
ZADD levels 2 two
ZREM levels one
ZRANGE levels 0 -1
1
2
3
4

# 5.Node.js 中使用 redis

const redis = require('redis');
let client=redis.createClient(6379,'http://zhoubichuan.com');
client.on('error',function(error){
    console.log(error)
})
// 1.字符串类型
client.set('name','zfpx',redis.print)
client.get('name',redis.print)
//2.集合
client.hset('user','name','zfpx',redis.print)
client.hset('user','age','8',redis.print)
client.hget('user','age',redis.print)
client.hkeys('user',function(err,replies){
    replies.forEach(function(item,index,items){
        client.hget('user',item,redis.print)
    })
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 6.Redis 发布订阅

Redis 发布订阅是一种消息通信模式:发送者发送消息,订阅者接收消息,客户端可以订阅任意数量的频道。

SUBSCRIBE chat
PUBLISH chat zfpx
1
2
let client1=redis.createClient(6379,'127.0.0.1')
let client2=redis.createClient(6379,'127.0.0.1')
let count=0
client1.subscribe('food')
client1.subscribe('drink')
client1.on('message',fucntion(channel,message){
    console.log(channel,message)
    client1.unsubscribe('food')
})
client2.publish('food','面包')
client2.publish('drink','桔汁')
setTimeout(()=>{
    client2.publish('food','面包2')
    client2.publish('drink','桔汁2')
}2000)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 7.Redis 事务

Redis 事务可以一次执行多个命令

  • 多个命令可以在执行 EXEC 命令之前放入缓存队列
  • 收到 EXEC 命令后会将缓存队列执行
  • 在执行事务的过程中,新提交的并不能被插入到事务执行序列中
  • DISCARD 可以取消事务,放弃执行事务块内的所有命令
MULTI
SET account1 1
SET account2 3
EXEC
GET account1
GET account2
1
2
3
4
5
6
  • 单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的
  • 事务可以理解为一个大包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做
let redis = require("redis")
let client = redis.createClient(639, "127.0.0.1")
client
  .multi()
  .hset("user2", "zfpx2")
  .hset("user2", "age2", "92")
  .exec(redis.print)
1
2
3
4
5
6
7

# 8.备份与恢复

# 8.1 备份

SAVE
1

该命令将在 redis 安装目录中创建 dump.rdb 文件

# 8.2 恢复

将备份文件(dump.rdb)移动到 redis 安装目录并启动服务

CONFIG GET dir
BGSAVE
1
2

# 9.安全

可以通过 redis 的配置文件设置密码参数,这样客户端连接到 redis 服务就需要密码验证,这样可以让你的 redis 服务更安全。

CONFIG get requirepass
CONFIG ser requierpass 'zfpx'
CONFIG get requirepass
AUTH zfpx
CONFIG get requirepass
1
2
3
4
5