Redis数据库
重要通知
。
Redis基本概况
Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。
资源文档
官网:https://redis.io/ 下载版本:http://download.redis.io/releases/ | https://github.com/tporadowski/redis/releases redis:https://www.npmjs.com/package/redis redis-node:https://www.npmjs.com/package/redis-node 教程:https://www.runoob.com/redis/redis-tutorial.html 命令列表:https://redis.io/commands
简介与核心思想
Redis,基于C语言实现的非关系型数据库。
MacOS安装
Linux安装
相关配置
#命令行交互
> get name;
(error) NOAUTH Authentication required.
#输入密码就OK
> auth PASSWORD;
#设置密码登录
>requirepass 123456 #redis.conf
#命令行交互
> config get requirepass #获取密码
> config set requirepass 123456 #设置密码
> auth PASSWORD #当有密码的时候登录时需要密码登录
> config set requirepass '' #取消密码
# ########################################
# #开机自启动, 配置或会出现无法启动的问题, 请注意
# ########################################
> put D:/devpt/project/server/admin/database/redis/configure/redis.service /lib/systemd/system/
# 开机启动
> systemctl enable redis;
# 关闭开机启动
> systemctl disable redis;
可视化管理工具
基础命令
redis-cli
配置redis.conf
# /usr/local/src/redis-5.0.0/redis.conf
# get /usr/local/src/redis-5.0.0/redis.conf D:/devpt/project/server/admin/database/redis
# put D:/devpt/project/server/admin/database/redis/
daemonize yes #守护进程, 默认no
port 6379
bind 0.0.0.0 #默认127.0.0.1
tcp-backlog 511
timeout 0 #当客户端闲置多长时间后关闭连接, 默认为0,表示关闭该功能
tcp-keepalive 300
daemonize yes
protected-mode yes #保护模式
logfile "" #日志文件路径及名称
rdbcompression yes #压缩RDB文件
字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(sorted set)之间的区别
字符串: 哈希:是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,每个 hash 可以存储 232 - 1 键值对(40多亿)
列表:是简单的字符串列表,按照插入顺序排序。一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
集合:Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
有序集合: 是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。但分数(score)却可以重复。
〔分布式架构〕
https://blog.csdn.net/qq_38191191/article/details/79879753
实现过期时间
client.expire('hello',10) //设置过期时间 client.exists('key') //判断键是否存在
Redis持久化
EDB机制(Redis DataBase): AOF机制(Append Only File): 混合机制
下载安装
wget http://download.redis.io/releases/redis-5.0.0.tar.gz tar xzf redis-5.0.0.tar.gz mv redis-5.0.0 /usr/local/src cd /usr/local/src/redis-5.0.0
这一步很重要, make完成后, 出现编译后的redis服务程序redis-server
还有用于测试的客户端程序redis-cli,两个程序位于安装目录 src 目录下
make
启动服务
cd /usr/local/src/redis-5.0.0/src ./redis-server ./redis-server --version | -v #查看版本
指定配置文件启动服务
./redis-server ../redis.conf Configuration loaded
打开客户端
./redis-cli
输入ping, 查看是否已连接
ping #出现PONG ./redis-cli --version | -v #查看版本
远程连接, 报错
查看进程
ps -ef | grep redis
停止指定进程
./redis-cli -p 16885 shutdown
关闭服务器进程
kill -9 [PID]
./redis-cli -h 127.0.0.1 -p 6379 ./redis-cli -h 106.12.193.24 -p 6379 ./redis-cli -h 106.12.193.24 -p 6379 -a 123456 Could not connect to Redis at 106.12.193.24:6379: Connection refused
基本数据类型
哈希〔Hash〕
# 哈希
> 每个 hash 可以存储 232 - 1 键值对(40多亿)
# 设置
> HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
# 获取
> HGETALL runoobkey
集合〔Set〕
# 集合
> Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据
> 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)
# 设置
> SADD runoobkey redis
> SADD runoobkey mongodb
> SADD runoobkey mysql
# 获取
> SMEMBERS runoobkey
键〔Key〕
# 键
# 设置
> set KEY VALUE
# 获取
> get KEY
# 删除
> delete KEY
列表〔List〕
# 列表
> 一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)
# 设置
> LPUSH runoobkey redis
> LPUSH runoobkey mongodb
> LPUSH runoobkey mysql
# 获取
> LRANGE runoobkey 0 10
有序集合〔sorted set〕
# 有序集合
> 是string类型元素的集合,且不允许重复的成员
> 与Set不同是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序
> 有序集合的成员是唯一的,但分数(score)却可以重复
> 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)
# 设置
> ZADD runoobkey 1 redis
> ZADD runoobkey 2 mongodb
> ZADD runoobkey 3 mysql
# 获取
> ZRANGE runoobkey 0 10 WITHSCORES
字符串〔String〕
# 设置
> SET runoobkey redis
# 获取
> GET runoobkey
node.js业务代码
init.js
const redis = require('redis');
module.exports = async function () {
console.log("|-----" + "Redis数据库" + "-----FILE_URL: " + __filename);
//业务模型
await init();
//selectSql();
}
async function init() {
//建立连接
let port = 6379;
// let host = "49.235.198.78"; //〔腾讯云〕1核2G-50G | 49.235.198.78
let options = {};
global.RedisClient = redis.createClient(port, host, options);
//连接异常
RedisClient.on("error", (err) => {
console.log(err);
});
// for (let i in RedisClient) {
// console.log(i);
// }
}
async function selectSql() {
//字符串
RedisClient.set("sex", '男', (err, res) => {
if (err) throw err;
console.log(res);
});
RedisClient.get("sex", (err, res) => {
if (err) throw err;
console.log(res);
});
}
exmaple.js
const uuid = require("uuid");
let v_id = uuid.v4().replace(/\-/g, "");
module.exports = function() {
//字符串
function stringData() {
RedisClient.set("name", '张三', (err, res)=> {
if (err) throw err;
console.log(res);
});
RedisClient.get("name", (err, res)=> {
if (err) throw err;
console.log(res);
});
}
//stringData();
//Hash
function hashData() {
RedisClient.hmset("school", { name: "北京大学", address: "北京市海淀区" }, (err, res)=> {
if (err) throw err;
console.log(res);
});
RedisClient.hgetall('school', (err, res)=> {
if (err) throw err;
console.log(res);
});
}
//hashData();
//列表
function listData() {
RedisClient.lpush('zooList', [0 , 1, 2, 3], (err, res)=> {
if (err) throw err;
console.log(res);
});
RedisClient.llen('zooList', (err, res)=> {
if (err) throw err;
console.log(res);
});
}
//listData();
//集合
function setData() {
RedisClient.sadd('zooSet', v_id, (err, res)=> {
if (err) throw err;
console.log(res);
});
RedisClient.sdiff('zooSet', (err, res)=> {
if (err) throw err;
console.log(res);
});
}
setData();
//有序集合
function sortSetData() {
//
}
//sortSetData();
}
核心知识与技巧
Sentinel模式
背景:主从模式的弊端就是不具备高可用性,当master挂掉以后,Redis将不能再对外提供写入操作,因此sentinel应运而生
# 环境
master节点 192.168.30.128 sentinel端口:26379
slave节点 192.168.30.129 sentinel端口:26379
slave节点 192.168.30.130 sentinel端口:26379
# 修改sentinel配置文件
https://blog.csdn.net/miss1181248983/article/details/90056960
sentinel.conf
发布订阅
分区
集群
Redis 3.0集群
数据备份与恢复
雪崩
穿透
击穿