# 1.Redis 简介
前言
Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key-value 数据库。
# 2.Redis 优势
- 性能极高-Redis 能读的速度是 110000 次/s,写的速度是 81000 次/s。
- 丰富的数据类型 -Redis 支持二进制的字符串、列表、哈希值、集合和有序集合等数据类型操作。
- 原子性-Redis 的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。
- 单个操作使原子性的。多个操作也支持事务,即原子性,通过 MULTI 和 EXEC 指令包起来。
- 丰富的特性-Redis 还支持 发布/订阅,通知,key 过期等等特性。
# 3.安装
# 3.1 Window 下安装
- redis-windows (opens new window)
- redis 服务端下载 (opens new window)
- redis 客户端下载 (opens new window)
- redis 官网 (opens new window)
- redis 中文网 (opens new window) 进入数据库文件夹打开 cmd
redis-server.exe redis.windows.conf
redis-cli.exe -h 127.0.0.1 -p 6379
2
# 3.2 Mac 下安装
brew install redis
brew services start redis
redis-server /usr/local/etc/redis.conf
2
3
# 3.3 配置
CONFIG GET CONFIG_SETTING_NAME
CONFIG GET port
2
# 4.数据类型
- 字符串
- 哈希值
- 链表
- 集合
- 有序列表
# 4.1 字符串
字符串是最基本的类型,一个 key 对应一个 value
# 4.1.1 SET 设置值
SET name zfpx
# 4.1.2 获取值
GET name
# 4.1.3 GETRANGE 获取子串
GETRANGE [key][start end]
getrange name 1 2 #"fp"
# 4.1.4 INCR INCRBY 递增
SET age 1
INCR age
INCRBY age 6
DECR age
DECRBY age 9
2
3
4
5
# 4.1.5 键
删除 key
DEL [key]
DEL user
判断一个 key 是否存在
EXISTS key
EXISTS user
设置过期时间
EXPIRE [key][seconds]
EXPIRE user 10
以秒为单位返回给定 key 的剩余生存时间
TTL [key]
TTL user
返回 key 所储存的值的类型
TYPE [key]
TYPE user
# 4.2 哈希值
哈希值是一个字符串类型的 key 和值的映射表,特别适合用于存储对象。
# 4.2.1 HSET HMSET 设置值
HSET person name //设置单个值
HMSET user name 'zfpx' age 9//设置多个值
2
# 4.2.2 HGET HGETALL 获取值
HGET user name //获取单个值
HMGET user name age//获取多个值
HGETALL user //获取所有值
2
3
# 4.2.3 HDEL key field 删除键
HDEL user name //删除单个值
HEDLALL user//删除所有值
2
# 4.2.4 HKEYS 获取所有的 KEYS
HKEYS user
# 4.3 列表
列表是简单的字符串列表,安装插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
# 4.3.1 LPUSH RPUSH 添加元素
返回列表的长度
LPUSH ids 2
LPUSH ids 1
RPUSH ids 3
RPUSH ids 4
RPUSH ids 5 6
2
3
4
5
# 4.3.2 LRANGE 查看元素
LRANGE ids 0 -2
LRANGE ids 0 -1
2
# 4.3.3 LPOP RPOP 弹出元素
查看并删除
LPOP ids
RPOP ids
2
# 4.3.4 LINDEX ids 1
通过索引获取列表中的元素
LINDEX ids 0
# 4.3.5 LLEN key
获取列表长度
LLEN ids
# 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
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
2
3
4
5
# 4.4.2 SMEMBERS 查看集合
SMEMBERS tags
# 4.4.3 SCARD 获取集合元素个数
SCARD tags
# 4.4.4SREM 删除元素
SREM tags member
SREM tags 4
SMEMBERS tags
2
3
# 4.4.5 集合运算
SREM tags member
SREM tags 4
SMEMBERS tags
2
3
# 4.4.5 集合运算
SADD A 1 2 3
SADD B 2 3 4
SINTER A B //交集
SDIFF A B //差集
SUNION A B //并集
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
2
3
4
# 4.5.2ZCARD 获取有序集合的成员数
ZCARD key
ZCARD levels
2
# 4.5.3 ZRANGE 查看有序集合
ZRANGE levels 0 -1 //按范围查看
ZRANGE levels 0 2 WITHSCORES //按范围查看,并显示分数
2
# 4.5.4ZREM 移除有序集合中的一个或多个成员
ZREM key member [member ...]
ZADD levels 1 one
ZADD levels 2 two
ZREM levels one
ZRANGE levels 0 -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)
})
})
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 6.Redis 发布订阅
Redis 发布订阅是一种消息通信模式:发送者发送消息,订阅者接收消息,客户端可以订阅任意数量的频道。
SUBSCRIBE chat
PUBLISH chat zfpx
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)
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
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)
2
3
4
5
6
7
# 8.备份与恢复
# 8.1 备份
SAVE
该命令将在 redis 安装目录中创建 dump.rdb 文件
# 8.2 恢复
将备份文件(dump.rdb)移动到 redis 安装目录并启动服务
CONFIG GET dir
BGSAVE
2
# 9.安全
可以通过 redis 的配置文件设置密码参数,这样客户端连接到 redis 服务就需要密码验证,这样可以让你的 redis 服务更安全。
CONFIG get requirepass
CONFIG ser requierpass 'zfpx'
CONFIG get requirepass
AUTH zfpx
CONFIG get requirepass
2
3
4
5
2.基础概念 →