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集群


数据备份与恢复


雪崩


穿透


击穿


工程化建设方案

性能调优最佳实践

生态系统

体系源码

Last Updated:
Contributors: 709992523